From f1f11cf66d603bce2e9cb5f3fc8bad1125b41e6b Mon Sep 17 00:00:00 2001 From: dickelbeck Date: Mon, 8 Mar 2010 06:18:40 +0000 Subject: [PATCH] revive target 'dsntest' from common, start exploring pasting text from clipboard, primitively. --- common/CMakeLists.txt | 12 +- common/dsnlexer.cpp | 902 +++++++++++++++++++++++++++++++++++++++++- common/richio.cpp | 5 +- include/dsnlexer.h | 4 + pcbnew/CMakeLists.txt | 5 - pcbnew/specctra.h | 1 + 6 files changed, 903 insertions(+), 26 deletions(-) diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index a1e2ed8bf6..a6a1869472 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -42,7 +42,7 @@ set(COMMON_SRCS gr_basic.cpp hotkeys_basic.cpp msgpanel.cpp - newstroke_font.cpp + newstroke_font.cpp projet_config.cpp # pyhandler.cpp richio.cpp @@ -88,3 +88,13 @@ set(PCB_COMMON_SRCS ) add_library(pcbcommon ${PCB_COMMON_SRCS}) + +# The dsntest may not build properly using MS Visual Studio. +if(NOT MSVC) + # This one gets made only when testing. + # to build it, first enable #define STAND_ALONE at top of dsnlexer.cpp + add_executable( dsntest EXCLUDE_FROM_ALL dsnlexer.cpp ) + target_link_libraries( dsntest common ${wxWidgets_LIBRARIES} ) + +endif( NOT MSVC ) + diff --git a/common/dsnlexer.cpp b/common/dsnlexer.cpp index 6bbc91de2e..b397f538fe 100644 --- a/common/dsnlexer.cpp +++ b/common/dsnlexer.cpp @@ -35,6 +35,7 @@ #include "fctsys.h" #include "pcbnew.h" +//#define STANDALONE 1 // enable this for stand alone testing. static int compare( const void* a1, const void* a2 ) { @@ -48,17 +49,10 @@ static int compare( const void* a1, const void* a2 ) //------------------------------------------------------------------ -DSNLEXER::DSNLEXER( FILE* aFile, const wxString& aFilename, - const KEYWORD* aKeywordTable, unsigned aKeywordCount ) +void DSNLEXER::init() { - reader = new FILE_LINE_READER( aFile, 4096 ); - - keywords = aKeywordTable; - keywordCount = aKeywordCount; - curTok = DSN_NONE; stringDelimiter = '"'; - filename = aFilename; space_in_quoted_tokens = true; @@ -73,6 +67,31 @@ DSNLEXER::DSNLEXER( FILE* aFile, const wxString& aFilename, next = start; } +DSNLEXER::DSNLEXER( FILE* aFile, const wxString& aFilename, + const KEYWORD* aKeywordTable, unsigned aKeywordCount ) : + keywords( aKeywordTable ), + keywordCount( aKeywordCount ) +{ + filename = aFilename; + + reader = new FILE_LINE_READER( aFile, 4096 ); + + init(); +} + + +DSNLEXER::DSNLEXER( const std::string& aClipboardTxt, + const KEYWORD* aKeywordTable, unsigned aKeywordCount ) : + keywords( aKeywordTable ), + keywordCount( aKeywordCount ) +{ + filename = _( "clipboard" ); + + reader = new STRING_LINE_READER( aClipboardTxt ); + + init(); +} + int DSNLEXER::findToken( const std::string& tok ) { @@ -166,7 +185,7 @@ const char* DSNLEXER::GetTokenText( int aTok ) void DSNLEXER::ThrowIOError( wxString aText, int charOffset ) throw (IOError) { // append to aText, do not overwrite - aText << wxT(" ") << _("in file") << wxT(" \"") << filename + aText << wxT(" ") << _("in") << wxT(" \"") << filename << wxT("\" ") << _("on line") << wxT(" ") << reader->LineNumber() << wxT(" ") << _("at offset") << wxT(" ") << charOffset; @@ -420,16 +439,841 @@ exit: // single point of exit, no returns elsewhere please. } - -#if 0 && defined(STANDALONE) - // stand alone testing +#if defined(STANDALONE) + +#include +#include -int main( int argc, char** argv ) +enum TEST_T { + + // these first few are negative special ones for syntax, and are + // inherited from DSNLEXER. + T_NONE = DSN_NONE, + T_STRING_QUOTE = DSN_STRING_QUOTE, + T_QUOTE_DEF = DSN_QUOTE_DEF, + T_DASH = DSN_DASH, + T_SYMBOL = DSN_SYMBOL, + T_NUMBER = DSN_NUMBER, + T_RIGHT = DSN_RIGHT, // right bracket, ')' + T_LEFT = DSN_LEFT, // left bracket, '(' + T_STRING = DSN_STRING, // a quoted string, stripped of the quotes + T_EOF = DSN_EOF, // special case for end of file + + + // This should be coordinated with the + // const static KEYWORD tokens[] array, and both must be sorted + // identically and alphabetically. Remember that '_' is less than any + // alpha character according to ASCII. + + T_absolute = 0, // this one should be == zero + T_added, + T_add_group, + T_add_pins, + T_allow_antenna, + T_allow_redundant_wiring, + T_amp, + T_ancestor, + T_antipad, + T_aperture_type, + T_array, + T_attach, + T_attr, + T_average_pair_length, + T_back, + T_base_design, + T_bbv_ctr2ctr, + T_bend_keepout, + T_bond, + T_both, + T_bottom, + T_bottom_layer_sel, + T_boundary, + T_brickpat, + T_bundle, + T_bus, + T_bypass, + T_capacitance_resolution, + T_capacitor, + T_case_sensitive, + T_cct1, + T_cct1a, + T_center_center, + T_checking_trim_by_pin, + T_circ, + T_circle, + T_circuit, + T_class, + T_class_class, + T_classes, + T_clear, + T_clearance, + T_cluster, + T_cm, + T_color, + T_colors, + T_comment, + T_comp, + T_comp_edge_center, + T_comp_order, + T_component, + T_composite, + T_conductance_resolution, + T_conductor, + T_conflict, + T_connect, + T_constant, + T_contact, + T_control, + T_corner, + T_corners, + T_cost, + T_created_time, + T_cross, + T_crosstalk_model, + T_current_resolution, + T_delete_pins, + T_deleted, + T_deleted_keepout, + T_delta, + T_diagonal, + T_direction, + T_directory, + T_discrete, + T_effective_via_length, + T_elongate_keepout, + T_exclude, + T_expose, + T_extra_image_directory, + T_family, + T_family_family, + T_family_family_spacing, + T_fanout, + T_farad, + T_file, + T_fit, + T_fix, + T_flip_style, + T_floor_plan, + T_footprint, + T_forbidden, + T_force_to_terminal_point, + T_free, + T_forgotten, + T_fromto, + T_front, + T_front_only, + T_gap, + T_gate, + T_gates, + T_generated_by_freeroute, + T_global, + T_grid, + T_group, + T_group_set, + T_guide, + T_hard, + T_height, + T_high, + T_history, + T_horizontal, + T_host_cad, + T_host_version, + T_image, + T_image_conductor, + T_image_image, + T_image_image_spacing, + T_image_outline_clearance, + T_image_set, + T_image_type, + T_inch, + T_include, + T_include_pins_in_crosstalk, + T_inductance_resolution, + T_insert, + T_instcnfg, + T_inter_layer_clearance, + T_jumper, + T_junction_type, + T_keepout, + T_kg, + T_kohm, + T_large, + T_large_large, + T_layer, + T_layer_depth, + T_layer_noise_weight, + T_layer_pair, + T_layer_rule, + T_length, + T_length_amplitude, + T_length_factor, + T_length_gap, + T_library, + T_library_out, + T_limit, + T_limit_bends, + T_limit_crossing, + T_limit_vias, + T_limit_way, + T_linear, + T_linear_interpolation, + T_load, + T_lock_type, + T_logical_part, + T_logical_part_mapping, + T_low, + T_match_fromto_delay, + T_match_fromto_length, + T_match_group_delay, + T_match_group_length, + T_match_net_delay, + T_match_net_length, + T_max_delay, + T_max_len, + T_max_length, + T_max_noise, + T_max_restricted_layer_length, + T_max_stagger, + T_max_stub, + T_max_total_delay, + T_max_total_length, + T_max_total_vias, + T_medium, + T_mhenry, + T_mho, + T_microvia, + T_mid_driven, + T_mil, + T_min_gap, + T_mirror, + T_mirror_first, + T_mixed, + T_mm, + T_negative_diagonal, + T_net, + T_net_number, + T_net_out, + T_net_pin_changes, + T_nets, + T_network, + T_network_out, + T_no, + T_noexpose, + T_noise_accumulation, + T_noise_calculation, + T_normal, + T_object_type, + T_off, + T_off_grid, + T_offset, + T_on, + T_open, + T_opposite_side, + T_order, + T_orthogonal, + T_outline, + T_overlap, + T_pad, + T_pad_pad, + T_padstack, + T_pair, + T_parallel, + T_parallel_noise, + T_parallel_segment, + T_parser, + T_part_library, + T_path, + T_pcb, + T_permit_orient, + T_permit_side, + T_physical, + T_physical_part_mapping, + T_piggyback, + T_pin, + T_pin_allow, + T_pin_cap_via, + T_pin_via_cap, + T_pin_width_taper, + T_pins, + T_pintype, + T_place, + T_place_boundary, + T_place_control, + T_place_keepout, + T_place_rule, + T_placement, + T_plan, + T_plane, + T_pn, + T_point, + T_polyline_path, + T_polygon, + T_position, + T_positive_diagonal, + T_power, + T_power_dissipation, + T_power_fanout, + T_prefix, + T_primary, + T_priority, + T_property, + T_protect, + T_qarc, + T_quarter, + T_radius, + T_ratio, + T_ratio_tolerance, + T_rect, + T_reduced, + T_region, + T_region_class, + T_region_class_class, + T_region_net, + T_relative_delay, + T_relative_group_delay, + T_relative_group_length, + T_relative_length, + T_reorder, + T_reroute_order_viols, + T_resistance_resolution, + T_resistor, + T_resolution, + T_restricted_layer_length_factor, + T_room, + T_rotate, + T_rotate_first, + T_round, + T_roundoff_rotation, + T_route, + T_route_to_fanout_only, + T_routes, + T_routes_include, + T_rule, + T_same_net_checking, + T_sample_window, + T_saturation_length, + T_sec, + T_secondary, + T_self, + T_sequence_number, + T_session, + T_set_color, + T_set_pattern, + T_shape, + T_shield, + T_shield_gap, + T_shield_loop, + T_shield_tie_down_interval, + T_shield_width, + T_side, + T_signal, + T_site, + T_small, + T_smd, + T_snap, + T_snap_angle, + T_soft, + T_source, + T_space_in_quoted_tokens, + T_spacing, + T_spare, + T_spiral_via, + T_square, + T_stack_via, + T_stack_via_depth, + T_standard, + T_starburst, + T_status, + T_structure, + T_structure_out, + T_subgate, + T_subgates, + T_substituted, + T_such, + T_suffix, + T_super_placement, + T_supply, + T_supply_pin, + T_swapping, + T_switch_window, + T_system, + T_tandem_noise, + T_tandem_segment, + T_tandem_shield_overhang, + T_terminal, + T_terminator, + T_term_only, + T_test, + T_test_points, + T_testpoint, + T_threshold, + T_time_length_factor, + T_time_resolution, + T_tjunction, + T_tolerance, + T_top, + T_topology, + T_total, + T_track_id, + T_turret, + T_type, + T_um, + T_unassigned, + T_unconnects, + T_unit, + T_up, + T_use_array, + T_use_layer, + T_use_net, + T_use_via, + T_value, + T_vertical, + T_via, + T_via_array_template, + T_via_at_smd, + T_via_keepout, + T_via_number, + T_via_rotate_first, + T_via_site, + T_via_size, + T_virtual_pin, + T_volt, + T_voltage_resolution, + T_was_is, + T_way, + T_weight, + T_width, + T_window, + T_wire, + T_wire_keepout, + T_wires, + T_wires_include, + T_wiring, + T_write_resolution, + T_x, + T_xy, + T_y, +}; + + +#define TOKDEF(x) { #x, T_##x } + +// This MUST be sorted alphabetically, and the order of enum DSN_T {} be +// identially alphabetized. These MUST all be lower case because of the +// conversion to lowercase in findToken(). +static const KEYWORD keywords[] = { + + // Note that TOKDEF(string_quote) has been moved to the + // DSNLEXER, and DSN_SYNTAX_T enum, and the string for it is "string_quote". + + 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(back), + TOKDEF(base_design), + TOKDEF(bbv_ctr2ctr), + TOKDEF(bend_keepout), + TOKDEF(bond), + TOKDEF(both), + TOKDEF(bottom), + TOKDEF(bottom_layer_sel), + TOKDEF(boundary), + TOKDEF(brickpat), + TOKDEF(bundle), + TOKDEF(bus), + 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(comp_order), + TOKDEF(component), + 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(delete_pins), + TOKDEF(deleted), + TOKDEF(deleted_keepout), + TOKDEF(delta), + TOKDEF(diagonal), + TOKDEF(direction), + TOKDEF(directory), + TOKDEF(discrete), + TOKDEF(effective_via_length), + TOKDEF(elongate_keepout), + TOKDEF(exclude), + TOKDEF(expose), + TOKDEF(extra_image_directory), + TOKDEF(family), + TOKDEF(family_family), + TOKDEF(family_family_spacing), + TOKDEF(fanout), + 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(free), + TOKDEF(fromto), + TOKDEF(front), + TOKDEF(front_only), + TOKDEF(gap), + TOKDEF(gate), + TOKDEF(gates), + TOKDEF(generated_by_freeroute), + TOKDEF(global), + TOKDEF(grid), + TOKDEF(group), + TOKDEF(group_set), + TOKDEF(guide), + TOKDEF(hard), + TOKDEF(height), + TOKDEF(high), + TOKDEF(history), + TOKDEF(horizontal), + TOKDEF(host_cad), + TOKDEF(host_version), + TOKDEF(image), + TOKDEF(image_conductor), + TOKDEF(image_image), + TOKDEF(image_image_spacing), + TOKDEF(image_outline_clearance), + TOKDEF(image_set), + 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(low), + 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(medium), + TOKDEF(mhenry), + TOKDEF(mho), + TOKDEF(microvia), + TOKDEF(mid_driven), + TOKDEF(mil), + TOKDEF(min_gap), + TOKDEF(mirror), + TOKDEF(mirror_first), + TOKDEF(mixed), + TOKDEF(mm), + TOKDEF(negative_diagonal), + TOKDEF(net), + TOKDEF(net_number), + TOKDEF(net_out), + TOKDEF(net_pin_changes), + TOKDEF(nets), + TOKDEF(network), + TOKDEF(network_out), + TOKDEF(no), + TOKDEF(noexpose), + TOKDEF(noise_accumulation), + TOKDEF(noise_calculation), + TOKDEF(normal), + TOKDEF(object_type), + TOKDEF(off), + TOKDEF(off_grid), + TOKDEF(offset), + TOKDEF(on), + TOKDEF(open), + TOKDEF(opposite_side), + TOKDEF(order), + TOKDEF(orthogonal), + 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(pin_via_cap), + TOKDEF(pin_width_taper), + TOKDEF(pins), + TOKDEF(pintype), + TOKDEF(place), + TOKDEF(place_boundary), + TOKDEF(place_control), + TOKDEF(place_keepout), + TOKDEF(place_rule), + TOKDEF(placement), + TOKDEF(plan), + TOKDEF(plane), + TOKDEF(pn), + TOKDEF(point), + TOKDEF(polyline_path), // used by freerouting.com + TOKDEF(polygon), + TOKDEF(position), + TOKDEF(positive_diagonal), + TOKDEF(power), + TOKDEF(power_dissipation), + TOKDEF(power_fanout), + TOKDEF(prefix), + TOKDEF(primary), + TOKDEF(priority), + TOKDEF(property), + TOKDEF(protect), + 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(resistor), + TOKDEF(resolution), + TOKDEF(restricted_layer_length_factor), + TOKDEF(room), + TOKDEF(rotate), + TOKDEF(rotate_first), + TOKDEF(round), + TOKDEF(roundoff_rotation), + TOKDEF(route), + TOKDEF(route_to_fanout_only), + TOKDEF(routes), + TOKDEF(routes_include), + 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(small), + TOKDEF(smd), + TOKDEF(snap), + TOKDEF(snap_angle), + TOKDEF(soft), + TOKDEF(source), + TOKDEF(space_in_quoted_tokens), + TOKDEF(spacing), + TOKDEF(spare), + TOKDEF(spiral_via), + TOKDEF(square), + TOKDEF(stack_via), + TOKDEF(stack_via_depth), + TOKDEF(standard), + TOKDEF(starburst), + TOKDEF(status), + TOKDEF(structure), + TOKDEF(structure_out), + TOKDEF(subgate), + TOKDEF(subgates), + TOKDEF(substituted), + 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(test_points), + TOKDEF(testpoint), + 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(vertical), + 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(wire_keepout), + TOKDEF(wires), + TOKDEF(wires_include), + TOKDEF(wiring), + TOKDEF(write_resolution), + TOKDEF(x), + TOKDEF(xy), + TOKDEF(y), +}; + + +class DSNTEST : public wxApp +{ +public: + virtual bool OnInit(); +}; + + +IMPLEMENT_APP( DSNTEST ) + +bool DSNTEST::OnInit() { -// wxString filename( wxT("/tmp/fpcroute/Sample_1sided/demo_1sided.dsn") ); +#if 0 // file based LINE_READER. + wxFFile file; + wxString filename( wxT("/tmp/testdesigns/test.dsn") ); FILE* fp = wxFopen( filename, wxT("r") ); @@ -441,8 +1285,34 @@ int main( int argc, char** argv ) exit(1); } + file.Attach( fp ); // "exception safe" way to close the file. + // this won't compile without a token table. - DSNLEXER lexer( fp, filename ); + DSNLEXER lexer( fp, filename, keywords, DIM(keywords) ); + +#else + + if( !wxTheClipboard->Open() ) + { + fprintf( stderr, "unable to open clipboard\n" ); + exit( 1 ); + } + +/* + if( wxTheClipboard->IsSupported( wxDF_TEXT ) ) + { + fprintf( stderr, "nothing of interest on clipboard\n" ); + exit( 2 ); + } +*/ + wxTextDataObject dataObj; + + wxTheClipboard->GetData( dataObj ); + + DSNLEXER lexer( std::string( CONV_TO_UTF8( dataObj.GetText() ) ), + keywords, DIM(keywords) ); + +#endif try { @@ -457,8 +1327,6 @@ int main( int argc, char** argv ) printf( "%s\n", (const char*) ioe.errorText.mb_str() ); } - fclose( fp ); - return 0; } diff --git a/common/richio.cpp b/common/richio.cpp index 75601db6f4..f8b656efc1 100644 --- a/common/richio.cpp +++ b/common/richio.cpp @@ -91,19 +91,18 @@ int STRING_LINE_READER::ReadLine() throw (IOError) if( advance ) { - if( advance >= maxLineLength ) + if( advance > maxLineLength ) throw IOError( _("Line length exceeded") ); wxASSERT( ndx + advance <= source.length() ); memcpy( line, &source[ndx], advance ); - length = advance; - ++lineNum; ndx += advance; } + length = advance; line[advance] = 0; return advance; diff --git a/include/dsnlexer.h b/include/dsnlexer.h index 2d2d294f06..652e4bff55 100644 --- a/include/dsnlexer.h +++ b/include/dsnlexer.h @@ -98,6 +98,7 @@ class DSNLEXER const KEYWORD* keywords; unsigned keywordCount; + void init(); int readLine() throw (IOError) { @@ -159,6 +160,9 @@ public: DSNLEXER( FILE* aFile, const wxString& aFilename, const KEYWORD* aKeywordTable, unsigned aKeywordCount ); + DSNLEXER( const std::string& aClipboardTxt, + const KEYWORD* aKeywordTable, unsigned aKeywordCount ); + ~DSNLEXER() { delete reader; diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt index ddc7329141..0cf6890d12 100644 --- a/pcbnew/CMakeLists.txt +++ b/pcbnew/CMakeLists.txt @@ -233,14 +233,9 @@ install(TARGETS ${PCBNEW_NAME} # The specctra test fails to build properly using MS Visual Studio. if(NOT MSVC) - # This one gets made only when testing. - #add_executable(dsntest EXCLUDE_FROM_ALL dsn.cpp) - #target_link_libraries(dsntest common ${wxWidgets_LIBRARIES}) - # This one gets made only when testing. add_executable(specctra_test EXCLUDE_FROM_ALL specctra.cpp) target_link_libraries(specctra_test common ${wxWidgets_LIBRARIES}) - endif(NOT MSVC) # This one gets made only when testing. diff --git a/pcbnew/specctra.h b/pcbnew/specctra.h index 77dbc17f18..58b29b793c 100644 --- a/pcbnew/specctra.h +++ b/pcbnew/specctra.h @@ -71,6 +71,7 @@ enum DSN_T { // these first few are negative special ones for syntax, and are // inherited from DSNLEXER. T_NONE = DSN_NONE, + T_COMMENT = DSN_COMMENT, T_STRING_QUOTE = DSN_STRING_QUOTE, T_QUOTE_DEF = DSN_QUOTE_DEF, T_DASH = DSN_DASH,