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>

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)
 

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"

Function Documentation

static bool is_eol ( char  c)
static

Definition at line 83 of file sch_legacy_plugin.cpp.

Referenced by SCH_LEGACY_PLUGIN_CACHE::loadText().

84 {
85  // The default file eol character used internally by KiCad.
86  // |
87  // | Possible eol if someone edited the file by hand on certain platforms.
88  // | |
89  // | | May have gone past eol with strtok().
90  // | | |
91  if( c == '\n' || c == '\r' || c == 0 )
92  return true;
93 
94  return false;
95 }
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 283 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().

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

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

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 148 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().

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

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

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

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

Variable Documentation

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

Definition at line 72 of file sch_legacy_plugin.cpp.

Referenced by SCH_SHEET_PIN::Load().