bool SCH_LABEL::Load( LINE_READER& aLine, wxString& aErrorMsg ) { char Name1[256]; char Name2[256]; char Name3[256]; int thickness = 0, size = 0, orient = 0; Name1[0] = 0; Name2[0] = 0; Name3[0] = 0; char* sline = (char*) aLine; while( ( *sline != ' ' ) && *sline ) sline++; // sline points the start of parameters int ii = sscanf( sline, "%s %d %d %d %d %s %s %d", Name1, &m_Pos.x, &m_Pos.y, &orient, &size, Name2, Name3, &thickness ); if( ii < 4 ) { aErrorMsg.Printf( wxT( "Eeschema file label load error at line %d" ), aLine.LineNumber() ); return false; } if( !aLine.ReadLine() ) { aErrorMsg.Printf( wxT( "Eeschema file label load error atline %d" ), aLine.LineNumber() ); return false; } if( size == 0 ) size = DEFAULT_SIZE_TEXT; char* text = strtok( (char*) aLine, "\n\r" ); if( text == NULL ) { aErrorMsg.Printf( wxT( "Eeschema file label load error at line %d" ), aLine.LineNumber() ); return false; } m_Text = FROM_UTF8( text ); m_Size.x = m_Size.y = size; SetOrientation( orient ); if( isdigit( Name3[0] ) ) { thickness = atol( Name3 ); m_Bold = ( thickness != 0 ); m_Thickness = m_Bold ? GetPenSizeForBold( size ) : 0; } if( stricmp( Name2, "Italic" ) == 0 ) m_Italic = 1; return true; }
bool BITMAP_BASE::LoadData( LINE_READER& aLine, wxString& aErrorMsg ) { wxMemoryOutputStream stream; char* line; while( true ) { if( !aLine.ReadLine() ) { aErrorMsg = wxT("Unexpected end of data"); return false; } line = aLine.Line(); if( strncasecmp( line, "EndData", 4 ) == 0 ) { // all the PNG date is read. // We expect here m_image and m_bitmap are void m_image = new wxImage(); wxMemoryInputStream istream( stream ); m_image->LoadFile( istream, wxBITMAP_TYPE_PNG ); m_bitmap = new wxBitmap( *m_image ); break; } // Read PNG data, stored in hexadecimal, // each byte = 2 hexadecimal digits and a space between 2 bytes // and put it in memory stream buffer int len = strlen( line ); for( ; len > 0; len -= 3, line += 3 ) { int value = 0; if( sscanf( line, "%X", &value ) == 1 ) stream.PutC( (char) value ); else break; } } return true; }
bool SCH_BITMAP::Load( LINE_READER& aLine, wxString& aErrorMsg ) { char* line = aLine.Line(); if( strncasecmp( line, "$Bitmap", 7 ) != 0 ) { aErrorMsg.Printf( wxT( "Eeschema file bitmap image load error at line %d, aborted" ), aLine.LineNumber() ); aErrorMsg << wxT( "\n" ) << FROM_UTF8( (char*) aLine ); return false; } for( ; ; ) { if( !aLine.ReadLine() ) return false; line = aLine.Line(); if( strncasecmp( line, "Pos", 3 ) == 0 ) { sscanf( line + 3, "%d %d", &m_pos.x, &m_pos.y ); continue; } if( strncasecmp( line, "Scale", 5 ) == 0 ) { double scale = 1.0; sscanf( line + 5, "%lf", &scale ); m_image->SetScale( scale ); continue; } if( strncasecmp( line, "Data", 4 ) == 0 ) { m_image->LoadData( aLine, aErrorMsg ); } if( strncasecmp( line, "$EndBitmap", 4 ) == 0 ) break; } return true; }
bool SCH_BUS_ENTRY_BASE::Load( LINE_READER& aLine, wxString& aErrorMsg, SCH_ITEM **out ) { char Name1[256]; char Name2[256]; char* line = (char*) aLine; *out = NULL; while( (*line != ' ' ) && *line ) line++; if( sscanf( line, "%255s %255s", Name1, Name2 ) != 2 ) { aErrorMsg.Printf( wxT( "Eeschema file bus entry load error at line %d" ), aLine.LineNumber() ); aErrorMsg << wxT( "\n" ) << FROM_UTF8( (char*) aLine ); return false; } SCH_BUS_ENTRY_BASE *this_new; if( Name1[0] == 'B' ) this_new = new SCH_BUS_BUS_ENTRY; else this_new = new SCH_BUS_WIRE_ENTRY; *out = this_new; if( !aLine.ReadLine() || sscanf( (char*) aLine, "%d %d %d %d ", &this_new->m_pos.x, &this_new->m_pos.y, &this_new->m_size.x, &this_new->m_size.y ) != 4 ) { aErrorMsg.Printf( wxT( "Eeschema file bus entry load error at line %d" ), aLine.LineNumber() ); aErrorMsg << wxT( "\n" ) << FROM_UTF8( (char*) aLine ); return false; } this_new->m_size.x -= this_new->m_pos.x; this_new->m_size.y -= this_new->m_pos.y; return true; }
bool SCH_BUS_ENTRY::Load( LINE_READER& aLine, wxString& aErrorMsg ) { char Name1[256]; char Name2[256]; char* line = (char*) aLine; while( (*line != ' ' ) && *line ) line++; if( sscanf( line, "%s %s", Name1, Name2 ) != 2 ) { aErrorMsg.Printf( wxT( "Eeschema file bus entry load error at line %d" ), aLine.LineNumber() ); aErrorMsg << wxT( "\n" ) << FROM_UTF8( (char*) aLine ); return false; } m_Layer = LAYER_WIRE; if( Name1[0] == 'B' ) m_Layer = LAYER_BUS; if( !aLine.ReadLine() || sscanf( (char*) aLine, "%d %d %d %d ", &m_pos.x, &m_pos.y, &m_size.x, &m_size.y ) != 4 ) { aErrorMsg.Printf( wxT( "Eeschema file bus entry load error at line %d" ), aLine.LineNumber() ); aErrorMsg << wxT( "\n" ) << FROM_UTF8( (char*) aLine ); return false; } m_size.x -= m_pos.x; m_size.y -= m_pos.y; return true; }
bool SCH_JUNCTION::Load( LINE_READER& aLine, wxString& aErrorMsg ) { char name[256]; char* line = (char*) aLine; while( (*line != ' ' ) && *line ) line++; if( sscanf( line, "%s %d %d", name, &m_pos.x, &m_pos.y ) != 3 ) { aErrorMsg.Printf( wxT( "Eeschema file connection load error at line %d, aborted" ), aLine.LineNumber() ); aErrorMsg << wxT( "\n" ) << FROM_UTF8( (char*) aLine ); return false; } return true; }
bool SCH_SHEET::Load( LINE_READER& aLine, wxString& aErrorMsg ) { int fieldNdx, size; SCH_SHEET_PIN* sheetPin; char* ptcar; SetTimeStamp( GetNewTimeStamp() ); // sheets are added to the GetDrawItems() like other schematic components. // however, in order to preserve the hierarchy (through m_Parent pointers), // a duplicate of the sheet is added to m_SubSheet array. // must be a duplicate, references just work for a two-layer structure. // this is accomplished through the Sync() function. if( ((char*)aLine)[0] == '$' ) // line should be "$Sheet" { if( !aLine.ReadLine() ) { aErrorMsg.Printf( wxT( "Read File Error" ) ); return false; } } /* Next line: must be "S xx yy nn mm" with xx, yy = sheet position * ( upper left corner ) et nn,mm = sheet size */ if( ( sscanf( &((char*)aLine)[1], "%d %d %d %d", &m_pos.x, &m_pos.y, &m_size.x, &m_size.y ) != 4 ) || ( ((char*)aLine)[0] != 'S' ) ) { aErrorMsg.Printf( wxT( " ** Eeschema file sheet struct error at line %d, aborted\n" ), aLine.LineNumber() ); aErrorMsg << FROM_UTF8( ((char*)aLine) ); return false; } /* Read fields */ for( ; ; ) /* Analysis of lines "Fn" text. */ { if( !aLine.ReadLine() ) return false; if( ((char*)aLine)[0] == 'U' ) { sscanf( ((char*)aLine) + 1, "%lX", &m_TimeStamp ); if( m_TimeStamp == 0 ) // zero is not unique! SetTimeStamp( GetNewTimeStamp() ); continue; } if( ((char*)aLine)[0] != 'F' ) break; sscanf( ((char*)aLine) + 1, "%d", &fieldNdx ); /* Read the field: * If fieldNdx> = 2: Fn "text" t s posx posy * If F0 "text" for SheetName * F1 and "text" for filename */ ptcar = ((char*)aLine); while( *ptcar && ( *ptcar != '"' ) ) ptcar++; if( *ptcar != '"' ) { aErrorMsg.Printf( wxT( "Eeschema file sheet label F%d at line %d, aborted\n" ), fieldNdx, aLine.LineNumber() ); aErrorMsg << FROM_UTF8( (char*) aLine ); return false; } wxString sheetName; ptcar += ReadDelimitedText( &sheetName, ptcar ); if( *ptcar == 0 ) { aErrorMsg.Printf( wxT( "Eeschema file sheet field F at line %d, aborted\n" ), aLine.LineNumber() ); aErrorMsg << FROM_UTF8( (char*) aLine ); return false; } if( ( fieldNdx == 0 ) || ( fieldNdx == 1 ) ) { if( sscanf( ptcar, "%d", &size ) != 1 ) { aErrorMsg.Printf( wxT( "Eeschema file sheet Label error line %d, aborted\n" ), aLine.LineNumber() ); aErrorMsg << FROM_UTF8( (char*) aLine ); } if( size == 0 ) size = DEFAULT_SIZE_TEXT; if( fieldNdx == 0 ) { m_name = sheetName; m_sheetNameSize = size; } else { SetFileName( sheetName ); m_fileNameSize = size; } } if( fieldNdx > 1 ) { sheetPin = new SCH_SHEET_PIN( this ); if( !sheetPin->Load( aLine, aErrorMsg ) ) { delete sheetPin; sheetPin = NULL; return false; } AddPin( sheetPin ); } } if( strnicmp( "$End", ((char*)aLine), 4 ) != 0 ) { aErrorMsg.Printf( wxT( "**Eeschema file end_sheet struct error at line %d, aborted\n" ), aLine.LineNumber() ); aErrorMsg << FROM_UTF8( ((char*)aLine) ); return false; } return true; }
bool LIB_FIELD::Load( LINE_READER& aLineReader, wxString& errorMsg ) { int cnt; char textOrient; char textVisible; char textHJustify; char textVJustify[256]; char* line = (char*) aLineReader; char* limit = line + aLineReader.Length(); if( sscanf( line + 1, "%d", &m_id ) != 1 || m_id < 0 ) { errorMsg = wxT( "invalid field header" ); return false; } // Caller did a strtok(), which inserts a nul, so next few bytes are ugly: // digit(s), a nul, some whitespace, then a double quote. while( line < limit && *line != '"' ) line++; if( line == limit ) return false; line += ReadDelimitedText( &m_Text, line ); // Doctor the *.lib file field which has a "~" in blank fields. New saves will // not save like this, and eventually these two lines can be removed. if( m_Text.size()==1 && m_Text[0]==wxChar( '~' ) ) m_Text.clear(); memset( textVJustify, 0, sizeof( textVJustify ) ); cnt = sscanf( line, " %d %d %d %c %c %c %s", &m_Pos.x, &m_Pos.y, &m_Size.y, &textOrient, &textVisible, &textHJustify, textVJustify ); if( cnt < 5 ) { errorMsg.Printf( wxT( "field %d does not have the correct number of parameters" ), m_id ); return false; } m_Size.x = m_Size.y; if( textOrient == 'H' ) m_Orient = TEXT_ORIENT_HORIZ; else if( textOrient == 'V' ) m_Orient = TEXT_ORIENT_VERT; else { errorMsg.Printf( wxT( "field %d text orientation parameter <%c> is not valid" ), textOrient ); return false; } if( textVisible == 'V' ) m_Attributs &= ~TEXT_NO_VISIBLE; else if ( textVisible == 'I' ) m_Attributs |= TEXT_NO_VISIBLE; else { errorMsg.Printf( wxT( "field %d text visible parameter <%c> is not valid" ), textVisible ); return false; } m_HJustify = GR_TEXT_HJUSTIFY_CENTER; m_VJustify = GR_TEXT_VJUSTIFY_CENTER; if( cnt >= 6 ) { if( textHJustify == 'C' ) m_HJustify = GR_TEXT_HJUSTIFY_CENTER; else if( textHJustify == 'L' ) m_HJustify = GR_TEXT_HJUSTIFY_LEFT; else if( textHJustify == 'R' ) m_HJustify = GR_TEXT_HJUSTIFY_RIGHT; else { errorMsg.Printf( wxT( "field %d text horizontal justification parameter <%c> is not valid" ), textHJustify ); return false; } if( textVJustify[0] == 'C' ) m_VJustify = GR_TEXT_VJUSTIFY_CENTER; else if( textVJustify[0] == 'B' ) m_VJustify = GR_TEXT_VJUSTIFY_BOTTOM; else if( textVJustify[0] == 'T' ) m_VJustify = GR_TEXT_VJUSTIFY_TOP; else { errorMsg.Printf( wxT( "field %d text vertical justification parameter <%c> is not valid" ), textVJustify[0] ); return false; } if ( textVJustify[1] == 'I' ) // Italic m_Italic = true; if ( textVJustify[2] == 'B' ) // Bold m_Bold = true; } // fields in RAM must always have names. if( m_id < MANDATORY_FIELDS ) { // Fields in RAM must always have names, because we are trying to get // less dependent on field ids and more dependent on names. // Plus assumptions are made in the field editors. m_name = TEMPLATE_FIELDNAME::GetDefaultFieldName( m_id ); } else { ReadDelimitedText( &m_name, line ); } return true; }
bool SCH_SHEET_PIN::Load( LINE_READER& aLine, wxString& aErrorMsg ) { int size; char number[256]; char name[256]; char connectType[256]; char sheetSide[256]; char* line = aLine.Line(); char* cp; static const char delims[] = " \t"; // Read coordinates. // D( printf( "line: \"%s\"\n", line );) cp = strtok( line, delims ); strncpy( number, cp, sizeof(number) ); number[sizeof(number)-1] = 0; cp += strlen( number ) + 1; cp += ReadDelimitedText( name, cp, sizeof(name) ); cp = strtok( cp, delims ); strncpy( connectType, cp, sizeof(connectType) ); connectType[sizeof(connectType)-1] = 0; cp = strtok( NULL, delims ); strncpy( sheetSide, cp, sizeof(sheetSide) ); sheetSide[sizeof(sheetSide)-1] = 0; cp += strlen( sheetSide ) + 1; int r = sscanf( cp, "%d %d %d", &m_Pos.x, &m_Pos.y, &size ); if( r != 3 ) { aErrorMsg.Printf( wxT( "Eeschema file sheet hierarchical label error at line %d.\n" ), aLine.LineNumber() ); aErrorMsg << FROM_UTF8( line ); return false; } m_Text = FROM_UTF8( name ); if( size == 0 ) size = GetDefaultTextSize(); m_Size.x = m_Size.y = size; switch( connectType[0] ) { case 'I': m_shape = NET_INPUT; break; case 'O': m_shape = NET_OUTPUT; break; case 'B': m_shape = NET_BIDI; break; case 'T': m_shape = NET_TRISTATE; break; case 'U': m_shape = NET_UNSPECIFIED; break; } switch( sheetSide[0] ) { case 'R' : /* pin on right side */ SetEdge( 1 ); break; case 'T' : /* pin on top side */ SetEdge( 2 ); break; case 'B' : /* pin on bottom side */ SetEdge( 3 ); break; case 'L' : /* pin on left side */ default : SetEdge( 0 ); break; } return true; }
bool SCH_TEXT::Load( LINE_READER& aLine, wxString& aErrorMsg ) { char Name1[256]; char Name2[256]; char Name3[256]; int thickness = 0, size = 0, orient = 0; Name1[0] = 0; Name2[0] = 0; Name3[0] = 0; char* sline = (char*) aLine; while( ( *sline != ' ' ) && *sline ) sline++; // sline points the start of parameters int ii = sscanf( sline, "%255s %d %d %d %d %255s %255s %d", Name1, &m_Pos.x, &m_Pos.y, &orient, &size, Name2, Name3, &thickness ); if( ii < 4 ) { aErrorMsg.Printf( wxT( "Eeschema file text load error at line %d" ), aLine.LineNumber() ); return false; } if( !aLine.ReadLine() ) { aErrorMsg.Printf( wxT( "Eeschema file text load error at line %d" ), aLine.LineNumber() ); return false; } if( size == 0 ) size = GetDefaultTextSize(); char* text = strtok( (char*) aLine, "\n\r" ); if( text == NULL ) { aErrorMsg.Printf( wxT( "Eeschema file text load error at line %d" ), aLine.LineNumber() ); return false; } wxString val = FROM_UTF8( text ); for( ; ; ) { int i = val.find( wxT( "\\n" ) ); if( i == wxNOT_FOUND ) break; val.erase( i, 2 ); val.insert( i, wxT( "\n" ) ); } m_Text = val; m_Size.x = m_Size.y = size; SetOrientation( orient ); if( isdigit( Name3[0] ) ) { thickness = atol( Name3 ); m_Bold = ( thickness != 0 ); m_Thickness = m_Bold ? GetPenSizeForBold( size ) : 0; } if( strnicmp( Name2, "Italic", 6 ) == 0 ) m_Italic = 1; return true; }
bool SCH_HIERLABEL::Load( LINE_READER& aLine, wxString& aErrorMsg ) { char Name1[256]; char Name2[256]; char Name3[256]; int thickness = 0, size = 0, orient = 0; Name1[0] = 0; Name2[0] = 0; Name3[0] = 0; char* sline = (char*) aLine; while( (*sline != ' ' ) && *sline ) sline++; // sline points the start of parameters int ii = sscanf( sline, "%255s %d %d %d %d %255s %255s %d", Name1, &m_Pos.x, &m_Pos.y, &orient, &size, Name2, Name3, &thickness ); if( ii < 4 ) { aErrorMsg.Printf( wxT( "Eeschema file hierarchical label load error at line %d" ), aLine.LineNumber() ); return false; } if( !aLine.ReadLine() ) { aErrorMsg.Printf( wxT( "Eeschema file hierarchical label load error at line %d" ), aLine.LineNumber() ); return false; } if( size == 0 ) size = GetDefaultTextSize(); char* text = strtok( (char*) aLine, "\n\r" ); if( text == NULL ) { aErrorMsg.Printf( wxT( "Eeschema file hierarchical label load error at line %d" ), aLine.LineNumber() ); return false; } m_Text = FROM_UTF8( text ); m_Size.x = m_Size.y = size; SetOrientation( orient ); m_shape = NET_INPUT; m_Bold = ( thickness != 0 ); m_Thickness = m_Bold ? GetPenSizeForBold( size ) : 0; if( stricmp( Name2, SheetLabelType[NET_OUTPUT] ) == 0 ) m_shape = NET_OUTPUT; if( stricmp( Name2, SheetLabelType[NET_BIDI] ) == 0 ) m_shape = NET_BIDI; if( stricmp( Name2, SheetLabelType[NET_TRISTATE] ) == 0 ) m_shape = NET_TRISTATE; if( stricmp( Name2, SheetLabelType[NET_UNSPECIFIED] ) == 0 ) m_shape = NET_UNSPECIFIED; if( stricmp( Name3, "Italic" ) == 0 ) m_Italic = 1; return true; }