#! /usr/bin/awk -f
#
# Parse the DOSEmu configuration file.
#

BEGIN { 
  SEPARATORS="[ \t]*"
}

function handle_multiline (type) {
  get_line()

  for (i = 2; i < num_fields && fields[i] != "}";) {
    write_entry(type tolower(fields[i++]), fields[i++])
  }

  next
}

tolower($1) == "debug" {
  handle_multiline("debug_")
  next
}

tolower($1) == "dosbanner" {
  get_line()
  write_entry("dosbanner", fields[1])
  next
}

tolower($1) == "timint" {
  get_line()
  write_entry("timint", fields[1])
  next
}

tolower($1) == "keyboard" {
  handle_multiline("keyboard_")
  next
}

tolower($1) == "serial" {
  get_line()

  ++serial_count

  for (i = 2; i < num_fields && fields[i] != "}"; i++) {
    test = tolower(fields[i])

    if (test == "com") { 
      write_entry("serial_com_" serial_count, fields[++i])
      continue
    }
    if (test == "device") { 
      write_entry("serial_device_" serial_count, fields[++i])
      continue
    }
    if (test == "base") { 
      write_entry("serial_base_" serial_count, fields[++i])
      continue
    }
    if (test == "irq") { 
      write_entry("serial_irq_" serial_count, fields[++i])
      continue
    }
    if (test == "mouse") {
      write_entry("serial_mouse_" serial_count, "on")
      continue
    }
  }  

  write_entry("serial_num", serial_count)

  next;
}

tolower($1) == "mouse" {
  get_line()

  for (i = 2; i < num_fields && fields[i] != "}"; i++) {
    test = tolower(fields[i])

    if (test == "microsoft" || test == "logitech" || test == "mmseries" ||
        test == "mouseman" || test == "hitachi" || test == "mousesystems" ||
        test == "busmouse" || test == "ps2") {
      write_entry("mouse_type", test)
      continue
    }
    if (test == "device") {
      write_entry("mouse_device", fields[++i])
      continue
    }
    if (test == "internaldriver") {
      write_entry( "mouse_internaldriver", "on")
      continue
    }
    if (test == "emulate3buttons") {
      write_entry( "mouse_emulate3buttons", "on")
      continue
    }
    if (test == "cleardtr") {
      write_entry( "mouse_cleardtr", "on")
      continue
    }
  }

  next;
}

tolower($1) == "ttylocks" {
  get_line()

  for (i = 2; i < num_fields && fields[i] != "}"; i++) {
    test = tolower(fields[i])

    if (test == "directory" ) {
      write_entry( "ttylocks_directory", fields[++i])
      continue;
    }
    if (test == "namestub" ) {
      write_entry( "ttylocks_namestub", fields[++i])
      continue;
    }
    if (test == "binary" ) {
      write_entry( "ttylocks_binary", "on")
      continue;
    }

  }
  next;
}

tolower($1) == "hogthreshold" {
  get_line()
  write_entry( "hogthreshold", fields[1])
  next
}

tolower($1) == "ipxsupport" {
  get_line()
  write_entry( "ipxsupport", fields[1])
  next
}

tolower($1) == "pktdriver" {
  get_line()
  write_entry( "pktdriver", fields[1])
  next
}

tolower($1) == "terminal" {
  handle_multiline("terminal_")
  next
}

tolower($1) == "x" {
  get_line()

  for (i = 2; i < num_fields && fields[i] != "}"; i++) {
    test = tolower(fields[i])
    
    if (test == "updatefreq") {
      write_entry("x_updatefreq", fields[++i])
      continue
    }
    if (test == "display") {
      write_entry( "x_display", fields[++i])
      continue
    }
    if (test == "title") {
      write_entry( "x_title", fields[++i])
      continue;
    }
    if (test == "icon_name") {
      write_entry( "x_icon_name", fields[++i])
      continue;
    }
    if (test == "font") {
      write_entry( "x_font", fields[++i])
      continue;
    }
    if (test == "blinkrate") {
      write_entry( "x_blinkrate", fields[++i])
      continue;
    }
    if (test == "keycode") {
      write_entry( "x_keycode", "on")
      continue;
    }
    if (test == "sharecmp") {
      write_entry( "x_sharecmp", "on")
      continue;
    }
  }
  next;
}

tolower($1) == "video" {
  get_line()

  for (i = 2; i < num_fields && fields[i] != "}"; i++) {
    test = tolower(fields[i])
    
    if (test == "vga" || test == "cga" || test == "ega" || test == "mda") {
      write_entry("video_type", test)
      continue
    }
    if (test == "console") {
      write_entry( "video_console", "on")
      continue
    }  
    if (test == "graphics") {
      write_entry( "video_graphics", "on")
      continue
    }
    if (test == "vbios_post") {
      write_entry( "video_vbios_post", "on")
      continue
    }
    if (test == "dualmon") {
      write_entry( "video_dualmon", "on")
      continue
    }
    if (test == "fullrestore") {
      write_entry( "video_restore", "full")
      continue
    }
    if (test == "partialrestore") {
      write_entry( "video_restore", "partial")
      continue
    }
    if (test == "chipset") {
      write_entry( "video_chipset", fields[++i])
      continue
    }
    if (test == "vbios_seg") {
      write_entry( "video_vbios_seg", fields[++i])
      continue
    }
    if (test == "vbios_size") {
      write_entry( "video_vbios_size", fields[++i])
      continue
    }
    if (test == "vbios_copy") {
      write_entry( "video_vbios_copy", "on")
      continue
    }
    if (test == "vbios_mmap") {
      write_entry( "video_vbios_mmap", "on")
      continue
    }
    if (test == "vbios_file") {
      write_entry( "video_vbios_file", fields[++i])
      continue
    }
  }
  next;
}

tolower($1) == "ports" {
  get_line()

#  for (i = 2; i < num_fields && fields[i] != "}"; i++) {
#    test = tolower(fields[i])
#  
#    if (test == "range") {
#      write_entry( "ports_range_" ++range_count ,fields[++i] "-" fields[++i])
#      continue
#    }
#    if (test == "ormask" || test == "andmask" || test = "device" ) {
#      # Fake it ..
#      i++
#      continue
#    }
#    if (test == "rdonly" || test == "wronly" || test == "rdwr" || 
#        test == "fast" ) {
#      # Fake it ..
#      continue
#    }
#    # Catchall ...
#    write_entry( "ports_" ++port_count, test)
#  }
#  write_entry( "ports_range_num", range_count)
#  write_entry( "ports_num", port_count)
#  next


  # ***HACK*** Make it easier to handle ports
  port_data = ""
  for (i = 2; i < num_fields && fields[i] != "}"; i++) {
    port_data = port_data " " fields[i]
  }
  write_entry( "ports_" ++port_count, port_data);
  write_entry( "ports_num", port_count);
  next
}

tolower($1) == "mathco" {
  get_line()
  write_entry( "mathco", fields[1])
  next
}

tolower($1) == "cpu" {
  get_line()
  write_entry( "cpu", fields[1])
  next
}

tolower($1) ~ /^boot.$/ {
  get_line()
  write_entry( "boot", substr (fields[0], 5))
  next
}

tolower($1) == "umb_max" {
  get_line()
  write_entry( "umb_max", fields[1])
  next
}

tolower($1) == "dpmi" {
  get_line()
  write_entry( "dpmi", fields[1])
  next
}

tolower($1) == "xms" {
  get_line()
  write_entry( "xms", fields[1])
  next
}

tolower($1) == "ems" {
  if ( $2 == "{" ) {
    # Is the multiline version - all the markers contain 'ems_' already ...
    handle_multiline("");
  } else {
    get_line()
    write_entry( "ems_size", fields[1])
  }
  next
}

tolower($1) == "hardware_ram" {
  get_line()

#  for (i = 2; i < num_fields && fields[i] != "}"; i++) {
#    test = tolower(fields[i])
#  
#    if (test == "range") {
#      write_entry( "hardware_ram_range_ " ++ram_range_count , fields[++i] "-" fields[++i])
#      continue
#    }
#    # Catchall ...
#    write_entry( "hardware_ram_" ++ram_count , test)
#  }
#  write_entry( "hardware_ram_num", ram_count)
#  write_entry( "hardware_ram_range_num", ram_range_count)

  # ***HACK*** Make it easier to handle hardware_ram
  hardware_ram_data = ""
  for (i = 2; i < num_fields && fields[i] != "}"; i++) {
    hardware_ram_data = hardware_ram_data " " fields[i]
  }
  write_entry( "hardware_ram_" ++hardware_ram_count, hardware_ram_data);
  write_entry( "hardware_ram_num", hardware_ram_count);

  next;
}

tolower($1) == "dosmem" {
  get_line()
  write_entry( "dosmem", fields[1])
  next
}

tolower($1) == "sillyint" {
#  if ( $2 == "{" ) {
#    # Is a multiline variant
#    get_line()
#
#    for (i = 2; i < num_fields && fields[i] != "}"; i++) {
#      test = tolower(fields[i])
#  
#      if (test == "range") {
#        write_entry( "sillyint_range_ " ++sillyint_range_count , fields[++i] "-" fields[++i])
#        continue
#      }
#      if (test == "use_sigio") {
#        write_entry( "sillyint_sigio", "1")
#        continue
#      }
#      # Catchall ...
#      write_entry( "sillyint_irq" ++sillyint_count , test)
#    }
#    write_entry( "sillyint_irq_num", sillyint_count)
#    write_entry( "sillyint_range_num", sillyint_range_count)
#  } else {
#    get_line()
#
#    write_entry( "sillyint_irq_1", fields[1])
#    write_entry( "sillyint_range_num", "0")
#    write_entry( "sillyint_irq_num", "1")
#  }
#  next;

  # ***HACK***
  if ($2 == "{") {
    get_line()
    int_data = ""
    
    for (i = 2; i < num_fields && fields[i] != "}"; i++) {
      int_data = int_data " " fields[i]
    }

    write_entry( "sillyint_" ++int_count, int_data)
  } else {
    get_line()
    write_entry( "sillyint_" ++int_count, fields[1])
  }  
  next
}

tolower($1) == "speaker" {
  get_line()
  write_entry( "speaker", fields[1])
  next
}

tolower($1) == "disk" {
  get_line()

  disk_count ++

  for (i = 2; i < num_fields && fields[i] != "}"; i++) {
    test = tolower(fields[i])
  
    if (test == "image" || test == "partition" || test == "bootfile" ||
        test == "wholedisk" ) {
      write_entry( "disk_" test "_" disk_count, fields[++i])
      continue
    }
    if (test == "readonly" ) {
      write_entry( "disk_readonly_" disk_count, "on")
      continue
    }
  }
  write_entry( "disk_num", disk_count)
  next;
}

tolower($1) == "bootdisk" || tolower($1) == "floppy" {
  get_line()

  name = tolower($1)

  if (tolower($1) == "bootdisk") {
    sufffix = ""
  } else {
    suffix = "_" ++floppy_count
  }

  for (i = 2; i < num_fields && fields[i] != "}"; i++) {
    test = tolower(fields[i])
  
    if (test == "heads" || test == "sectors" || test == "tracks" || 
        test == "file" || test == "device" ) {
      write_entry( name "_" test suffix , fields[++i])
      if (test == "file") {
        write_entry( name "_" real suffix , "off")
      } else if (file == "device") {
        write_entry( name "_" real suffix, "on")
      }     
      continue
    }
    if (test == "threeinch") {
      write_entry( name "_size" suffix, "threeinch")
      continue
    }
    if (test == "fiveinch") {
      write_entry( name "_size" suffix, "fiveinch")
      continue
    }
  }

  if (name == "floppy") {
    write_entry( "floppy_num", floppy_count)
  }

  next;
}

tolower($1) == "emusys" {
  get_line()
  write_entry( "emusys", fields[1])
  next
}

tolower($1) == "fastfloppy" {
  get_line()
  write_entry( "fastfloppy", fields[1])
  next
}

tolower($1) == "printer" {
  get_line()

  printer_count ++

  for (i = 2; i < num_fields && fields[i] != "}"; i++) {
    test = tolower(fields[i])

    if (test == "options" || test == "command" || test == "file" ) {
      write_entry( "printer_" test "_" printer_count , fields[++i])
      continue
    }
    if (test == "base" || test == "timeout" ) {
      write_entry( "printer_" test "_" printer_count , fields[++i])
      continue
    }
  }

  write_entry( "printer_num", printer_count)
  next;
}

tolower($1) == "sound_emu" {
  handle_multiline("sound_emu_")
  next
}

tolower($1) == "config" {
  handle_multiline("config_")
  next
}

