/**************/ /* listlib.cpp */ /**************/ /* * cherche toutes les ref *.??? si nom fichier pr‚sent, * ou examine [MODULE.LIB] */ #include "fctsys.h" #include "wxstruct.h" #include "common.h" #include "confirm.h" #include "kicad_string.h" #include "gestfich.h" #include "cvpcb.h" #include "protos.h" FILE* name_libmodules; /* pour lecture librairie */ /* routines locales : */ static void ReadDocLib( const wxString& ModLibName ); static int LibCompare( void* mod1, void* mod2 ); static STOREMOD* TriListeModules( STOREMOD* BaseListe, int nbitems ); /**/ /*********************/ int listlib() /*********************/ /* Routine lisant la liste des librairies, et generant la liste chainee * des modules disponibles * * Module descr format: * $MODULE c64acmd * Li c64acmd * Cd Connecteur DIN Europe 96 Contacts AC male droit * Kw PAD_CONN DIN * $EndMODULE * */ { char buffer[1024]; wxString FullLibName; int errorlevel = 0, end; int flag_librairie; STOREMOD* ItemLib; unsigned ii; wxString msg; if( g_BaseListePkg ) /* Liste Deja existante, a supprimer */ { FreeMemoryModules(); g_BaseListePkg = NULL; } if( g_LibName_List.GetCount() == 0 ) return -4; /* init recherche */ SetRealLibraryPath( wxT( "modules" ) ); nblib = 0; /* Lecture des Librairies */ for( ii = 0; ii < g_LibName_List.GetCount(); ii++ ) { /* Calcul du nom complet de la librairie */ FullLibName = MakeFileName( g_RealLibDirBuffer, g_LibName_List[ii], LibExtBuffer ); /* acces a une librairie */ if( ( name_libmodules = wxFopen( FullLibName, wxT( "rt" ) ) ) == NULL ) { msg.Printf( _( "Library file <%s> not found" ), FullLibName.GetData() ); DisplayError( NULL, msg, 20 ); continue; } /* Controle du type de la librairie : */ flag_librairie = 0; fgets( buffer, 32, name_libmodules ); if( strncmp( buffer, ENTETE_LIBRAIRIE, L_ENTETE_LIB ) != 0 ) { msg.Printf( _( "Library file <%s> is not a module library" ), FullLibName.GetData() ); DisplayError( NULL, msg, 20 ); fclose( name_libmodules ); continue; } /* Lecture du nombre de composants */ fseek( name_libmodules, 0, 0 ); /* lecture nom des composants : */ end = 0; while( !end && fgets( buffer, 255, name_libmodules ) != NULL ) { if( strnicmp( buffer, "$INDEX", 6 ) == 0 ) { while( fgets( buffer, 255, name_libmodules ) != NULL ) { if( strnicmp( buffer, "$EndINDEX", 6 ) == 0 ) { end = 1; break; } ItemLib = new STOREMOD(); ItemLib->Pnext = g_BaseListePkg; g_BaseListePkg = ItemLib; ItemLib->m_Module = CONV_FROM_UTF8( StrPurge( buffer ) ); ItemLib->m_LibName = FullLibName; nblib++; } if( !end ) errorlevel = -3; } } fclose( name_libmodules ); ReadDocLib( FullLibName ); } /* classement alphabetique: */ if( g_BaseListePkg ) g_BaseListePkg = TriListeModules( g_BaseListePkg, nblib ); return errorlevel; } /************************************************/ static int LibCompare( void* mod1, void* mod2 ) /************************************************/ /* * routine compare() pour qsort() en classement alphabétique des modules */ { int ii; STOREMOD* pt1, * pt2; pt1 = *( (STOREMOD**) mod1 ); pt2 = *( (STOREMOD**) mod2 ); ii = StrNumICmp( pt1->m_Module.GetData(), pt2->m_Module.GetData() ); return ii; } /********************************************************************/ static STOREMOD* TriListeModules( STOREMOD* BaseListe, int nbitems ) /********************************************************************/ /* Tri la liste des Modules par ordre alphabetique et met a jour * le nouveau chainage avant/arriere * retourne un pointeur sur le 1er element de la liste */ { STOREMOD** bufferptr, * Item; int ii, nb; if( nbitems <= 0 ) return NULL; if( BaseListe == NULL ) return NULL; if( nbitems == 1 ) return BaseListe; // Tri inutile et impossible bufferptr = (STOREMOD**) MyZMalloc( (nbitems + 3) * sizeof(STOREMOD*) ); for( ii = 1, nb = 0, Item = BaseListe; Item != NULL; Item = Item->Pnext, ii++ ) { nb++; bufferptr[ii] = Item; } /* ici bufferptr[0] = NULL et bufferptr[nbitem+1] = NULL et ces 2 valeurs * representent le chainage arriere du 1er element ( = NULL), * et le chainage avant du dernier element ( = NULL ) */ qsort( bufferptr + 1, nb, sizeof(STOREMOD*), ( int( * ) ( const void*, const void* ) )LibCompare ); /* Mise a jour du chainage */ for( ii = 1; ii <= nb; ii++ ) { Item = bufferptr[ii]; Item->m_Num = ii; Item->Pnext = bufferptr[ii + 1]; Item->Pback = bufferptr[ii - 1]; } Item = bufferptr[1]; MyFree( bufferptr ); return Item; } /***************************************************/ static void ReadDocLib( const wxString& ModLibName ) /***************************************************/ /* Routine de lecture du fichier Doc associe a la librairie ModLibName. * Cree en memoire la chaine liste des docs pointee par MList * ModLibName = full file Name de la librairie Modules */ { STOREMOD* NewMod; char Line[1024]; wxString ModuleName; wxString docfilename; FILE* LibDoc; docfilename = ModLibName; ChangeFileNameExt( docfilename, EXT_DOC ); if( ( LibDoc = wxFopen( docfilename, wxT( "rt" ) ) ) == NULL ) return; GetLine( LibDoc, Line, NULL, sizeof(Line) - 1 ); if( strnicmp( Line, ENTETE_LIBDOC, L_ENTETE_LIB ) != 0 ) return; /* Lecture de la librairie */ while( GetLine( LibDoc, Line, NULL, sizeof(Line) - 1 ) ) { NewMod = NULL; if( Line[0] != '$' ) continue; if( Line[1] == 'E' ) break;; if( Line[1] == 'M' ) /* Debut decription 1 module */ { while( GetLine( LibDoc, Line, NULL, sizeof(Line) - 1 ) ) { if( Line[0] == '$' ) /* $EndMODULE */ break; switch( Line[0] ) { case 'L': /* LibName */ ModuleName = CONV_FROM_UTF8( StrPurge( Line + 3 ) ); NewMod = g_BaseListePkg; while( NewMod ) { if( ModuleName == NewMod->m_Module ) break; NewMod = NewMod->Pnext; } break; case 'K': /* KeyWords */ if( NewMod && (!NewMod->m_KeyWord) ) NewMod->m_KeyWord = CONV_FROM_UTF8( StrPurge( Line + 3 ) ); break; case 'C': /* Doc */ if( NewMod && (!NewMod->m_Doc ) ) NewMod->m_Doc = CONV_FROM_UTF8( StrPurge( Line + 3 ) ); break; } } } /* lecture 1 descr module */ } /* Fin lecture librairie */ fclose( LibDoc ); }