kicad/cvpcb/listlib.cpp

278 lines
7.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**************/
/* listlib.cpp */
/**************/
/*
* cherche toutes les ref <chemin lib>*.??? si nom fichier prsent,
* ou examine <chemin lib>[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 );
}