fill out more /new files
This commit is contained in:
parent
916f80f1b4
commit
4f956712e2
|
@ -6,6 +6,8 @@ eeschema/cmp_library_keywords.*
|
||||||
eeschema/template_fieldnames_keywords.*
|
eeschema/template_fieldnames_keywords.*
|
||||||
eeschema/template_fieldnames_lexer.h
|
eeschema/template_fieldnames_lexer.h
|
||||||
new/html
|
new/html
|
||||||
|
new/sch_lib_table_keywords.cpp
|
||||||
|
new/sch_lib_table_lexer.h
|
||||||
pcbnew/dialogs/dialog_freeroute_exchange_help_html.h
|
pcbnew/dialogs/dialog_freeroute_exchange_help_html.h
|
||||||
Makefile
|
Makefile
|
||||||
CMakeFiles
|
CMakeFiles
|
||||||
|
|
|
@ -120,6 +120,7 @@ mark_as_advanced(KICAD_BIN
|
||||||
KICAD_DEMOS
|
KICAD_DEMOS
|
||||||
KICAD_TEMPLATE)
|
KICAD_TEMPLATE)
|
||||||
|
|
||||||
|
include(Functions)
|
||||||
|
|
||||||
#================================================
|
#================================================
|
||||||
# Find libraries that are needed to build KiCad.
|
# Find libraries that are needed to build KiCad.
|
||||||
|
|
|
@ -144,8 +144,8 @@ set( sourceFileHeader
|
||||||
* your DSN lexer.
|
* your DSN lexer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include \"fctsys.h\"
|
//#include \"fctsys.h\"
|
||||||
#include \"macros.h\"
|
//#include \"macros.h\"
|
||||||
|
|
||||||
#include \"${result}_lexer.h\"
|
#include \"${result}_lexer.h\"
|
||||||
|
|
||||||
|
@ -241,9 +241,9 @@ public:
|
||||||
/**
|
/**
|
||||||
* Constructor ${RESULT}_LEXER
|
* Constructor ${RESULT}_LEXER
|
||||||
* takes @a aFile already opened for reading and @a aFilename as parameters.
|
* takes @a aFile already opened for reading and @a aFilename as parameters.
|
||||||
* The opened file is not closed by this class, and is assumed to be positioned
|
* The opened file is assumed to be positioned at the beginning of the file
|
||||||
* at the beginning of the file for purposes of accurate line number reporting
|
* for purposes of accurate line number reporting in error messages. The
|
||||||
* in error messages.
|
* FILE is closed by this instance when its destructor is called.
|
||||||
* @param aFile is a FILE already opened for reading.
|
* @param aFile is a FILE already opened for reading.
|
||||||
* @param aFilename is the name of the opened file, needed for error reporting.
|
* @param aFilename is the name of the opened file, needed for error reporting.
|
||||||
*/
|
*/
|
||||||
|
@ -333,7 +333,7 @@ class ${RESULT}_PARSER : public ${RESULT}_LEXER
|
||||||
file( APPEND "${outCppFile}"
|
file( APPEND "${outCppFile}"
|
||||||
"};
|
"};
|
||||||
|
|
||||||
const unsigned ${result}_keyword_count = DIM( ${result}_keywords );
|
const unsigned ${result}_keyword_count = unsigned( sizeof( ${result}_keywords )/sizeof( ${result}_keywords[0] ) );
|
||||||
|
|
||||||
} // End namespace DSN
|
} // End namespace DSN
|
||||||
"
|
"
|
||||||
|
|
|
@ -105,25 +105,11 @@ set(PCB_COMMON_SRCS
|
||||||
add_library(pcbcommon ${PCB_COMMON_SRCS})
|
add_library(pcbcommon ${PCB_COMMON_SRCS})
|
||||||
|
|
||||||
# auto-generate netlist_lexer.h and netlist_keywords.cpp
|
# auto-generate netlist_lexer.h and netlist_keywords.cpp
|
||||||
set( inputFile ${CMAKE_CURRENT_SOURCE_DIR}/netlist.keywords )
|
make_lexer(
|
||||||
set( outHeaderFile ${PROJECT_SOURCE_DIR}/include/netlist_lexer.h )
|
${CMAKE_CURRENT_SOURCE_DIR}/netlist.keywords
|
||||||
set( outCppFile ${CMAKE_CURRENT_SOURCE_DIR}/netlist_keywords.cpp )
|
${PROJECT_SOURCE_DIR}/include/netlist_lexer.h
|
||||||
set( enum NL_T )
|
${CMAKE_CURRENT_SOURCE_DIR}/netlist_keywords.cpp
|
||||||
add_custom_command(
|
NL_T
|
||||||
OUTPUT ${outHeaderFile}
|
|
||||||
${outCppFile}
|
|
||||||
COMMAND ${CMAKE_COMMAND}
|
|
||||||
-Denum=${enum}
|
|
||||||
-DinputFile=${inputFile}
|
|
||||||
-DoutHeaderFile=${outHeaderFile}
|
|
||||||
-DoutCppFile=${outCppFile}
|
|
||||||
-P ${CMAKE_MODULE_PATH}/TokenList2DsnLexer.cmake
|
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/netlist.keywords
|
|
||||||
${CMAKE_MODULE_PATH}/TokenList2DsnLexer.cmake
|
|
||||||
COMMENT "TokenList2DsnLexer.cmake creating:
|
|
||||||
${outHeaderFile} and
|
|
||||||
${outCppFile} from
|
|
||||||
${inputFile}"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# The dsntest may not build properly using MS Visual Studio.
|
# The dsntest may not build properly using MS Visual Studio.
|
||||||
|
|
|
@ -170,47 +170,18 @@ endif(APPLE)
|
||||||
|
|
||||||
# auto-generate cmp_library_lexer.h and cmp_library_keywords.cpp for the component
|
# auto-generate cmp_library_lexer.h and cmp_library_keywords.cpp for the component
|
||||||
# library format.
|
# library format.
|
||||||
set( inputFile ${CMAKE_CURRENT_SOURCE_DIR}/cmp_library.keywords )
|
make_lexer(
|
||||||
set( outHeaderFile ${CMAKE_CURRENT_SOURCE_DIR}/cmp_library_lexer.h )
|
${CMAKE_CURRENT_SOURCE_DIR}/cmp_library.keywords
|
||||||
set( outCppFile ${CMAKE_CURRENT_SOURCE_DIR}/cmp_library_keywords.cpp )
|
${CMAKE_CURRENT_SOURCE_DIR}/cmp_library_lexer.h
|
||||||
set( enum TLIB_T )
|
${CMAKE_CURRENT_SOURCE_DIR}/cmp_library_keywords.cpp
|
||||||
add_custom_command(
|
TLIB_T
|
||||||
OUTPUT ${outHeaderFile}
|
|
||||||
${outCppFile}
|
|
||||||
COMMAND ${CMAKE_COMMAND}
|
|
||||||
-Denum=${enum}
|
|
||||||
-DinputFile=${inputFile}
|
|
||||||
-DoutHeaderFile=${outHeaderFile}
|
|
||||||
-DoutCppFile=${outCppFile}
|
|
||||||
-P ${CMAKE_MODULE_PATH}/TokenList2DsnLexer.cmake
|
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/cmp_library.keywords
|
|
||||||
${CMAKE_MODULE_PATH}/TokenList2DsnLexer.cmake
|
|
||||||
COMMENT "TokenList2DsnLexer.cmake creating:
|
|
||||||
${outHeaderFile} and
|
|
||||||
${outCppFile} from
|
|
||||||
${inputFile}"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
make_lexer(
|
||||||
set( inputFile ${CMAKE_CURRENT_SOURCE_DIR}/template_fieldnames.keywords )
|
${CMAKE_CURRENT_SOURCE_DIR}/template_fieldnames.keywords
|
||||||
set( outHeaderFile ${CMAKE_CURRENT_SOURCE_DIR}/template_fieldnames_lexer.h )
|
${CMAKE_CURRENT_SOURCE_DIR}/template_fieldnames_lexer.h
|
||||||
set( outCppFile ${CMAKE_CURRENT_SOURCE_DIR}/template_fieldnames_keywords.cpp )
|
${CMAKE_CURRENT_SOURCE_DIR}/template_fieldnames_keywords.cpp
|
||||||
set( enum TFIELD_T )
|
TFIELD_T
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${outHeaderFile}
|
|
||||||
${outCppFile}
|
|
||||||
COMMAND ${CMAKE_COMMAND}
|
|
||||||
-Denum=${enum}
|
|
||||||
-DinputFile=${inputFile}
|
|
||||||
-DoutHeaderFile=${outHeaderFile}
|
|
||||||
-DoutCppFile=${outCppFile}
|
|
||||||
-P ${CMAKE_MODULE_PATH}/TokenList2DsnLexer.cmake
|
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/cmp_library.keywords
|
|
||||||
${CMAKE_MODULE_PATH}/TokenList2DsnLexer.cmake
|
|
||||||
COMMENT "TokenList2DsnLexer.cmake creating:
|
|
||||||
${outHeaderFile} and
|
|
||||||
${outCppFile} from
|
|
||||||
${inputFile}"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
add_executable(eeschema WIN32 MACOSX_BUNDLE ${EESCHEMA_SRCS} ${EESCHEMA_EXTRA_SRCS}
|
add_executable(eeschema WIN32 MACOSX_BUNDLE ${EESCHEMA_SRCS} ${EESCHEMA_EXTRA_SRCS}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include "template_fieldnames.h"
|
#include "template_fieldnames.h"
|
||||||
#include "dsnlexer.h"
|
#include "dsnlexer.h"
|
||||||
|
#include "fctsys.h"
|
||||||
#include "macros.h"
|
#include "macros.h"
|
||||||
|
|
||||||
using namespace DSN; // enum TFIELD_T is in this namespace
|
using namespace DSN; // enum TFIELD_T is in this namespace
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <boost/ptr_container/ptr_vector.hpp>
|
#include <boost/ptr_container/ptr_vector.hpp>
|
||||||
|
|
||||||
#include "fctsys.h"
|
//#include "fctsys.h"
|
||||||
|
|
||||||
#include "richio.h"
|
#include "richio.h"
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,8 @@ if( STAND_ALONE )
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "-Wall -g3 -ggdb3 -DDEBUG")
|
set(CMAKE_CXX_FLAGS_DEBUG "-Wall -g3 -ggdb3 -DDEBUG")
|
||||||
endif(CMAKE_COMPILER_IS_GNUCXX)
|
endif(CMAKE_COMPILER_IS_GNUCXX)
|
||||||
|
|
||||||
|
include(Functions)
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
@ -59,8 +61,19 @@ endif()
|
||||||
include_directories( ${CMAKE_CURRENT_SOURCE_DIR} )
|
include_directories( ${CMAKE_CURRENT_SOURCE_DIR} )
|
||||||
|
|
||||||
add_executable( test_dir_lib_source sch_dir_lib_source.cpp )
|
add_executable( test_dir_lib_source sch_dir_lib_source.cpp )
|
||||||
#add_executable( test_dir_lib_source EXCLUDE_FROM_ALL sch_dir_lib_source.cpp )
|
|
||||||
|
|
||||||
target_link_libraries( test_dir_lib_source ${wxWidgets_LIBRARIES} )
|
target_link_libraries( test_dir_lib_source ${wxWidgets_LIBRARIES} )
|
||||||
#target_link_libraries( test_dir_lib_source common ${wxWidgets_LIBRARIES} )
|
|
||||||
|
add_executable( test_lib_table sch_lib_table.cpp sch_lib_table_keywords.cpp )
|
||||||
|
target_link_libraries( test_lib_table ${wxWidgets_LIBRARIES} )
|
||||||
|
|
||||||
|
add_executable( test_sch_part sch_part.cpp )
|
||||||
|
target_link_libraries( test_lib_table ${wxWidgets_LIBRARIES} )
|
||||||
|
|
||||||
|
|
||||||
|
make_lexer(
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/sch_lib_table.keywords
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/sch_lib_table_lexer.h
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/sch_lib_table_keywords.cpp
|
||||||
|
ELT_T
|
||||||
|
)
|
||||||
|
|
||||||
|
|
218
new/design.h
218
new/design.h
|
@ -371,84 +371,6 @@ const STRING StrEmpty = "";
|
||||||
/** @} exception_types Exception Types */
|
/** @} exception_types Exception Types */
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class PART
|
|
||||||
* will have to be unified with what Wayne is doing. I want a separate copy
|
|
||||||
|
|
||||||
* here until I can get the state management correct. Since a PART only lives
|
|
||||||
* within a cache called a LIB, its constructor is private (only a LIB
|
|
||||||
* can instantiate one), and it exists in various states of freshness and
|
|
||||||
* completeness relative to the LIB_SOURCE within the LIB.
|
|
||||||
*/
|
|
||||||
class PART
|
|
||||||
{
|
|
||||||
/// LIB class has great license to modify what's in here, nobody else does.
|
|
||||||
/// Modification is done through the LIB so it can track the state of the
|
|
||||||
/// PART and take action as needed. Actually most of the modification will
|
|
||||||
/// be done by PARTS_LIST, a class derived from LIB.
|
|
||||||
friend class LIB;
|
|
||||||
|
|
||||||
|
|
||||||
/// a private constructor, only a LIB can instantiate a PART.
|
|
||||||
PART() {}
|
|
||||||
|
|
||||||
|
|
||||||
protected: // not likely to have C++ descendants, but protected none-the-less.
|
|
||||||
|
|
||||||
bool parsed; ///< true if the body as been parsed already.
|
|
||||||
|
|
||||||
LIB* owner; ///< which LIB am I a part of (pun if you want)
|
|
||||||
STRING extends; ///< LPID of base part
|
|
||||||
|
|
||||||
STRING name; ///< example "passives/R", immutable.
|
|
||||||
|
|
||||||
/// s-expression text for the part, initially empty, and read in as this part
|
|
||||||
/// actually becomes cached in RAM.
|
|
||||||
STRING body;
|
|
||||||
|
|
||||||
// 3 separate lists for speed:
|
|
||||||
|
|
||||||
/// A property list.
|
|
||||||
PROPERTIES properties;
|
|
||||||
|
|
||||||
/// A drawing list for graphics
|
|
||||||
DRAWINGS drawings;
|
|
||||||
|
|
||||||
/// A pin list
|
|
||||||
PINS pins;
|
|
||||||
|
|
||||||
/// Alternate body forms.
|
|
||||||
ALTERNATES alternates;
|
|
||||||
|
|
||||||
// lots of other stuff, like the mandatory properties.
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function Inherit
|
|
||||||
* is a specialized assignment function that copies a specific subset, enough
|
|
||||||
* to fulfill the requirements of the Sweet s-expression language.
|
|
||||||
*/
|
|
||||||
void Inherit( const PART& aBasePart );
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function Owner
|
|
||||||
* returns the LIB* owner of this part.
|
|
||||||
*/
|
|
||||||
LIB Owner() { return owner; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function Parse
|
|
||||||
* translates the \a body string into a binary form that is represented
|
|
||||||
* by the normal fields of this class. Parse is expected to call Inherit()
|
|
||||||
* if this part extends any other.
|
|
||||||
*/
|
|
||||||
void Parse( DSN_LEXER* aLexer ) throw( PARSE_EXCEPTION );
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class LPID (aka GUID)
|
* Class LPID (aka GUID)
|
||||||
|
@ -601,8 +523,6 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class SVN_LIB_SOURCE
|
* Class SVN_LIB_SOURCE
|
||||||
* implements a LIB_SOURCE in a subversion repository.
|
* implements a LIB_SOURCE in a subversion repository.
|
||||||
|
@ -651,56 +571,6 @@ protected:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class LIBS
|
|
||||||
* houses a handful of functions that manage all the RAM resident LIBs, and
|
|
||||||
* provide for a global part lookup function, GetPart(), which can be the basis
|
|
||||||
* of a cross LIB hyperlink.
|
|
||||||
*/
|
|
||||||
class LIBS
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function GetPart
|
|
||||||
* finds and loads a PART, and parses it. As long as the part is
|
|
||||||
* accessible in any LIB_SOURCE, opened or not opened, this function
|
|
||||||
* will find it and load it into its containing LIB, even if that means
|
|
||||||
* having to load a new LIB as given in the library table.
|
|
||||||
*/
|
|
||||||
static PART* GetPart( const LPID& aLogicalPartID ) throw( IO_ERROR );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function GetLib
|
|
||||||
* is first a lookup function and then if needed, a factory function.
|
|
||||||
* If aLogicalLibraryName has been opened, then return the already opened
|
|
||||||
* LIB. If not, then instantiate the library and fill the initial
|
|
||||||
* library PARTs (unparsed) and categories, and add it to LIB::libraries
|
|
||||||
* for future reference.
|
|
||||||
*/
|
|
||||||
static LIB* GetLib( const STRING& aLogicalLibraryName ) throw( IO_ERROR );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function GetOpenedLibNames
|
|
||||||
* returns the logical library names of LIBs that are already opened.
|
|
||||||
* @see LPID::GetLogicalLibraries()
|
|
||||||
*/
|
|
||||||
static STRINGS GetOpendedLogicalLibNames();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function CloseLibrary
|
|
||||||
* closes an open library @a aLibrary and removes it from class LIBS.
|
|
||||||
*/
|
|
||||||
static void CloseLibrary( LIB* aLibrary ) throw( IO_ERROR );
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
/// collection of LIBs, searchable by logical name.
|
|
||||||
static std::map< STRING, LIB* > libraries; // owns the LIBs.
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class PARTS_LIST
|
* Class PARTS_LIST
|
||||||
* is a LIB which resides in a SCHEMATIC, and it is a table model for a
|
* is a LIB which resides in a SCHEMATIC, and it is a table model for a
|
||||||
|
@ -721,94 +591,6 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class LIB_TABLE_ROW
|
|
||||||
* holds a record identifying a LIB in the LIB_TABLE.
|
|
||||||
*/
|
|
||||||
class LIB_TABLE_ROW
|
|
||||||
{
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function SetLogicalName
|
|
||||||
* changes the logical name of this library, useful for an editor.
|
|
||||||
*/
|
|
||||||
void SetLogicalName( const STRING& aLogicalName );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function SetType
|
|
||||||
* changes the type represented by this record.
|
|
||||||
*/
|
|
||||||
void SetType( const STRING& aType );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function SetFullURI
|
|
||||||
* changes the full URI for the library, useful from a library table editor.
|
|
||||||
*/
|
|
||||||
void SetFullURI( const STRING& aFullURI );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function SetOptions
|
|
||||||
* changes the options string for this record, and is useful from
|
|
||||||
* the library table editor.
|
|
||||||
*/
|
|
||||||
void SetOptions( const STRING& aOptions );
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function GetLogicalName
|
|
||||||
* returns the logical name of this library table entry.
|
|
||||||
*/
|
|
||||||
const STRING& GetLogicalName();
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function GetType
|
|
||||||
* returns the type of LIB represented by this record.
|
|
||||||
*/
|
|
||||||
const STRING& GetType();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function GetFullURI
|
|
||||||
* returns the full location specifying URI for the LIB.
|
|
||||||
*/
|
|
||||||
const STRING& GetFullURI();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function GetOptions
|
|
||||||
* returns the options string, which may hold a password or anything else needed to
|
|
||||||
* instantiate the underlying LIB_SOURCE.
|
|
||||||
*/
|
|
||||||
const STRING& GetOptions();
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class LIB_TABLE
|
|
||||||
* holds LIB_TABLE_ROW records, and can be searched in a very high speed way based on
|
|
||||||
* logical library name.
|
|
||||||
*/
|
|
||||||
class LIB_TABLE
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor LIB_TABLE
|
|
||||||
* builds a library table from an s-expression form of the library table.
|
|
||||||
* @param aLibraryTable is an s-expression form of all the rows in a library
|
|
||||||
* table fragment. These rows take presedence over rows in @a aFallBackTable.
|
|
||||||
* @param aFallBackTable is another LIB_TABLE which is searched only when
|
|
||||||
* a record is not found in this table.
|
|
||||||
*/
|
|
||||||
LIB_TABLE( const STRING& aLibraryTable, LIB_TABLE* aFallBackTable = NULL )
|
|
||||||
{
|
|
||||||
// s-expression is chosen so we can read a table fragment from either
|
|
||||||
// a schematic or a disk file, for schematic resident or
|
|
||||||
// personal table, respectively.
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace SCH
|
} // namespace SCH
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
BASEDIR=/tmp/eeschema-lib
|
||||||
|
|
||||||
|
CATEGORIES="lions tigers kitties"
|
||||||
|
|
||||||
|
PARTS="eyes ears feet"
|
||||||
|
|
||||||
|
REVS="rev1 rev5 rev10"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for C in ${CATEGORIES}; do
|
||||||
|
|
||||||
|
mkdir -p $BASEDIR/$C
|
||||||
|
|
||||||
|
for P in ${PARTS}; do
|
||||||
|
for R in ${REVS}; do
|
||||||
|
echo "#$R: (part $C/$P)" > $BASEDIR/$C/$P.part.$R
|
||||||
|
done
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
|
@ -62,6 +62,20 @@ using namespace SCH;
|
||||||
#include <vector>
|
#include <vector>
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
/// This file extension is an implementation detail specific to this LIB_SOURCE
|
||||||
|
/// implementation, and to a corresponding LIB_SINK.
|
||||||
|
/// Core EESCHEMA should never have to see this.
|
||||||
|
#define SWEET_EXT ".part"
|
||||||
|
|
||||||
|
|
||||||
|
/* __func__ is C99 prescribed, but just in case:
|
||||||
|
http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=338
|
||||||
|
#if defined(__GNUG__) // The GNU C++ compiler defines this
|
||||||
|
#define FUNC_NAME(x) // nothing, GNU C++ defines __func__ just fine.
|
||||||
|
#else
|
||||||
|
#define FUNC_NAME(x) static const char __func__[] = #x;
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -140,7 +154,7 @@ static const char* endsWithRev( const char* start, const char* tail, char separa
|
||||||
{
|
{
|
||||||
bool sawDigit = false;
|
bool sawDigit = false;
|
||||||
|
|
||||||
while( tail>start && isdigit(*--tail) )
|
while( tail > start && isdigit( *--tail ) )
|
||||||
{
|
{
|
||||||
sawDigit = true;
|
sawDigit = true;
|
||||||
}
|
}
|
||||||
|
@ -202,6 +216,7 @@ bool BY_REV::operator() ( const STRING& s1, const STRING& s2 ) const
|
||||||
int rnum1 = atoi( rev1+3 );
|
int rnum1 = atoi( rev1+3 );
|
||||||
int rnum2 = atoi( rev2+3 );
|
int rnum2 = atoi( rev2+3 );
|
||||||
|
|
||||||
|
// higher numbered revs are "less" so that they bubble to top.
|
||||||
return rnum1 > rnum2;
|
return rnum1 > rnum2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,9 +227,9 @@ bool BY_REV::operator() ( const STRING& s1, const STRING& s2 ) const
|
||||||
bool DIR_LIB_SOURCE::makePartName( STRING* aPartName, const char* aEntry,
|
bool DIR_LIB_SOURCE::makePartName( STRING* aPartName, const char* aEntry,
|
||||||
const STRING& aCategory )
|
const STRING& aCategory )
|
||||||
{
|
{
|
||||||
const char* cp = strrstr( aEntry, ".part" );
|
const char* cp = strrstr( aEntry, SWEET_EXT );
|
||||||
|
|
||||||
// if base name is not empty, contains ".part", && cp is not NULL
|
// if base name is not empty, contains SWEET_EXT, && cp is not NULL
|
||||||
if( cp > aEntry )
|
if( cp > aEntry )
|
||||||
{
|
{
|
||||||
const char* limit = cp + strlen( cp );
|
const char* limit = cp + strlen( cp );
|
||||||
|
@ -222,7 +237,7 @@ bool DIR_LIB_SOURCE::makePartName( STRING* aPartName, const char* aEntry,
|
||||||
// If versioning, then must find a trailing "revN.." type of string.
|
// If versioning, then must find a trailing "revN.." type of string.
|
||||||
if( useVersioning )
|
if( useVersioning )
|
||||||
{
|
{
|
||||||
const char* rev = endsWithRev( cp + sizeof(".part") - 1, limit, '.' );
|
const char* rev = endsWithRev( cp + sizeof(SWEET_EXT) - 1, limit, '.' );
|
||||||
if( rev )
|
if( rev )
|
||||||
{
|
{
|
||||||
if( aCategory.size() )
|
if( aCategory.size() )
|
||||||
|
@ -241,7 +256,7 @@ bool DIR_LIB_SOURCE::makePartName( STRING* aPartName, const char* aEntry,
|
||||||
// so we don't even bother to try and load any other partfile down here.
|
// so we don't even bother to try and load any other partfile down here.
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// if file extension is exactly ".part", and no rev
|
// if file extension is exactly SWEET_EXT, and no rev
|
||||||
if( cp==limit-5 )
|
if( cp==limit-5 )
|
||||||
{
|
{
|
||||||
if( aCategory.size() )
|
if( aCategory.size() )
|
||||||
|
@ -272,13 +287,14 @@ STRING DIR_LIB_SOURCE::makeFileName( const STRING& aPartName )
|
||||||
{
|
{
|
||||||
int basePartLen = rev - aPartName.c_str() - 1; // omit '/' separator
|
int basePartLen = rev - aPartName.c_str() - 1; // omit '/' separator
|
||||||
fileName.append( aPartName, 0, basePartLen );
|
fileName.append( aPartName, 0, basePartLen );
|
||||||
fileName += ".part."; // add '.' separator before rev
|
fileName += SWEET_EXT;
|
||||||
|
fileName += '.';
|
||||||
fileName += rev;
|
fileName += rev;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fileName += aPartName;
|
fileName += aPartName;
|
||||||
fileName += ".part";
|
fileName += SWEET_EXT;
|
||||||
}
|
}
|
||||||
|
|
||||||
return fileName;
|
return fileName;
|
||||||
|
@ -370,7 +386,7 @@ void DIR_LIB_SOURCE::GetCategoricalPartNames( STRINGS* aResults, const STRING& a
|
||||||
partnames.end();
|
partnames.end();
|
||||||
|
|
||||||
PN_ITER it = aCategory.size() ?
|
PN_ITER it = aCategory.size() ?
|
||||||
partnames.lower_bound( aCategory + "/" ) :
|
partnames.upper_bound( aCategory + "/" ) :
|
||||||
partnames.begin();
|
partnames.begin();
|
||||||
|
|
||||||
aResults->clear();
|
aResults->clear();
|
||||||
|
@ -408,7 +424,6 @@ void DIR_LIB_SOURCE::GetCategoricalPartNames( STRINGS* aResults, const STRING& a
|
||||||
void DIR_LIB_SOURCE::ReadPart( STRING* aResult, const STRING& aPartName, const STRING& aRev )
|
void DIR_LIB_SOURCE::ReadPart( STRING* aResult, const STRING& aPartName, const STRING& aRev )
|
||||||
throw( IO_ERROR )
|
throw( IO_ERROR )
|
||||||
{
|
{
|
||||||
STRING fileName;
|
|
||||||
STRING partName = aPartName; // appended with aRev too if not empty
|
STRING partName = aPartName; // appended with aRev too if not empty
|
||||||
const char* rev = endsWithRev( partName, '/' );
|
const char* rev = endsWithRev( partName, '/' );
|
||||||
|
|
||||||
|
@ -441,8 +456,9 @@ void DIR_LIB_SOURCE::ReadPart( STRING* aResult, const STRING& aPartName, const S
|
||||||
{
|
{
|
||||||
STRING search = partName + '/';
|
STRING search = partName + '/';
|
||||||
|
|
||||||
// no rev on partName string. First the first, which should be
|
// There's no rev on partName string. Find the most recent rev, i.e. highest,
|
||||||
// the highnest numbered rev because of BY_REV compare method.
|
// which will be first because of the BY_REV compare method, which treats
|
||||||
|
// higher numbered revs as first.
|
||||||
PN_ITER it = partnames.upper_bound( search );
|
PN_ITER it = partnames.upper_bound( search );
|
||||||
|
|
||||||
// verify that this one that is greater than partName is a match and not
|
// verify that this one that is greater than partName is a match and not
|
||||||
|
@ -582,9 +598,9 @@ int main( int argc, char** argv )
|
||||||
// initially, only the NAME_CACHE sweets and STRING categories are loaded:
|
// initially, only the NAME_CACHE sweets and STRING categories are loaded:
|
||||||
uut.Show();
|
uut.Show();
|
||||||
|
|
||||||
uut.GetCategoricalPartNames( &partnames, "Category" );
|
uut.GetCategoricalPartNames( &partnames, "lions" );
|
||||||
|
|
||||||
printf( "\nGetCategoricalPartNames( aCatagory = 'Category' ):\n" );
|
printf( "\nGetCategoricalPartNames( aCatagory = 'lions' ):\n" );
|
||||||
for( STRINGS::const_iterator it = partnames.begin(); it!=partnames.end(); ++it )
|
for( STRINGS::const_iterator it = partnames.begin(); it!=partnames.end(); ++it )
|
||||||
{
|
{
|
||||||
printf( " '%s'\n", it->c_str() );
|
printf( " '%s'\n", it->c_str() );
|
||||||
|
@ -592,7 +608,7 @@ int main( int argc, char** argv )
|
||||||
|
|
||||||
uut.ReadParts( &sweets, partnames );
|
uut.ReadParts( &sweets, partnames );
|
||||||
|
|
||||||
printf( "\nSweets for Category = 'Category' parts:\n" );
|
printf( "\nSweets for Category = 'lions' parts:\n" );
|
||||||
pn = partnames.begin();
|
pn = partnames.begin();
|
||||||
for( STRINGS::const_iterator it = sweets.begin(); it!=sweets.end(); ++it, ++pn )
|
for( STRINGS::const_iterator it = sweets.begin(); it!=sweets.end(); ++it, ++pn )
|
||||||
{
|
{
|
||||||
|
@ -632,4 +648,3 @@ int main( int argc, char** argv )
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -231,6 +231,8 @@ protected: // constructor is not public, called from LIBS only.
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
~LIB()
|
~LIB()
|
||||||
{
|
{
|
||||||
delete source;
|
delete source;
|
||||||
|
@ -238,8 +240,6 @@ protected: // constructor is not public, called from LIBS only.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function HasSink
|
* Function HasSink
|
||||||
* returns true if this library has write/save capability. Most LIBs
|
* returns true if this library has write/save capability. Most LIBs
|
||||||
|
@ -349,4 +349,3 @@ protected:
|
||||||
const STRING StrEmpty = "";
|
const STRING StrEmpty = "";
|
||||||
|
|
||||||
#endif // SCH_LIB_H_
|
#endif // SCH_LIB_H_
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
* This program source code file is part of KICAD, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2011 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
||||||
|
* Copyright (C) 2010 Kicad Developers, see change_log.txt for contributors.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, you may find one here:
|
||||||
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||||
|
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||||
|
* or you may write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sch_lib_table.h>
|
||||||
|
|
||||||
|
|
||||||
|
int main( int argc, char** argv )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,207 @@
|
||||||
|
/*
|
||||||
|
* This program source code file is part of KICAD, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
||||||
|
* Copyright (C) 2010 Kicad Developers, see change_log.txt for contributors.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, you may find one here:
|
||||||
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||||
|
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||||
|
* or you may write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SCH_LIB_TABLE_H_
|
||||||
|
#define SCH_LIB_TABLE_H_
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <boost/ptr_container/ptr_set.hpp>
|
||||||
|
#include <sch_lib.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace SCH {
|
||||||
|
|
||||||
|
class LIB_TABLE_LEXER;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class LIB_TABLE
|
||||||
|
* holds LIB_TABLE::ROW records, and can be searched in a very high speed
|
||||||
|
* way based on logical library name.
|
||||||
|
*
|
||||||
|
* @author Dick Hollenbeck
|
||||||
|
*/
|
||||||
|
class LIB_TABLE
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class ROW
|
||||||
|
* holds a record identifying a LIB in the LIB_TABLE.
|
||||||
|
*/
|
||||||
|
class ROW
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
bool operator<( const ROW& other ) const
|
||||||
|
{
|
||||||
|
return logicalName < other.logicalName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function GetLogicalName
|
||||||
|
* returns the logical name of this library table entry.
|
||||||
|
*/
|
||||||
|
const STRING& GetLogicalName() const
|
||||||
|
{
|
||||||
|
return logicalName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function GetType
|
||||||
|
* returns the type of LIB represented by this record.
|
||||||
|
*/
|
||||||
|
const STRING& GetType() const
|
||||||
|
{
|
||||||
|
return libType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function GetFullURI
|
||||||
|
* returns the full location specifying URI for the LIB.
|
||||||
|
*/
|
||||||
|
const STRING& GetFullURI() const
|
||||||
|
{
|
||||||
|
return fullURI;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function GetOptions
|
||||||
|
* returns the options string, which may hold a password or anything else needed to
|
||||||
|
* instantiate the underlying LIB_SOURCE.
|
||||||
|
*/
|
||||||
|
const STRING& GetOptions() const
|
||||||
|
{
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
|
~ROW()
|
||||||
|
{
|
||||||
|
delete lib;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
ROW() :
|
||||||
|
lib( 0 )
|
||||||
|
{}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function SetLogicalName
|
||||||
|
* changes the logical name of this library, useful for an editor.
|
||||||
|
*/
|
||||||
|
void SetLogicalName( const STRING& aLogicalName )
|
||||||
|
{
|
||||||
|
logicalName = aLogicalName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function SetType
|
||||||
|
* changes the type represented by this record.
|
||||||
|
*/
|
||||||
|
void SetType( const STRING& aType )
|
||||||
|
{
|
||||||
|
libType = aType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function SetFullURI
|
||||||
|
* changes the full URI for the library, useful from a library table editor.
|
||||||
|
*/
|
||||||
|
void SetFullURI( const STRING& aFullURI )
|
||||||
|
{
|
||||||
|
fullURI = aFullURI;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function SetOptions
|
||||||
|
* changes the options string for this record, and is useful from
|
||||||
|
* the library table editor.
|
||||||
|
*/
|
||||||
|
void SetOptions( const STRING& aOptions )
|
||||||
|
{
|
||||||
|
options = aOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
STRING logicalName;
|
||||||
|
STRING libType;
|
||||||
|
STRING fullURI;
|
||||||
|
STRING options;
|
||||||
|
|
||||||
|
LIB* lib;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor LIB_TABLE
|
||||||
|
* builds a library table from an s-expression form of the library table.
|
||||||
|
* @param aLibraryTable is an s-expression form of all the rows in a library
|
||||||
|
* table fragment. These rows take presedence over rows in @a aFallBackTable.
|
||||||
|
* @param aFallBackTable is another LIB_TABLE which is searched only when
|
||||||
|
* a record is not found in this table.
|
||||||
|
*/
|
||||||
|
LIB_TABLE( const STRING& aLibraryTable, LIB_TABLE* aFallBackTable = NULL )
|
||||||
|
throw( PARSE_ERROR )
|
||||||
|
{
|
||||||
|
// s-expression is chosen so we can read a table fragment from either
|
||||||
|
// a schematic or a disk file, for schematic resident or
|
||||||
|
// personal table, respectively.
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/**
|
||||||
|
* Function Parse
|
||||||
|
* fills this object from information in the input stream \a aSpec, which
|
||||||
|
* is a DSN_LEXER customized for the grammar needed to describe instances of this object.
|
||||||
|
* The entire textual element spec is <br>
|
||||||
|
* (lib_table (logical _yourfieldname_)(value _yourvalue_) visible))
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* (lib_table
|
||||||
|
* (lib (logical "LOGICAL")(type "TYPE")(fullURI "FULL_URI")(options "OPTIONS"))
|
||||||
|
* (lib (logical "LOGICAL")(type "TYPE")(fullURI "FULL_URI")(options "OPTIONS"))
|
||||||
|
(lib (logical "LOGICAL")(type "TYPE")(fullURI "FULL_URI")(options "OPTIONS"))
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* When this function is called, the input token stream given by \a aSpec
|
||||||
|
* is assumed to be positioned at the '^' in the following example, i.e. just after the
|
||||||
|
* identifying keyword and before the content specifying stuff.<br>
|
||||||
|
* (lib_table ^ (....) )
|
||||||
|
*
|
||||||
|
* @param aSpec is the input token stream of keywords and symbols.
|
||||||
|
*/
|
||||||
|
void Parse( LIB_TABLE_LEXER* aLexer ) throw( PARSE_ERROR );
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
typedef boost::ptr_set<ROW> ROWS;
|
||||||
|
|
||||||
|
ROWS rows;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace SCH
|
||||||
|
|
||||||
|
#endif // SCH_LIB_TABLE_H_
|
|
@ -0,0 +1,5 @@
|
||||||
|
lib_table
|
||||||
|
logical
|
||||||
|
type
|
||||||
|
full_uri
|
||||||
|
options
|
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* This program source code file is part of KICAD, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Kicad Developers, see change_log.txt for contributors.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, you may find one here:
|
||||||
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||||
|
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||||
|
* or you may write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "sch_part.h"
|
||||||
|
|
||||||
|
using namespace SCH;
|
||||||
|
|
||||||
|
void PART::Parse( LIB* aLexer ) throw( PARSE_ERROR )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
|
||||||
|
int main( int argc, char** argv )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,113 @@
|
||||||
|
/*
|
||||||
|
* This program source code file is part of KICAD, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Kicad Developers, see change_log.txt for contributors.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, you may find one here:
|
||||||
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||||
|
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||||
|
* or you may write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SCH_PART_H_
|
||||||
|
#define SCH_PART_H_
|
||||||
|
|
||||||
|
#include <sch_lib.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace SCH {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class PART
|
||||||
|
* will have to be unified with what Wayne is doing. I want a separate copy
|
||||||
|
|
||||||
|
* here until I can get the state management correct. Since a PART only lives
|
||||||
|
* within a cache called a LIB, its constructor is private (only a LIB
|
||||||
|
* can instantiate one), and it exists in various states of freshness and
|
||||||
|
* completeness relative to the LIB_SOURCE within the LIB.
|
||||||
|
*/
|
||||||
|
class PART
|
||||||
|
{
|
||||||
|
/// LIB class has great license to modify what's in here, nobody else does.
|
||||||
|
/// Modification is done through the LIB so it can track the state of the
|
||||||
|
/// PART and take action as needed. Actually most of the modification will
|
||||||
|
/// be done by PARTS_LIST, a class derived from LIB.
|
||||||
|
friend class LIB;
|
||||||
|
|
||||||
|
|
||||||
|
/// a private constructor, only a LIB can instantiate a PART.
|
||||||
|
PART() {}
|
||||||
|
|
||||||
|
|
||||||
|
protected: // not likely to have C++ descendants, but protected none-the-less.
|
||||||
|
|
||||||
|
bool parsed; ///< true if the body as been parsed already.
|
||||||
|
|
||||||
|
LIB* owner; ///< which LIB am I a part of (pun if you want)
|
||||||
|
STRING extends; ///< LPID of base part
|
||||||
|
|
||||||
|
STRING name; ///< example "passives/R", immutable.
|
||||||
|
|
||||||
|
/// s-expression text for the part, initially empty, and read in as this part
|
||||||
|
/// actually becomes cached in RAM.
|
||||||
|
STRING body;
|
||||||
|
|
||||||
|
// 3 separate lists for speed:
|
||||||
|
|
||||||
|
/// A property list.
|
||||||
|
//PROPERTIES properties;
|
||||||
|
|
||||||
|
/// A drawing list for graphics
|
||||||
|
//DRAWINGS drawings;
|
||||||
|
|
||||||
|
/// A pin list
|
||||||
|
//PINS pins;
|
||||||
|
|
||||||
|
/// Alternate body forms.
|
||||||
|
//ALTERNATES alternates;
|
||||||
|
|
||||||
|
// lots of other stuff, like the mandatory properties.
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function Inherit
|
||||||
|
* is a specialized assignment function that copies a specific subset, enough
|
||||||
|
* to fulfill the requirements of the Sweet s-expression language.
|
||||||
|
*/
|
||||||
|
void Inherit( const PART& aBasePart );
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function Owner
|
||||||
|
* returns the LIB* owner of this part.
|
||||||
|
*/
|
||||||
|
LIB* Owner() { return owner; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function Parse
|
||||||
|
* translates the \a body string into a binary form that is represented
|
||||||
|
* by the normal fields of this class. Parse is expected to call Inherit()
|
||||||
|
* if this part extends any other.
|
||||||
|
*/
|
||||||
|
void Parse( LIB* aLexer ) throw( PARSE_ERROR );
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace PART
|
||||||
|
|
||||||
|
#endif // SCH_PART_
|
Loading…
Reference in New Issue