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 <lib_field.h>
#include <sch_bus_entry.h>
#include <sch_marker.h>
#include <sch_junction.h>
#include <sch_line.h>
#include <sch_no_connect.h>
#include <sch_component.h>
#include <sch_text.h>
#include <sch_sheet.h>
#include <sch_bitmap.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_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
 Class SCH_LEGACY_PLUGIN_CACHE is 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)
 Function strCompare. More...
 
static int parseInt (FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
 Function parseInt. More...
 
static unsigned long parseHex (FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
 Function parseHex. More...
 
static double parseDouble (FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
 Function parseDouble. More...
 
static char parseChar (FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL)
 Function parseChar. More...
 
static void parseUnquotedString (wxString &aString, FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL, bool aCanBeEmpty=false)
 Function parseUnquotedString. More...
 
static void parseQuotedString (wxString &aString, FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL, bool aCanBeEmpty=false)
 Function parseQuotedString. 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

Function parseChar.

parses 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
AnIO_ERROR on an unexpected end of line.
APARSE_ERROR if the parsed token is not a a single character token.

Definition at line 289 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().

291 {
292  while( *aCurrentToken && isspace( *aCurrentToken ) )
293  aCurrentToken++;
294 
295  if( !*aCurrentToken )
296  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aCurrentToken );
297 
298  if( !isspace( *( aCurrentToken + 1 ) ) )
299  SCH_PARSE_ERROR( "expected single character token", aReader, aCurrentToken );
300 
301  if( aNextToken )
302  {
303  const char* next = aCurrentToken + 2;
304 
305  while( *next && isspace( *next ) )
306  next++;
307 
308  *aNextToken = next;
309  }
310 
311  return *aCurrentToken;
312 }
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

Function parseDouble.

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
AnIO_ERROR on an unexpected end of line.
APARSE_ERROR if the parsed token is not a valid integer.

Definition at line 246 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().

248 {
249  if( !*aLine )
250  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aLine );
251 
252  // Clear errno before calling strtod() in case some other crt call set it.
253  errno = 0;
254 
255  double retv = strtod( aLine, (char**) aOutput );
256 
257  // Make sure no error occurred when calling strtod().
258  if( errno == ERANGE )
259  SCH_PARSE_ERROR( "invalid floating point number", aReader, aLine );
260 
261  // strtod does not strip off whitespace before the next token.
262  if( aOutput )
263  {
264  const char* next = *aOutput;
265 
266  while( *next && isspace( *next ) )
267  next++;
268 
269  *aOutput = next;
270  }
271 
272  return retv;
273 }
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

Function parseHex.

parses 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
AnIO_ERROR on an unexpected end of line.
APARSE_ERROR if the parsed token is not a valid integer.

Definition at line 198 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().

200 {
201  if( !*aLine )
202  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aLine );
203 
204  unsigned long retv;
205 
206  // Clear errno before calling strtoul() in case some other crt call set it.
207  errno = 0;
208  retv = strtoul( aLine, (char**) aOutput, 16 );
209 
210  // Make sure no error occurred when calling strtoul().
211  if( errno == ERANGE )
212  SCH_PARSE_ERROR( "invalid hexadecimal number", aReader, aLine );
213 
214  // Strip off whitespace before the next token.
215  if( aOutput )
216  {
217  // const char* next = aLine + strlen( token );
218 
219  const char* next = *aOutput;
220 
221  while( *next && isspace( *next ) )
222  next++;
223 
224  *aOutput = next;
225  }
226 
227  return retv;
228 }
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

Function parseInt.

parses 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 154 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().

155 {
156  if( !*aLine )
157  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aLine );
158 
159  // Clear errno before calling strtol() in case some other crt call set it.
160  errno = 0;
161 
162  long retv = strtol( aLine, (char**) aOutput, 10 );
163 
164  // Make sure no error occurred when calling strtol().
165  if( errno == ERANGE )
166  SCH_PARSE_ERROR( "invalid integer value", aReader, aLine );
167 
168  // strtol does not strip off whitespace before the next token.
169  if( aOutput )
170  {
171  const char* next = *aOutput;
172 
173  while( *next && isspace( *next ) )
174  next++;
175 
176  *aOutput = next;
177  }
178 
179  return (int) retv;
180 }
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

Function parseQuotedString.

parses 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
AnIO_ERROR on an unexpected end of line.
APARSE_ERROR if the aCanBeEmpty is false and no string was parsed.

Definition at line 395 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().

398 {
399  if( !*aCurrentToken )
400  {
401  if( aCanBeEmpty )
402  return;
403  else
404  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aCurrentToken );
405  }
406 
407  const char* tmp = aCurrentToken;
408 
409  while( *tmp && isspace( *tmp ) )
410  tmp++;
411 
412  if( !*tmp )
413  {
414  if( aCanBeEmpty )
415  return;
416  else
417  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aCurrentToken );
418  }
419 
420  // Verify opening quote.
421  if( *tmp != '"' )
422  SCH_PARSE_ERROR( "expecting opening quote", aReader, aCurrentToken );
423 
424  tmp++;
425 
426  std::string utf8; // utf8 without escapes and quotes.
427 
428  // Fetch everything up to closing quote.
429  while( *tmp )
430  {
431  if( *tmp == '\\' )
432  {
433  tmp++;
434 
435  if( !*tmp )
436  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aCurrentToken );
437 
438  // Do not copy the escape byte if it is followed by \ or "
439  if( *tmp != '"' && *tmp != '\\' )
440  utf8 += '\\';
441 
442  utf8 += *tmp;
443  }
444  else if( *tmp == '"' ) // Closing double quote.
445  {
446  break;
447  }
448  else
449  {
450  utf8 += *tmp;
451  }
452 
453  tmp++;
454  }
455 
456  aString = FROM_UTF8( utf8.c_str() );
457 
458  if( aString.IsEmpty() && !aCanBeEmpty )
459  SCH_PARSE_ERROR( "expected quoted string", aReader, aCurrentToken );
460 
461  if( *tmp && *tmp != '"' )
462  SCH_PARSE_ERROR( "no closing quote for string found", aReader, tmp );
463 
464  // Move past the closing quote.
465  tmp++;
466 
467  if( aNextToken )
468  {
469  const char* next = tmp;
470 
471  while( *next && *next == ' ' )
472  next++;
473 
474  *aNextToken = next;
475  }
476 }
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

Function parseUnquotedString.

parses 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
AnIO_ERROR on an unexpected end of line.
APARSE_ERROR if the aCanBeEmpty is false and no string was parsed.

Definition at line 331 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().

334 {
335  if( !*aCurrentToken )
336  {
337  if( aCanBeEmpty )
338  return;
339  else
340  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aCurrentToken );
341  }
342 
343  const char* tmp = aCurrentToken;
344 
345  while( *tmp && isspace( *tmp ) )
346  tmp++;
347 
348  if( !*tmp )
349  {
350  if( aCanBeEmpty )
351  return;
352  else
353  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aCurrentToken );
354  }
355 
356  std::string utf8;
357 
358  while( *tmp && !isspace( *tmp ) )
359  utf8 += *tmp++;
360 
361  aString = FROM_UTF8( utf8.c_str() );
362 
363  if( aString.IsEmpty() && !aCanBeEmpty )
364  SCH_PARSE_ERROR( _( "expected unquoted string" ), aReader, aCurrentToken );
365 
366  if( aNextToken )
367  {
368  const char* next = tmp;
369 
370  while( *next && isspace( *next ) )
371  next++;
372 
373  *aNextToken = next;
374  }
375 }
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

Function strCompare.

compares 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 115 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().

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

Variable Documentation

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

Definition at line 73 of file sch_legacy_plugin.cpp.