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 <pgm_base.h>
#include <draw_graphic_text.h>
#include <kiway.h>
#include <kicad_string.h>
#include <richio.h>
#include <core/typeinfo.h>
#include <properties.h>
#include <trace_helpers.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 <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>
#include <confirm.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"
 

Macro Definition Documentation

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

Definition at line 79 of file sch_legacy_plugin.cpp.

Referenced by SCH_LEGACY_PLUGIN::loadWire().

#define T_COLORA   "rgba"

Definition at line 80 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 84 of file sch_legacy_plugin.cpp.

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

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

276 {
277  while( *aCurrentToken && isspace( *aCurrentToken ) )
278  aCurrentToken++;
279 
280  if( !*aCurrentToken )
281  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aCurrentToken );
282 
283  if( !isspace( *( aCurrentToken + 1 ) ) )
284  SCH_PARSE_ERROR( "expected single character token", aReader, aCurrentToken );
285 
286  if( aNextToken )
287  {
288  const char* next = aCurrentToken + 2;
289 
290  while( *next && isspace( *next ) )
291  next++;
292 
293  *aNextToken = next;
294  }
295 
296  return *aCurrentToken;
297 }
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 233 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().

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

189 {
190  if( !*aLine )
191  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aLine );
192 
193  unsigned long retv;
194 
195  // Clear errno before calling strtoul() in case some other crt call set it.
196  errno = 0;
197  retv = strtoul( aLine, (char**) aOutput, 16 );
198 
199  // Make sure no error occurred when calling strtoul().
200  if( errno == ERANGE )
201  SCH_PARSE_ERROR( "invalid hexadecimal number", aReader, aLine );
202 
203  // Strip off whitespace before the next token.
204  if( aOutput )
205  {
206  // const char* next = aLine + strlen( token );
207 
208  const char* next = *aOutput;
209 
210  while( *next && isspace( *next ) )
211  next++;
212 
213  *aOutput = next;
214  }
215 
216  return retv;
217 }
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 145 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().

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

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

317 {
318  if( !*aCurrentToken )
319  {
320  if( aCanBeEmpty )
321  return;
322  else
323  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aCurrentToken );
324  }
325 
326  const char* tmp = aCurrentToken;
327 
328  while( *tmp && isspace( *tmp ) )
329  tmp++;
330 
331  if( !*tmp )
332  {
333  if( aCanBeEmpty )
334  return;
335  else
336  SCH_PARSE_ERROR( _( "unexpected end of line" ), aReader, aCurrentToken );
337  }
338 
339  std::string utf8;
340 
341  while( *tmp && !isspace( *tmp ) )
342  utf8 += *tmp++;
343 
344  aString = FROM_UTF8( utf8.c_str() );
345 
346  if( aString.IsEmpty() && !aCanBeEmpty )
347  SCH_PARSE_ERROR( _( "expected unquoted string" ), aReader, aCurrentToken );
348 
349  if( aNextToken )
350  {
351  const char* next = tmp;
352 
353  while( *next && isspace( *next ) )
354  next++;
355 
356  *aNextToken = next;
357  }
358 }
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 108 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().

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

Variable Documentation

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

Definition at line 75 of file sch_legacy_plugin.cpp.