int FPID::Parse( const UTF8& aId ) { clear(); size_t cnt = aId.length() + 1; char tmp[cnt]; // C string for speed std::strcpy( tmp, aId.c_str() ); const char* rev = EndsWithRev( tmp, tmp+aId.length(), '/' ); size_t revNdx; size_t partNdx; int offset; //=====<revision>========================================= if( rev ) { revNdx = rev - aId.c_str(); // no need to check revision, EndsWithRev did that. revision = aId.substr( revNdx ); --revNdx; // back up to omit the '/' which precedes the rev } else { revNdx = aId.size(); } //=====<nickname>========================================== if( ( partNdx = aId.find( ':' ) ) != aId.npos ) { offset = SetLibNickname( aId.substr( 0, partNdx ) ); if( offset > -1 ) { return offset; } ++partNdx; // skip ':' } else { partNdx = 0; } //=====<footprint name>==================================== if( partNdx >= revNdx ) return partNdx; SetFootprintName( aId.substr( partNdx, revNdx ) ); return -1; }
int FPID::Parse( const UTF8& aId ) { clear(); const char* buffer = aId.c_str(); const char* rev = EndsWithRev( buffer, buffer+aId.length(), '/' ); size_t revNdx; size_t partNdx; int offset; //=====<revision>========================================= // in a FPID like discret:R3/rev4 if( rev ) { revNdx = rev - buffer; // no need to check revision, EndsWithRev did that. revision = aId.substr( revNdx ); --revNdx; // back up to omit the '/' which precedes the rev } else { revNdx = aId.size(); } //=====<nickname>========================================== if( ( partNdx = aId.find( ':' ) ) != aId.npos ) { offset = SetLibNickname( aId.substr( 0, partNdx ) ); if( offset > -1 ) { return offset; } ++partNdx; // skip ':' } else { partNdx = 0; } //=====<footprint name>==================================== if( partNdx >= revNdx ) return partNdx; // Error: no footprint name. // Be sure the footprint name is valid. // Some chars can be found in board file (in old board files // or converted files from an other EDA tool std::string fpname = aId.substr( partNdx, revNdx-partNdx ); ReplaceIllegalFileNameChars( &fpname, '_' ); SetFootprintName( UTF8( fpname ) ); return -1; }
static void generateJSONString(Error& error, const HOutputStream& out, const UTF8& s) { UTF16Buffer sb(2 + s.length() + 1); sb << '"'; if (error) return; for (const Chr8* p = s.ptr(); (*p) != '\0'; p++) { Chr8 c = *p; switch (c) { case '\"' : sb << '\\' << '\"'; break; case '\\' : sb << '\\' << '\\'; break; case '/' : sb << '\\' << '/'; break; case '\b' : sb << '\\' << 'b'; break; case '\f' : sb << '\\' << 'f'; break; case '\n' : sb << '\\' << 'n'; break; case '\r' : sb << '\\' << 'r'; break; case '\t' : sb << '\\' << 't'; break; default: if (c >= 0x20) { sb << c; } else { sb << UTF8("\\u00") << UTF8::format("%.2X",UInt32(c)); } break; } } sb << '"'; out->twrite(error, UTF8(sb)); };