KiCad PCB EDA Suite
sch_legacy_plugin.cpp File Reference
#include <ctype.h>
#include <algorithm>
#include <wx/mstream.h>
#include <wx/filename.h>
#include <wx/tokenzr.h>
#include <drawtxt.h>
#include <kiway.h>
#include <kicad_string.h>
#include <richio.h>
#include <core/typeinfo.h>
#include <properties.h>
#include <general.h>
#include <sch_bitmap.h>
#include <sch_bus_entry.h>
#include <sch_component.h>
#include <sch_junction.h>
#include <sch_line.h>
#include <sch_marker.h>
#include <sch_no_connect.h>
#include <sch_text.h>
#include <sch_sheet.h>
#include <sch_legacy_plugin.h>
#include <template_fieldnames.h>
#include <class_sch_screen.h>
#include <class_libentry.h>
#include <class_library.h>
#include <lib_arc.h>
#include <lib_bezier.h>
#include <lib_circle.h>
#include <lib_field.h>
#include <lib_pin.h>
#include <lib_polyline.h>
#include <lib_rectangle.h>
#include <lib_text.h>
#include <eeschema_id.h>
#include <symbol_lib_table.h>

Go to the source code of this file.

Classes

class  SCH_LEGACY_PLUGIN_CACHE
 A cache assistant for the part library portion of the SCH_PLUGIN API, and only for the SCH_LEGACY_PLUGIN, so therefore is private to this implementation file, i.e. More...
 

Macros

#define DOCFILE_IDENT   "EESchema-DOCLIB Version 2.0"
 
#define SCH_PARSE_ERROR(text, reader, pos)
 
#define T_STYLE   "style"
 
#define T_COLOR   "rgb"
 
#define T_COLORA   "rgba"
 
#define T_WIDTH   "width"
 

Functions

static bool is_eol (char c)
 
static bool strCompare (const char *aString, const char *aLine, const char **aOutput=NULL)
 Compare aString to the string starting at aLine and advances the character point to the end of String and returns the new pointer position in aOutput if it is not NULL. More...
 
static int parseInt (FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
 Parse an ASCII integer string with possible leading whitespace into an integer and updates the pointer at aOutput if it is not NULL, just like "man strtol()". More...
 
static unsigned long parseHex (FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
 Parse an ASCII hex integer string with possible leading whitespace into a long integer and updates the pointer at aOutput if it is not NULL, just like "man strtol". More...
 
static double parseDouble (FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
 Parses an ASCII point string with possible leading whitespace into a double precision floating point number and updates the pointer at aOutput if it is not NULL, just like "man strtod". More...
 
static char parseChar (FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL)
 Parse a single ASCII character and updates the pointer at aOutput if it is not NULL. More...
 
static void parseUnquotedString (wxString &aString, FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL, bool aCanBeEmpty=false)
 Parse an unquoted utf8 string and updates the pointer at aOutput if it is not NULL. More...
 
static void parseQuotedString (wxString &aString, FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL, bool aCanBeEmpty=false)
 Parse an quoted ASCII utf8 and updates the pointer at aOutput if it is not NULL. More...
 

Variables

const char * delims = " \t\r\n"
 
const wxChar traceSchLegacyPlugin [] = wxT( "KICAD_TRACE_SCH_LEGACY_PLUGIN" )
 Flag to enable legacy schematic plugin debug output. More...
 

Macro Definition Documentation

#define DOCFILE_IDENT   "EESchema-DOCLIB Version 2.0"
#define T_COLOR   "rgb"

Definition at line 77 of file sch_legacy_plugin.cpp.

Referenced by SCH_LEGACY_PLUGIN::loadWire().

#define T_COLORA   "rgba"

Definition at line 78 of file sch_legacy_plugin.cpp.

Referenced by SCH_LEGACY_PLUGIN::loadWire().

#define T_STYLE   "style"
#define T_WIDTH   "width"

Function Documentation

static bool is_eol ( char  c)
static

Definition at line 89 of file sch_legacy_plugin.cpp.

Referenced by SCH_LEGACY_PLUGIN_CACHE::loadText(), and SCH_LEGACY_PLUGIN::loadWire().

90 {
91  // The default file eol character used internally by KiCad.
92  // |
93  // | Possible eol if someone edited the file by hand on certain platforms.
94  // | |
95  // | | May have gone past eol with strtok().
96  // | | |
97  if( c == '\n' || c == '\r' || c == 0 )
98  return true;
99 
100  return false;
101 }
static char parseChar ( FILE_LINE_READER aReader,
const char *  aCurrentToken,
const char **  aNextToken = NULL 
)
static

Parse a single ASCII character and updates the pointer at aOutput if it is not NULL.

Parameters
aReader- The line reader used to generate exception throw information.
aCurrentToken- A pointer the current position in a string.
aNextToken- The pointer to a string pointer to copy the string pointer position when the parsing is complete.
Returns
A valid ASCII character.
Exceptions
IO_ERRORon an unexpected end of line.
PARSE_ERRORif the parsed token is not a a single character token.

Definition at line 279 of file sch_legacy_plugin.cpp.

References next(), and SCH_PARSE_ERROR.

Referenced by SCH_LEGACY_PLUGIN::loadComponent(), SCH_LEGACY_PLUGIN_CACHE::loadField(), SCH_LEGACY_PLUGIN_CACHE::loadPart(), SCH_LEGACY_PLUGIN_CACHE::loadPin(), SCH_LEGACY_PLUGIN::loadSheet(), SCH_LEGACY_PLUGIN_CACHE::loadText(), and SCH_LEGACY_PLUGIN_CACHE::parseFillMode().

281 {
282  while( *aCurrentToken && isspace( *aCurrentToken ) )
283  aCurrentToken++;
284 
285  if( !*aCurrentToken )
286  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aCurrentToken );
287 
288  if( !isspace( *( aCurrentToken + 1 ) ) )
289  SCH_PARSE_ERROR( "expected single character token", aReader, aCurrentToken );
290 
291  if( aNextToken )
292  {
293  const char* next = aCurrentToken + 2;
294 
295  while( *next && isspace( *next ) )
296  next++;
297 
298  *aNextToken = next;
299  }
300 
301  return *aCurrentToken;
302 }
CITER next(CITER it)
Definition: ptree.cpp:130
#define SCH_PARSE_ERROR(text, reader, pos)
static double parseDouble ( FILE_LINE_READER aReader,
const char *  aLine,
const char **  aOutput = NULL 
)
static

Parses an ASCII point string with possible leading whitespace into a double precision floating point number and updates the pointer at aOutput if it is not NULL, just like "man strtod".

Parameters
aReader- The line reader used to generate exception throw information.
aLine- A pointer the current position in a string.
aOutput- The pointer to a string pointer to copy the string pointer position when the parsing is complete.
Returns
A valid double value.
Exceptions
IO_ERRORon an unexpected end of line.
PARSE_ERRORif the parsed token is not a valid integer.

Definition at line 238 of file sch_legacy_plugin.cpp.

References next(), and SCH_PARSE_ERROR.

Referenced by SCH_LEGACY_PLUGIN::loadBitmap(), PCB_PARSER::parse3DModel(), PCB_PARSER::parseD_PAD(), PCB_PARSER::parseDRAWSEGMENT(), PCB_PARSER::parseEDGE_MODULE(), PCB_PARSER::parseMODULE_unchecked(), PCB_PARSER::parsePAGE_INFO(), PCB_PARSER::parseSetup(), PCB_PARSER::parseTEXTE_MODULE(), and PCB_PARSER::parseTEXTE_PCB().

240 {
241  if( !*aLine )
242  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aLine );
243 
244  // Clear errno before calling strtod() in case some other crt call set it.
245  errno = 0;
246 
247  double retv = strtod( aLine, (char**) aOutput );
248 
249  // Make sure no error occurred when calling strtod().
250  if( errno == ERANGE )
251  SCH_PARSE_ERROR( "invalid floating point number", aReader, aLine );
252 
253  // strtod does not strip off whitespace before the next token.
254  if( aOutput )
255  {
256  const char* next = *aOutput;
257 
258  while( *next && isspace( *next ) )
259  next++;
260 
261  *aOutput = next;
262  }
263 
264  return retv;
265 }
CITER next(CITER it)
Definition: ptree.cpp:130
#define SCH_PARSE_ERROR(text, reader, pos)
static unsigned long parseHex ( FILE_LINE_READER aReader,
const char *  aLine,
const char **  aOutput = NULL 
)
static

Parse an ASCII hex integer string with possible leading whitespace into a long integer and updates the pointer at aOutput if it is not NULL, just like "man strtol".

Parameters
aReader- The line reader used to generate exception throw information.
aLine- A pointer the current position in a string.
aOutput- The pointer to a string pointer to copy the string pointer position when the parsing is complete.
Returns
A valid integer value.
Exceptions
IO_ERRORon an unexpected end of line.
PARSE_ERRORif the parsed token is not a valid integer.

Definition at line 192 of file sch_legacy_plugin.cpp.

References next(), and SCH_PARSE_ERROR.

Referenced by SCH_LEGACY_PLUGIN::loadComponent(), SCH_LEGACY_PLUGIN::loadSheet(), PCB_PARSER::parseDIMENSION(), PCB_PARSER::parseDRAWSEGMENT(), PCB_PARSER::parseEDGE_MODULE(), PCB_PARSER::parseMODULE_unchecked(), PCB_PARSER::parsePCB_TARGET(), PCB_PARSER::parseSetup(), PCB_PARSER::parseTEXTE_PCB(), PCB_PARSER::parseTRACK(), PCB_PARSER::parseVIA(), and PCB_PARSER::parseZONE_CONTAINER().

194 {
195  if( !*aLine )
196  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aLine );
197 
198  unsigned long retv;
199 
200  // Clear errno before calling strtoul() in case some other crt call set it.
201  errno = 0;
202  retv = strtoul( aLine, (char**) aOutput, 16 );
203 
204  // Make sure no error occurred when calling strtoul().
205  if( errno == ERANGE )
206  SCH_PARSE_ERROR( "invalid hexadecimal number", aReader, aLine );
207 
208  // Strip off whitespace before the next token.
209  if( aOutput )
210  {
211  // const char* next = aLine + strlen( token );
212 
213  const char* next = *aOutput;
214 
215  while( *next && isspace( *next ) )
216  next++;
217 
218  *aOutput = next;
219  }
220 
221  return retv;
222 }
CITER next(CITER it)
Definition: ptree.cpp:130
#define SCH_PARSE_ERROR(text, reader, pos)
static int parseInt ( FILE_LINE_READER aReader,
const char *  aLine,
const char **  aOutput = NULL 
)
static

Parse an ASCII integer string with possible leading whitespace into an integer and updates the pointer at aOutput if it is not NULL, just like "man strtol()".

Parameters
aReader- The line reader used to generate exception throw information.
aLine- A pointer the current position in a string.
aOutput- The pointer to a string pointer to copy the string pointer position when the parsing is complete.
Returns
A valid integer value.
Exceptions
AnIO_ERROR on an unexpected end of line.
APARSE_ERROR if the parsed token is not a valid integer.

Definition at line 150 of file sch_legacy_plugin.cpp.

References next(), and SCH_PARSE_ERROR.

Referenced by SCH_LEGACY_PLUGIN_CACHE::Load(), SCH_LEGACY_PLUGIN_CACHE::loadArc(), SCH_LEGACY_PLUGIN_CACHE::loadBezier(), SCH_LEGACY_PLUGIN::loadBitmap(), SCH_LEGACY_PLUGIN::loadBusEntry(), SCH_LEGACY_PLUGIN_CACHE::loadCircle(), SCH_LEGACY_PLUGIN::loadComponent(), SCH_LEGACY_PLUGIN_CACHE::loadField(), SCH_LEGACY_PLUGIN::loadHeader(), SCH_LEGACY_PLUGIN::loadJunction(), SCH_LEGACY_PLUGIN::loadNoConnect(), SCH_LEGACY_PLUGIN::loadPageSettings(), SCH_LEGACY_PLUGIN_CACHE::loadPart(), SCH_LEGACY_PLUGIN_CACHE::loadPin(), SCH_LEGACY_PLUGIN_CACHE::loadPolyLine(), SCH_LEGACY_PLUGIN_CACHE::loadRectangle(), SCH_LEGACY_PLUGIN::loadSheet(), SCH_LEGACY_PLUGIN::loadText(), SCH_LEGACY_PLUGIN_CACHE::loadText(), and SCH_LEGACY_PLUGIN::loadWire().

151 {
152  if( !*aLine )
153  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aLine );
154 
155  // Clear errno before calling strtol() in case some other crt call set it.
156  errno = 0;
157 
158  long retv = strtol( aLine, (char**) aOutput, 10 );
159 
160  // Make sure no error occurred when calling strtol().
161  if( errno == ERANGE )
162  SCH_PARSE_ERROR( "invalid integer value", aReader, aLine );
163 
164  // strtol does not strip off whitespace before the next token.
165  if( aOutput )
166  {
167  const char* next = *aOutput;
168 
169  while( *next && isspace( *next ) )
170  next++;
171 
172  *aOutput = next;
173  }
174 
175  return (int) retv;
176 }
CITER next(CITER it)
Definition: ptree.cpp:130
#define SCH_PARSE_ERROR(text, reader, pos)
static void parseQuotedString ( wxString &  aString,
FILE_LINE_READER aReader,
const char *  aCurrentToken,
const char **  aNextToken = NULL,
bool  aCanBeEmpty = false 
)
static

Parse an quoted ASCII utf8 and updates the pointer at aOutput if it is not NULL.

The parsed string must be contained within a single line. There are no multi-line quoted strings in the legacy schematic file format.

Parameters
aString- A reference to the parsed string.
aReader- The line reader used to generate exception throw information.
aCurrentToken- A pointer the current position in a string.
aNextToken- The pointer to a string pointer to copy the string pointer position when the parsing is complete.
aCanBeEmpty- True if the parsed string is optional. False if it is mandatory.
Exceptions
IO_ERRORon an unexpected end of line.
PARSE_ERRORif the aCanBeEmpty is false and no string was parsed.

Definition at line 381 of file sch_legacy_plugin.cpp.

References FROM_UTF8(), next(), and SCH_PARSE_ERROR.

Referenced by SCH_LEGACY_PLUGIN::loadComponent(), SCH_LEGACY_PLUGIN_CACHE::loadField(), SCH_LEGACY_PLUGIN::loadPageSettings(), SCH_LEGACY_PLUGIN::loadSheet(), and SCH_LEGACY_PLUGIN_CACHE::loadText().

384 {
385  if( !*aCurrentToken )
386  {
387  if( aCanBeEmpty )
388  return;
389  else
390  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aCurrentToken );
391  }
392 
393  const char* tmp = aCurrentToken;
394 
395  while( *tmp && isspace( *tmp ) )
396  tmp++;
397 
398  if( !*tmp )
399  {
400  if( aCanBeEmpty )
401  return;
402  else
403  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aCurrentToken );
404  }
405 
406  // Verify opening quote.
407  if( *tmp != '"' )
408  SCH_PARSE_ERROR( "expecting opening quote", aReader, aCurrentToken );
409 
410  tmp++;
411 
412  std::string utf8; // utf8 without escapes and quotes.
413 
414  // Fetch everything up to closing quote.
415  while( *tmp )
416  {
417  if( *tmp == '\\' )
418  {
419  tmp++;
420 
421  if( !*tmp )
422  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aCurrentToken );
423 
424  // Do not copy the escape byte if it is followed by \ or "
425  if( *tmp != '"' && *tmp != '\\' )
426  utf8 += '\\';
427 
428  utf8 += *tmp;
429  }
430  else if( *tmp == '"' ) // Closing double quote.
431  {
432  break;
433  }
434  else
435  {
436  utf8 += *tmp;
437  }
438 
439  tmp++;
440  }
441 
442  aString = FROM_UTF8( utf8.c_str() );
443 
444  if( aString.IsEmpty() && !aCanBeEmpty )
445  SCH_PARSE_ERROR( "expected quoted string", aReader, aCurrentToken );
446 
447  if( *tmp && *tmp != '"' )
448  SCH_PARSE_ERROR( "no closing quote for string found", aReader, tmp );
449 
450  // Move past the closing quote.
451  tmp++;
452 
453  if( aNextToken )
454  {
455  const char* next = tmp;
456 
457  while( *next && *next == ' ' )
458  next++;
459 
460  *aNextToken = next;
461  }
462 }
CITER next(CITER it)
Definition: ptree.cpp:130
static wxString FROM_UTF8(const char *cstring)
function FROM_UTF8 converts a UTF8 encoded C string to a wxString for all wxWidgets build modes...
Definition: macros.h:53
#define SCH_PARSE_ERROR(text, reader, pos)
static void parseUnquotedString ( wxString &  aString,
FILE_LINE_READER aReader,
const char *  aCurrentToken,
const char **  aNextToken = NULL,
bool  aCanBeEmpty = false 
)
static

Parse an unquoted utf8 string and updates the pointer at aOutput if it is not NULL.

The parsed string must be a continuous string with no white space.

Parameters
aString- A reference to the parsed string.
aReader- The line reader used to generate exception throw information.
aCurrentToken- A pointer the current position in a string.
aNextToken- The pointer to a string pointer to copy the string pointer position when the parsing is complete.
aCanBeEmpty- True if the parsed string is optional. False if it is mandatory.
Exceptions
IO_ERRORon an unexpected end of line.
PARSE_ERRORif the aCanBeEmpty is false and no string was parsed.

Definition at line 319 of file sch_legacy_plugin.cpp.

References FROM_UTF8(), next(), and SCH_PARSE_ERROR.

Referenced by SCH_LEGACY_PLUGIN_CACHE::loadAliases(), SCH_LEGACY_PLUGIN::loadComponent(), SCH_LEGACY_PLUGIN_CACHE::loadDocs(), SCH_LEGACY_PLUGIN_CACHE::loadField(), SCH_LEGACY_PLUGIN_CACHE::loadFootprintFilters(), SCH_LEGACY_PLUGIN::loadJunction(), SCH_LEGACY_PLUGIN::loadNoConnect(), SCH_LEGACY_PLUGIN::loadPageSettings(), SCH_LEGACY_PLUGIN_CACHE::loadPart(), SCH_LEGACY_PLUGIN_CACHE::loadPin(), SCH_LEGACY_PLUGIN_CACHE::loadText(), and SCH_LEGACY_PLUGIN::loadWire().

322 {
323  if( !*aCurrentToken )
324  {
325  if( aCanBeEmpty )
326  return;
327  else
328  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aCurrentToken );
329  }
330 
331  const char* tmp = aCurrentToken;
332 
333  while( *tmp && isspace( *tmp ) )
334  tmp++;
335 
336  if( !*tmp )
337  {
338  if( aCanBeEmpty )
339  return;
340  else
341  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aCurrentToken );
342  }
343 
344  std::string utf8;
345 
346  while( *tmp && !isspace( *tmp ) )
347  utf8 += *tmp++;
348 
349  aString = FROM_UTF8( utf8.c_str() );
350 
351  if( aString.IsEmpty() && !aCanBeEmpty )
352  SCH_PARSE_ERROR( _( "expected unquoted string" ), aReader, aCurrentToken );
353 
354  if( aNextToken )
355  {
356  const char* next = tmp;
357 
358  while( *next && isspace( *next ) )
359  next++;
360 
361  *aNextToken = next;
362  }
363 }
CITER next(CITER it)
Definition: ptree.cpp:130
static wxString FROM_UTF8(const char *cstring)
function FROM_UTF8 converts a UTF8 encoded C string to a wxString for all wxWidgets build modes...
Definition: macros.h:53
#define SCH_PARSE_ERROR(text, reader, pos)
static bool strCompare ( const char *  aString,
const char *  aLine,
const char **  aOutput = NULL 
)
static

Compare aString to the string starting at aLine and advances the character point to the end of String and returns the new pointer position in aOutput if it is not NULL.

Parameters
aString- A pointer to the string to compare.
aLine- A pointer to string to begin the comparison.
aOutput- A pointer to a string pointer to the end of the comparison if not NULL.
Returns
true if aString was found starting at aLine. Otherwise false.

Definition at line 113 of file sch_legacy_plugin.cpp.

Referenced by SCH_LEGACY_PLUGIN_CACHE::Load(), SCH_LEGACY_PLUGIN_CACHE::loadAliases(), SCH_LEGACY_PLUGIN_CACHE::loadArc(), SCH_LEGACY_PLUGIN_CACHE::loadBezier(), SCH_LEGACY_PLUGIN::loadBitmap(), SCH_LEGACY_PLUGIN::loadBusEntry(), SCH_LEGACY_PLUGIN_CACHE::loadCircle(), SCH_LEGACY_PLUGIN::loadComponent(), SCH_LEGACY_PLUGIN_CACHE::loadDocs(), SCH_LEGACY_PLUGIN_CACHE::loadDrawEntries(), SCH_LEGACY_PLUGIN::loadFile(), SCH_LEGACY_PLUGIN_CACHE::loadFootprintFilters(), SCH_LEGACY_PLUGIN::loadHeader(), SCH_LEGACY_PLUGIN_CACHE::loadHeader(), SCH_LEGACY_PLUGIN::loadJunction(), SCH_LEGACY_PLUGIN::loadNoConnect(), SCH_LEGACY_PLUGIN::loadPageSettings(), SCH_LEGACY_PLUGIN_CACHE::loadPart(), SCH_LEGACY_PLUGIN_CACHE::loadPin(), SCH_LEGACY_PLUGIN_CACHE::loadPolyLine(), SCH_LEGACY_PLUGIN_CACHE::loadRectangle(), SCH_LEGACY_PLUGIN::loadSheet(), SCH_LEGACY_PLUGIN::loadText(), SCH_LEGACY_PLUGIN_CACHE::loadText(), and SCH_LEGACY_PLUGIN::loadWire().

114 {
115  size_t len = strlen( aString );
116  bool retv = ( strncasecmp( aLine, aString, len ) == 0 ) &&
117  ( isspace( aLine[ len ] ) || aLine[ len ] == 0 );
118 
119  if( retv && aOutput )
120  {
121  const char* tmp = aLine;
122 
123  // Move past the end of the token.
124  tmp += len;
125 
126  // Move to the beginning of the next token.
127  while( *tmp && isspace( *tmp ) )
128  tmp++;
129 
130  *aOutput = tmp;
131  }
132 
133  return retv;
134 }

Variable Documentation

const char* delims = " \t\r\n"

Definition at line 73 of file sch_legacy_plugin.cpp.