Commit b55e819b authored by dickelbeck's avatar dickelbeck
Browse files

more specctra dsn import/export work

parent 745c9d21
Loading
Loading
Loading
Loading
+424 −406
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@

#include "fctsys.h"
#include "pcbnew.h"
#include "common.h"
//#include "common.h"

namespace DSN {

@@ -43,7 +43,8 @@ namespace DSN {
 */ 
enum DSN_T {
    
    // the first few are special
    // the first few are special (the uppercase ones)
    T_QUOTE_DEF = -9,
    T_DASH = -8,
    T_SYMBOL = -7,
    T_NUMBER = -6,
@@ -424,365 +425,366 @@ struct KEYWORD
};


#define TOKDEF(x)    { #x, T_##x },
#define TOKDEF(x)    { #x, T_##x }

// This MUST be sorted alphabetically, and also so MUST enum DSN_T {} be alphabetized.
// These MUST all be lower case because of the call to strlower() in findToken(). 
// These MUST all be lower case because of the conversion to lowercase in findToken(). 
const static KEYWORD tokens[] = {
    TOKDEF(absolute)
    TOKDEF(added)
    TOKDEF(add_group)
    TOKDEF(add_pins)
    TOKDEF(allow_antenna)
    TOKDEF(allow_redundant_wiring)
    TOKDEF(amp)
    TOKDEF(ancestor)
    TOKDEF(antipad)
    TOKDEF(aperture_type)
    TOKDEF(array)
    TOKDEF(attach)
    TOKDEF(attr)
    TOKDEF(average_pair_length)
    TOKDEF(base_design)
    TOKDEF(bbv_ctr2ctr)
    TOKDEF(bond)
    TOKDEF(bottom)
    TOKDEF(bottom_layer_sel)
    TOKDEF(boundary)
    TOKDEF(brickpat)
    TOKDEF(bundle)
    TOKDEF(bypass)
    TOKDEF(capacitance_resolution)
    TOKDEF(capacitor)
    TOKDEF(case_sensitive)
    TOKDEF(cct1)
    TOKDEF(cct1a)
    TOKDEF(center_center)
    TOKDEF(checking_trim_by_pin)
    TOKDEF(circ)
    TOKDEF(circle)
    TOKDEF(circuit)
    TOKDEF(class)
    TOKDEF(class_class)
    TOKDEF(classes)
    TOKDEF(clear)
    TOKDEF(clearance)
    TOKDEF(cluster)
    TOKDEF(cm)
    TOKDEF(color)
    TOKDEF(colors)
    TOKDEF(comment)
    TOKDEF(comp)
    TOKDEF(comp_edge_center)
    TOKDEF(component)
    TOKDEF(comp_order)
    TOKDEF(composite)
    TOKDEF(conductance_resolution)
    TOKDEF(conductor)
    TOKDEF(conflict)
    TOKDEF(connect)
    TOKDEF(constant)
    TOKDEF(contact)
    TOKDEF(control)
    TOKDEF(corner)
    TOKDEF(corners)
    TOKDEF(cost)
    TOKDEF(created_time)
    TOKDEF(cross)
    TOKDEF(crosstalk_model)
    TOKDEF(current_resolution)
    TOKDEF(deleted_keepout)
    TOKDEF(delete_pins)
    TOKDEF(delta)
    TOKDEF(direction)
    TOKDEF(directory)
    TOKDEF(effective_via_length)
    TOKDEF(exclude)
    TOKDEF(expose)
    TOKDEF(extra_image_directory)
    TOKDEF(family)
    TOKDEF(family_family)
    TOKDEF(family_family_spacing)
    TOKDEF(farad)
    TOKDEF(file)
    TOKDEF(fit)
    TOKDEF(fix)
    TOKDEF(flip_style)
    TOKDEF(floor_plan)
    TOKDEF(footprint)
    TOKDEF(forbidden)
    TOKDEF(force_to_terminal_point)
    TOKDEF(forgotten)
    TOKDEF(fromto)
    TOKDEF(front)
    TOKDEF(front_only)
    TOKDEF(gap)
    TOKDEF(gates)
    TOKDEF(global)
    TOKDEF(grid)
    TOKDEF(group)
    TOKDEF(group_set)
    TOKDEF(guide)
    TOKDEF(hard)
    TOKDEF(height)
    TOKDEF(history)
    TOKDEF(horizontal)
    TOKDEF(host_cad)
    TOKDEF(host_version)
    TOKDEF(image)
    TOKDEF(image_image)
    TOKDEF(image_image_spacing)
    TOKDEF(image_outline_clearance)
    TOKDEF(image_type)
    TOKDEF(inch)
    TOKDEF(include)
    TOKDEF(include_pins_in_crosstalk)
    TOKDEF(inductance_resolution)
    TOKDEF(insert)
    TOKDEF(instcnfg)
    TOKDEF(inter_layer_clearance)
    TOKDEF(jumper)
    TOKDEF(junction_type)
    TOKDEF(keepout)
    TOKDEF(kg)
    TOKDEF(kohm)
    TOKDEF(large)
    TOKDEF(large_large)
    TOKDEF(layer)
    TOKDEF(layer_depth)
    TOKDEF(layer_noise_weight)
    TOKDEF(layer_pair)
    TOKDEF(layer_rule)
    TOKDEF(length)
    TOKDEF(length_amplitude)
    TOKDEF(length_factor)
    TOKDEF(length_gap)
    TOKDEF(library)
    TOKDEF(library_out)
    TOKDEF(limit)
    TOKDEF(limit_bends)
    TOKDEF(limit_crossing)
    TOKDEF(limit_vias)
    TOKDEF(limit_way)
    TOKDEF(linear)
    TOKDEF(linear_interpolation)
    TOKDEF(load)
    TOKDEF(lock_type)
    TOKDEF(logical_part)
    TOKDEF(logical_part_mapping)
    TOKDEF(match_fromto_delay)
    TOKDEF(match_fromto_length)
    TOKDEF(match_group_delay)
    TOKDEF(match_group_length)
    TOKDEF(match_net_delay)
    TOKDEF(match_net_length)
    TOKDEF(max_delay)
    TOKDEF(max_len)
    TOKDEF(max_length)
    TOKDEF(max_noise)
    TOKDEF(max_restricted_layer_length)
    TOKDEF(max_stagger)
    TOKDEF(max_stub)
    TOKDEF(max_total_delay)
    TOKDEF(max_total_length)
    TOKDEF(max_total_vias)
    TOKDEF(mhenry)
    TOKDEF(mho)
    TOKDEF(microvia)
    TOKDEF(mid_driven)
    TOKDEF(mil)
    TOKDEF(min_gap)
    TOKDEF(mirror)
    TOKDEF(mirror_first)
    TOKDEF(mm)
    TOKDEF(net)
    TOKDEF(net_number)
    TOKDEF(net_pin_changes)
    TOKDEF(nets)
    TOKDEF(network)
    TOKDEF(network_out)
    TOKDEF(no)
    TOKDEF(noexpose)
    TOKDEF(noise_accumulation)
    TOKDEF(noise_calculation)
    TOKDEF(object_type)
    TOKDEF(off)
    TOKDEF(off_grid)
    TOKDEF(offset)
    TOKDEF(on)
    TOKDEF(open)
    TOKDEF(opposite_side)
    TOKDEF(order)
    TOKDEF(outline)
    TOKDEF(overlap)
    TOKDEF(pad)
    TOKDEF(pad_pad)
    TOKDEF(padstack)
    TOKDEF(pair)
    TOKDEF(parallel)
    TOKDEF(parallel_noise)
    TOKDEF(parallel_segment)
    TOKDEF(parser)
    TOKDEF(part_library)
    TOKDEF(path)
    TOKDEF(pcb)
    TOKDEF(permit_orient)
    TOKDEF(permit_side)
    TOKDEF(physical)
    TOKDEF(physical_part_mapping)
    TOKDEF(piggyback)
    TOKDEF(pin)
    TOKDEF(pin_allow)
    TOKDEF(pin_cap_via)
    TOKDEF(pins)
    TOKDEF(pintype)
    TOKDEF(pin_via_cap)
    TOKDEF(pin_width_taper)
    TOKDEF(place)
    TOKDEF(place_boundary)
    TOKDEF(place_control)
    TOKDEF(placement)
    TOKDEF(place_rule)
    TOKDEF(plan)
    TOKDEF(plane)
    TOKDEF(PN)
    TOKDEF(point)
    TOKDEF(polygon)
    TOKDEF(position)
    TOKDEF(power)
    TOKDEF(power_dissipation)
    TOKDEF(power_fanout)
    TOKDEF(prefix)
    TOKDEF(primary)
    TOKDEF(priority)
    TOKDEF(property)
    TOKDEF(qarc)
    TOKDEF(quarter)
    TOKDEF(radius)
    TOKDEF(ratio)
    TOKDEF(ratio_tolerance)
    TOKDEF(rect)
    TOKDEF(reduced)
    TOKDEF(region)
    TOKDEF(region_class)
    TOKDEF(region_class_class)
    TOKDEF(region_net)
    TOKDEF(relative_delay)
    TOKDEF(relative_group_delay)
    TOKDEF(relative_group_length)
    TOKDEF(relative_length)
    TOKDEF(reorder)
    TOKDEF(reroute_order_viols)
    TOKDEF(resistance_resolution)
    TOKDEF(resolution)
    TOKDEF(restricted_layer_length_factor)
    TOKDEF(room)
    TOKDEF(rotate)
    TOKDEF(rotate_first)
    TOKDEF(round)
    TOKDEF(roundoff_rotation)
    TOKDEF(route)
    TOKDEF(routes)
    TOKDEF(routes_include)
    TOKDEF(route_to_fanout_only)
    TOKDEF(rule)
    TOKDEF(same_net_checking)
    TOKDEF(sample_window)
    TOKDEF(saturation_length)
    TOKDEF(sec)
    TOKDEF(secondary)
    TOKDEF(self)
    TOKDEF(sequence_number)
    TOKDEF(session)
    TOKDEF(set_color)
    TOKDEF(set_pattern)
    TOKDEF(shape)
    TOKDEF(shield)
    TOKDEF(shield_gap)
    TOKDEF(shield_loop)
    TOKDEF(shield_tie_down_interval)
    TOKDEF(shield_width)
    TOKDEF(side)
    TOKDEF(signal)
    TOKDEF(site)
    TOKDEF(smd)
    TOKDEF(snap_angle)
    TOKDEF(source)
    TOKDEF(space_in_quoted_tokens)
    TOKDEF(spacing)
    TOKDEF(spare)
    TOKDEF(spiral_via)
    TOKDEF(stack_via)
    TOKDEF(stack_via_depth)
    TOKDEF(standard)
    TOKDEF(starburst)
    TOKDEF(status)
    TOKDEF(string_quote)
    TOKDEF(structure)
    TOKDEF(structure_out)
    TOKDEF(subgates)
    TOKDEF(such)
    TOKDEF(suffix)
    TOKDEF(super_placement)
    TOKDEF(supply)
    TOKDEF(supply_pin)
    TOKDEF(swapping)
    TOKDEF(switch_window)
    TOKDEF(system)
    TOKDEF(tandem_noise)
    TOKDEF(tandem_segment)
    TOKDEF(tandem_shield_overhang)
    TOKDEF(terminal)
    TOKDEF(terminator)
    TOKDEF(term_only)
    TOKDEF(test)
    TOKDEF(testpoint)
    TOKDEF(test_points)
    TOKDEF(threshold)
    TOKDEF(time_length_factor)
    TOKDEF(time_resolution)
    TOKDEF(tjunction)
    TOKDEF(tolerance)
    TOKDEF(top)
    TOKDEF(topology)
    TOKDEF(total)
    TOKDEF(track_id)
    TOKDEF(turret)
    TOKDEF(type)
    TOKDEF(um)
    TOKDEF(unassigned)
    TOKDEF(unconnects)
    TOKDEF(unit)
    TOKDEF(up)
    TOKDEF(use_array)
    TOKDEF(use_layer)
    TOKDEF(use_net)
    TOKDEF(use_via)
    TOKDEF(value)
    TOKDEF(via)
    TOKDEF(via_array_template)
    TOKDEF(via_at_smd)
    TOKDEF(via_keepout)
    TOKDEF(via_number)
    TOKDEF(via_rotate_first)
    TOKDEF(via_site)
    TOKDEF(via_size)
    TOKDEF(virtual_pin)
    TOKDEF(volt)
    TOKDEF(voltage_resolution)
    TOKDEF(was_is)
    TOKDEF(way)
    TOKDEF(weight)
    TOKDEF(width)
    TOKDEF(window)
    TOKDEF(wire)
    TOKDEF(wires)
    TOKDEF(wires_include)
    TOKDEF(wiring)
    TOKDEF(write_resolution)
    TOKDEF(x)
    TOKDEF(absolute),
    TOKDEF(added),
    TOKDEF(add_group),
    TOKDEF(add_pins),
    TOKDEF(allow_antenna),
    TOKDEF(allow_redundant_wiring),
    TOKDEF(amp),
    TOKDEF(ancestor),
    TOKDEF(antipad),
    TOKDEF(aperture_type),
    TOKDEF(array),
    TOKDEF(attach),
    TOKDEF(attr),
    TOKDEF(average_pair_length),
    TOKDEF(base_design),
    TOKDEF(bbv_ctr2ctr),
    TOKDEF(bond),
    TOKDEF(bottom),
    TOKDEF(bottom_layer_sel),
    TOKDEF(boundary),
    TOKDEF(brickpat),
    TOKDEF(bundle),
    TOKDEF(bypass),
    TOKDEF(capacitance_resolution),
    TOKDEF(capacitor),
    TOKDEF(case_sensitive),
    TOKDEF(cct1),
    TOKDEF(cct1a),
    TOKDEF(center_center),
    TOKDEF(checking_trim_by_pin),
    TOKDEF(circ),
    TOKDEF(circle),
    TOKDEF(circuit),
    TOKDEF(class),
    TOKDEF(class_class),
    TOKDEF(classes),
    TOKDEF(clear),
    TOKDEF(clearance),
    TOKDEF(cluster),
    TOKDEF(cm),
    TOKDEF(color),
    TOKDEF(colors),
    TOKDEF(comment),
    TOKDEF(comp),
    TOKDEF(comp_edge_center),
    TOKDEF(component),
    TOKDEF(comp_order),
    TOKDEF(composite),
    TOKDEF(conductance_resolution),
    TOKDEF(conductor),
    TOKDEF(conflict),
    TOKDEF(connect),
    TOKDEF(constant),
    TOKDEF(contact),
    TOKDEF(control),
    TOKDEF(corner),
    TOKDEF(corners),
    TOKDEF(cost),
    TOKDEF(created_time),
    TOKDEF(cross),
    TOKDEF(crosstalk_model),
    TOKDEF(current_resolution),
    TOKDEF(deleted_keepout),
    TOKDEF(delete_pins),
    TOKDEF(delta),
    TOKDEF(direction),
    TOKDEF(directory),
    TOKDEF(effective_via_length),
    TOKDEF(exclude),
    TOKDEF(expose),
    TOKDEF(extra_image_directory),
    TOKDEF(family),
    TOKDEF(family_family),
    TOKDEF(family_family_spacing),
    TOKDEF(farad),
    TOKDEF(file),
    TOKDEF(fit),
    TOKDEF(fix),
    TOKDEF(flip_style),
    TOKDEF(floor_plan),
    TOKDEF(footprint),
    TOKDEF(forbidden),
    TOKDEF(force_to_terminal_point),
    TOKDEF(forgotten),
    TOKDEF(fromto),
    TOKDEF(front),
    TOKDEF(front_only),
    TOKDEF(gap),
    TOKDEF(gates),
    TOKDEF(global),
    TOKDEF(grid),
    TOKDEF(group),
    TOKDEF(group_set),
    TOKDEF(guide),
    TOKDEF(hard),
    TOKDEF(height),
    TOKDEF(history),
    TOKDEF(horizontal),
    TOKDEF(host_cad),
    TOKDEF(host_version),
    TOKDEF(image),
    TOKDEF(image_image),
    TOKDEF(image_image_spacing),
    TOKDEF(image_outline_clearance),
    TOKDEF(image_type),
    TOKDEF(inch),
    TOKDEF(include),
    TOKDEF(include_pins_in_crosstalk),
    TOKDEF(inductance_resolution),
    TOKDEF(insert),
    TOKDEF(instcnfg),
    TOKDEF(inter_layer_clearance),
    TOKDEF(jumper),
    TOKDEF(junction_type),
    TOKDEF(keepout),
    TOKDEF(kg),
    TOKDEF(kohm),
    TOKDEF(large),
    TOKDEF(large_large),
    TOKDEF(layer),
    TOKDEF(layer_depth),
    TOKDEF(layer_noise_weight),
    TOKDEF(layer_pair),
    TOKDEF(layer_rule),
    TOKDEF(length),
    TOKDEF(length_amplitude),
    TOKDEF(length_factor),
    TOKDEF(length_gap),
    TOKDEF(library),
    TOKDEF(library_out),
    TOKDEF(limit),
    TOKDEF(limit_bends),
    TOKDEF(limit_crossing),
    TOKDEF(limit_vias),
    TOKDEF(limit_way),
    TOKDEF(linear),
    TOKDEF(linear_interpolation),
    TOKDEF(load),
    TOKDEF(lock_type),
    TOKDEF(logical_part),
    TOKDEF(logical_part_mapping),
    TOKDEF(match_fromto_delay),
    TOKDEF(match_fromto_length),
    TOKDEF(match_group_delay),
    TOKDEF(match_group_length),
    TOKDEF(match_net_delay),
    TOKDEF(match_net_length),
    TOKDEF(max_delay),
    TOKDEF(max_len),
    TOKDEF(max_length),
    TOKDEF(max_noise),
    TOKDEF(max_restricted_layer_length),
    TOKDEF(max_stagger),
    TOKDEF(max_stub),
    TOKDEF(max_total_delay),
    TOKDEF(max_total_length),
    TOKDEF(max_total_vias),
    TOKDEF(mhenry),
    TOKDEF(mho),
    TOKDEF(microvia),
    TOKDEF(mid_driven),
    TOKDEF(mil),
    TOKDEF(min_gap),
    TOKDEF(mirror),
    TOKDEF(mirror_first),
    TOKDEF(mm),
    TOKDEF(net),
    TOKDEF(net_number),
    TOKDEF(net_pin_changes),
    TOKDEF(nets),
    TOKDEF(network),
    TOKDEF(network_out),
    TOKDEF(no),
    TOKDEF(noexpose),
    TOKDEF(noise_accumulation),
    TOKDEF(noise_calculation),
    TOKDEF(object_type),
    TOKDEF(off),
    TOKDEF(off_grid),
    TOKDEF(offset),
    TOKDEF(on),
    TOKDEF(open),
    TOKDEF(opposite_side),
    TOKDEF(order),
    TOKDEF(outline),
    TOKDEF(overlap),
    TOKDEF(pad),
    TOKDEF(pad_pad),
    TOKDEF(padstack),
    TOKDEF(pair),
    TOKDEF(parallel),
    TOKDEF(parallel_noise),
    TOKDEF(parallel_segment),
    TOKDEF(parser),
    TOKDEF(part_library),
    TOKDEF(path),
    TOKDEF(pcb),
    TOKDEF(permit_orient),
    TOKDEF(permit_side),
    TOKDEF(physical),
    TOKDEF(physical_part_mapping),
    TOKDEF(piggyback),
    TOKDEF(pin),
    TOKDEF(pin_allow),
    TOKDEF(pin_cap_via),
    TOKDEF(pins),
    TOKDEF(pintype),
    TOKDEF(pin_via_cap),
    TOKDEF(pin_width_taper),
    TOKDEF(place),
    TOKDEF(place_boundary),
    TOKDEF(place_control),
    TOKDEF(placement),
    TOKDEF(place_rule),
    TOKDEF(plan),
    TOKDEF(plane),
    TOKDEF(PN),
    TOKDEF(point),
    TOKDEF(polygon),
    TOKDEF(position),
    TOKDEF(power),
    TOKDEF(power_dissipation),
    TOKDEF(power_fanout),
    TOKDEF(prefix),
    TOKDEF(primary),
    TOKDEF(priority),
    TOKDEF(property),
    TOKDEF(qarc),
    TOKDEF(quarter),
    TOKDEF(radius),
    TOKDEF(ratio),
    TOKDEF(ratio_tolerance),
    TOKDEF(rect),
    TOKDEF(reduced),
    TOKDEF(region),
    TOKDEF(region_class),
    TOKDEF(region_class_class),
    TOKDEF(region_net),
    TOKDEF(relative_delay),
    TOKDEF(relative_group_delay),
    TOKDEF(relative_group_length),
    TOKDEF(relative_length),
    TOKDEF(reorder),
    TOKDEF(reroute_order_viols),
    TOKDEF(resistance_resolution),
    TOKDEF(resolution),
    TOKDEF(restricted_layer_length_factor),
    TOKDEF(room),
    TOKDEF(rotate),
    TOKDEF(rotate_first),
    TOKDEF(round),
    TOKDEF(roundoff_rotation),
    TOKDEF(route),
    TOKDEF(routes),
    TOKDEF(routes_include),
    TOKDEF(route_to_fanout_only),
    TOKDEF(rule),
    TOKDEF(same_net_checking),
    TOKDEF(sample_window),
    TOKDEF(saturation_length),
    TOKDEF(sec),
    TOKDEF(secondary),
    TOKDEF(self),
    TOKDEF(sequence_number),
    TOKDEF(session),
    TOKDEF(set_color),
    TOKDEF(set_pattern),
    TOKDEF(shape),
    TOKDEF(shield),
    TOKDEF(shield_gap),
    TOKDEF(shield_loop),
    TOKDEF(shield_tie_down_interval),
    TOKDEF(shield_width),
    TOKDEF(side),
    TOKDEF(signal),
    TOKDEF(site),
    TOKDEF(smd),
    TOKDEF(snap_angle),
    TOKDEF(source),
    TOKDEF(space_in_quoted_tokens),
    TOKDEF(spacing),
    TOKDEF(spare),
    TOKDEF(spiral_via),
    TOKDEF(stack_via),
    TOKDEF(stack_via_depth),
    TOKDEF(standard),
    TOKDEF(starburst),
    TOKDEF(status),
    TOKDEF(string_quote),
    TOKDEF(structure),
    TOKDEF(structure_out),
    TOKDEF(subgates),
    TOKDEF(such),
    TOKDEF(suffix),
    TOKDEF(super_placement),
    TOKDEF(supply),
    TOKDEF(supply_pin),
    TOKDEF(swapping),
    TOKDEF(switch_window),
    TOKDEF(system),
    TOKDEF(tandem_noise),
    TOKDEF(tandem_segment),
    TOKDEF(tandem_shield_overhang),
    TOKDEF(terminal),
    TOKDEF(terminator),
    TOKDEF(term_only),
    TOKDEF(test),
    TOKDEF(testpoint),
    TOKDEF(test_points),
    TOKDEF(threshold),
    TOKDEF(time_length_factor),
    TOKDEF(time_resolution),
    TOKDEF(tjunction),
    TOKDEF(tolerance),
    TOKDEF(top),
    TOKDEF(topology),
    TOKDEF(total),
    TOKDEF(track_id),
    TOKDEF(turret),
    TOKDEF(type),
    TOKDEF(um),
    TOKDEF(unassigned),
    TOKDEF(unconnects),
    TOKDEF(unit),
    TOKDEF(up),
    TOKDEF(use_array),
    TOKDEF(use_layer),
    TOKDEF(use_net),
    TOKDEF(use_via),
    TOKDEF(value),
    TOKDEF(via),
    TOKDEF(via_array_template),
    TOKDEF(via_at_smd),
    TOKDEF(via_keepout),
    TOKDEF(via_number),
    TOKDEF(via_rotate_first),
    TOKDEF(via_site),
    TOKDEF(via_size),
    TOKDEF(virtual_pin),
    TOKDEF(volt),
    TOKDEF(voltage_resolution),
    TOKDEF(was_is),
    TOKDEF(way),
    TOKDEF(weight),
    TOKDEF(width),
    TOKDEF(window),
    TOKDEF(wire),
    TOKDEF(wires),
    TOKDEF(wires_include),
    TOKDEF(wiring),
    TOKDEF(write_resolution),
    TOKDEF(x),
};


static int compare( const void* a1, const void* a2 )
{
    const KEYWORD* k1 = (const KEYWORD*) a1;
@@ -793,33 +795,6 @@ static int compare( const void* a1, const void* a2 )
}


/**
 * Function findToken
 * takes a string and looks up the string in the list of expected
 * tokens.
 * @return int - DSN_T or -1 if argument string is not a recognized token.
*/ 
static int findToken( const char* tok )
{
    char    lowercase[80];
    
    strcpy( lowercase, tok );
    
    strlower( lowercase );

    KEYWORD search;
    search.name = lowercase;
    
    const KEYWORD* findings = (const KEYWORD*) bsearch( &search, 
                                   tokens, sizeof(tokens)/sizeof(tokens[0]),
                                   sizeof(KEYWORD), compare );
    if( findings )
        return findings->token;
    else
        return -1;
}


struct IOError
{
    wxString    errorText;
@@ -921,15 +896,16 @@ LINE_READER::LINE_READER( FILE* aFile, unsigned aMaxLineLength )

int LINE_READER::ReadLine() throw (IOError)
{
    const char* p = fgets( &line[0], capacity, fp );
    const char* p = fgets( line, capacity, fp );
    
    if( !p )
    {
        line[0] = 0;
        length  = 0;
    }
    else
    {
        length = strlen( &line[0] );
        length = strlen( line );

        if( length > maxLineLength )        
            throw IOError( _("Line length exceeded") );
@@ -957,10 +933,11 @@ class LEXER
    LINE_READER         reader;
    int                 stringDelimiter;
    wxString            filename;
    int                 lastTok;        ///< curTok from las NextTok() call.
    int                 lastTok;        ///< curTok from previous NextTok() call.
    
    int                 curTok;         ///< the DSN_T value of current token
    DSN_T               curTok;         ///< the current token obtained on last NextTok()
    std::string         curText;        ///< the text of the current token
    std::string         lowercase;      ///< a scratch buf holding token in lowercase

    
    int readLine() throw (IOError)
@@ -974,6 +951,37 @@ class LEXER
    }


    /**
     * Function findToken
     * takes a string and looks up the string in the list of expected
     * tokens.
     *
     * @param tok A string holding the token text to lookup, in an 
     *   unpredictable case: uppercase or lowercase
     * @return int - DSN_T or -1 if argument string is not a recognized token.
    */ 
    int findToken( const std::string& tok )
    {
        // convert to lower case once, this should be faster than using strcasecmp()
        // for each test in compare().
        lowercase.clear();
        
        for( std::string::const_iterator iter = tok.begin();  iter!=tok.end();  ++iter )
            lowercase += (char) tolower( *iter );
        
        KEYWORD search;
        search.name = lowercase.c_str();
        
        const KEYWORD* findings = (const KEYWORD*) bsearch( &search, 
                                       tokens, sizeof(tokens)/sizeof(tokens[0]),
                                       sizeof(KEYWORD), compare );
        if( findings )
            return findings->token;
        else
            return -1;
    }
    

public:
    LEXER( FILE* aFile, const wxString& aFilename ) :
        reader( aFile, 4096 )
@@ -982,8 +990,9 @@ public:
        stringDelimiter = '"';
        filename = aFilename;
        
        // start should never change until we change the reader, and the DSN
        // format supports an include mechanism but we'll add that later.
        // "start" should never change until we change the reader.  The DSN
        // format spec supports an include file mechanism but we can add that later
        // using a std::stack to hold a stack of LINE_READERs to track nesting.
        start = (char*) reader;     
        
        limit = start;
@@ -991,15 +1000,28 @@ public:
        head  = start;
    }

    /**
     * Function SetStringDelimiter
     * changes the string delimiter from the default " to some other character
     * and returns the old value.
     * @param aStringDelimiter The character in lowest 8 bits.
     * @return int - The old delimiter in the lowest 8 bits.
     */
    int SetStringDelimiter( int aStringDelimiter )
    {
        int old = stringDelimiter;
        stringDelimiter = aStringDelimiter;
        return old;
    }
    
    /**
     * Function NextTok
     * returns the next token found in the input file or T_EOF when reaching
     * the end of file.
     * @return int - one of the DSN_T values.
     * @return DSN_T - the type of token found next.
     * @throw IOError - only if the LINE_READER throws it.
     */
    int NextTok() throw (IOError);
    DSN_T NextTok() throw (IOError);
    
    
    /**
@@ -1031,7 +1053,7 @@ public:
     * Function CurTok
     * returns whatever NextTok() returned the last time it was called.
     */
    int CurTok()
    DSN_T CurTok()
    {
        return curTok;
    }
@@ -1039,9 +1061,8 @@ public:
};


int LEXER::NextTok() throw (IOError)
DSN_T LEXER::NextTok() throw (IOError)
{
L_next:        
    lastTok = curTok;
    
    cur = head;
@@ -1071,17 +1092,11 @@ L_read:
            // switching the string_quote character
            if( lastTok == T_string_quote )
            {
                stringDelimiter = *cur;
                
                curText.clear();
                curText += *cur;
                
                head = cur+1;
                curTok = T_NONE;
                
                // Do not return this to the caller, consume it internally
                // and go get another token for the caller.
                goto L_next;
                curTok = T_QUOTE_DEF;
            }
            
            // a quoted string
@@ -1154,15 +1169,18 @@ L_read:
            else
            {
                head = cur+1;
                while( head<limit && !isspace( *head ) && *head!=')' )
                while( head<limit && !isspace( *head ) && *head!=')' && *head!='(' )
                    ++head;
                
                curText.clear();
                curText.append( cur, head );
                
                curTok  = findToken( curText.c_str() );
                int found = findToken( curText );
                
                if( found != -1 )
                    curTok = (DSN_T) found;
                
                if( curTok == -1 )  // unrecogized token
                else    // unrecogized token
                {
                    curTok = T_SYMBOL;