Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
kicad-source-mirror
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
kicad-source-mirror
Commits
f285c829
Commit
f285c829
authored
Aug 08, 2010
by
Dick Hollenbeck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
S-expression in xnode.cpp
parent
b6159391
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
343 additions
and
258 deletions
+343
-258
CHANGELOG.txt
CHANGELOG.txt
+13
-0
richio.cpp
common/richio.cpp
+40
-22
xnode.cpp
common/xnode.cpp
+61
-30
netform.cpp
eeschema/netform.cpp
+100
-61
netlist.keywords
eeschema/netlist.keywords
+35
-0
richio.h
include/richio.h
+70
-15
xnode.h
include/xnode.h
+1
-49
specctra.cpp
pcbnew/specctra.cpp
+22
-59
specctra.h
pcbnew/specctra.h
+1
-22
No files found.
CHANGELOG.txt
View file @
f285c829
...
...
@@ -4,6 +4,19 @@ KiCad ChangeLog 2010
Please add newer entries at the top, list the date and your name with
email address.
2010-Aug-7 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
++common
* add xnode.cpp and xnode.h which can be used to output either an XML or
S-expression document file.
* Add class STREAM_OUTPUTFORMATTER which is a richio class which can write
to any of the wxOutputStream derivatives, such as file, socket, zip, tar.
* Added netlist.keywords
++eeschema
* netform.cpp can now output S-expression OK, although I have it commented out
pending the addition of a UI for it.
2010-Aug-4 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
++eeschema netform.cpp:
...
...
common/richio.cpp
View file @
f285c829
...
...
@@ -147,18 +147,7 @@ const char* OUTPUTFORMATTER::GetQuoteChar( const char* wrapee, const char* quote
}
//-----<STRINGFORMATTER>----------------------------------------------------
const
char
*
STRINGFORMATTER
::
GetQuoteChar
(
const
char
*
wrapee
)
{
// for what we are using STRINGFORMATTER for at this time, we can return
// the nul string always.
return
""
;
// return OUTPUTFORMATTER::GetQuoteChar( const char* wrapee, "\"" );
}
int
STRINGFORMATTER
::
vprint
(
const
char
*
fmt
,
va_list
ap
)
int
OUTPUTFORMATTER
::
vprint
(
const
char
*
fmt
,
va_list
ap
)
throw
(
IOError
)
{
int
ret
=
vsnprintf
(
&
buffer
[
0
],
buffer
.
size
(),
fmt
,
ap
);
if
(
ret
>=
(
int
)
buffer
.
size
()
)
...
...
@@ -168,13 +157,13 @@ int STRINGFORMATTER::vprint( const char* fmt, va_list ap )
}
if
(
ret
>
0
)
mystring
.
append
(
(
const
char
*
)
&
buffer
[
0
]
);
write
(
&
buffer
[
0
],
ret
);
return
ret
;
}
int
STRINGFORMATTER
::
sprint
(
const
char
*
fmt
,
...
)
int
OUTPUTFORMATTER
::
sprint
(
const
char
*
fmt
,
...
)
throw
(
IOError
)
{
va_list
args
;
...
...
@@ -186,9 +175,8 @@ int STRINGFORMATTER::sprint( const char* fmt, ... )
}
int
STRING
FORMATTER
::
Print
(
int
nestLevel
,
const
char
*
fmt
,
...
)
throw
(
IOError
)
int
OUTPUT
FORMATTER
::
Print
(
int
nestLevel
,
const
char
*
fmt
,
...
)
throw
(
IOError
)
{
#define NESTWIDTH 2 ///< how many spaces per nestLevel
va_list
args
;
...
...
@@ -200,17 +188,14 @@ int STRINGFORMATTER::Print( int nestLevel, const char* fmt, ... ) throw( IOError
for
(
int
i
=
0
;
i
<
nestLevel
;
++
i
)
{
// no error checking needed, an exception indicates an error.
result
=
sprint
(
"%*c"
,
NESTWIDTH
,
' '
);
if
(
result
<
0
)
break
;
total
+=
result
;
}
if
(
result
<
0
||
(
result
=
vprint
(
fmt
,
args
))
<
0
)
{
throw
IOError
(
_
(
"Error writing to STRINGFORMATTER"
)
);
}
// no error checking needed, an exception indicates an error.
result
=
vprint
(
fmt
,
args
);
va_end
(
args
);
...
...
@@ -219,6 +204,13 @@ int STRINGFORMATTER::Print( int nestLevel, const char* fmt, ... ) throw( IOError
}
//-----<STRINGFORMATTER>----------------------------------------------------
void
STRINGFORMATTER
::
write
(
const
char
*
aOutBuf
,
int
aCount
)
throw
(
IOError
)
{
mystring
.
append
(
aOutBuf
,
aCount
);
}
void
STRINGFORMATTER
::
StripUseless
()
{
std
::
string
copy
=
mystring
;
...
...
@@ -234,3 +226,29 @@ void STRINGFORMATTER::StripUseless()
}
}
//-----<STREAM_OUTPUTFORMATTER>--------------------------------------
const
char
*
STREAM_OUTPUTFORMATTER
::
GetQuoteChar
(
const
char
*
wrapee
)
{
return
OUTPUTFORMATTER
::
GetQuoteChar
(
wrapee
,
quoteChar
);
}
void
STREAM_OUTPUTFORMATTER
::
write
(
const
char
*
aOutBuf
,
int
aCount
)
throw
(
IOError
)
{
int
lastWrite
;
// This might delay awhile if you were writing to say a socket, but for
// a file it should only go through the loop once.
for
(
int
total
=
0
;
total
<
aCount
;
total
+=
lastWrite
)
{
lastWrite
=
os
.
Write
(
aOutBuf
,
aCount
).
LastWrite
();
if
(
!
os
.
IsOk
()
)
{
throw
IOError
(
_
(
"OUTPUTSTREAM_OUTPUTFORMATTER write error"
)
);
}
}
}
common/xnode.cpp
View file @
f285c829
...
...
@@ -24,46 +24,77 @@
#include "xnode.h"
#include "macros.h"
void
XNODE
::
Format
(
OUTPUTFORMATTER
*
out
,
int
nestLevel
)
throw
(
IOError
)
{
// output attributes first if they exist
// output children if they exist.
// output "contents" if it exists. Use quote need checker to wrap contents if needed.
// A good XML element will not have both children AND contents, usually one or the other.
// children != attributes in the above statement.
typedef
wxXmlProperty
XATTR
;
// for( XNODE*...
void
XNODE
::
Format
(
OUTPUTFORMATTER
*
out
,
int
nestLevel
)
throw
(
IOError
)
{
switch
(
GetType
()
)
{
case
wxXML_ELEMENT_NODE
:
out
->
Print
(
nestLevel
,
"(%s"
,
CONV_TO_UTF8
(
GetName
()
)
);
FormatContents
(
out
,
nestLevel
);
if
(
GetNext
()
)
out
->
Print
(
0
,
")
\n
"
);
else
out
->
Print
(
0
,
")"
);
break
;
default
:
FormatContents
(
out
,
nestLevel
);
}
}
void
XNODE
::
FormatContents
(
OUTPUTFORMATTER
*
out
,
int
nestLevel
)
throw
(
IOError
)
{
// overridden in ELEM_HOLDER
}
std
::
string
utf8
;
const
char
*
quote
;
void
XATTR
::
Format
(
OUTPUTFORMATTER
*
out
,
int
nestLevel
)
throw
(
IOError
)
{
// output attributes first if they exist
// output children if they exist.
// output "contents" if it exists. Use quote need checker to wrap contents if needed.
// A good XML element will not have both children AND contents, usually one or the other.
// children != attributes in the above statement.
// for( XNODE*...
}
void
XATTR
::
FormatContents
(
OUTPUTFORMATTER
*
out
,
int
nestLevel
)
throw
(
IOError
)
{
// overridden in ELEM_HOLDER
for
(
XATTR
*
attr
=
(
XATTR
*
)
GetAttributes
();
attr
;
attr
=
(
XATTR
*
)
attr
->
GetNext
()
)
{
utf8
=
CONV_TO_UTF8
(
attr
->
GetValue
()
);
// capture the content
quote
=
out
->
GetQuoteChar
(
utf8
.
c_str
()
);
out
->
Print
(
0
,
" (%s %s%s%s)"
,
// attr names should never need quoting, no spaces, we designed the file.
CONV_TO_UTF8
(
attr
->
GetName
()
),
quote
,
utf8
.
c_str
(),
quote
);
}
// we only expect to have used one of two types here:
switch
(
GetType
()
)
{
case
wxXML_ELEMENT_NODE
:
// output children if they exist.
for
(
XNODE
*
kid
=
(
XNODE
*
)
GetChildren
();
kid
;
kid
=
(
XNODE
*
)
kid
->
GetNext
()
)
{
if
(
kid
->
GetType
()
!=
wxXML_TEXT_NODE
)
{
if
(
kid
==
GetChildren
()
)
out
->
Print
(
0
,
"
\n
"
);
kid
->
Format
(
out
,
nestLevel
+
1
);
}
else
{
kid
->
Format
(
out
,
0
);
}
}
break
;
case
wxXML_TEXT_NODE
:
utf8
=
CONV_TO_UTF8
(
GetContent
()
);
quote
=
out
->
GetQuoteChar
(
utf8
.
c_str
()
);
out
->
Print
(
0
,
" %s%s%s"
,
quote
,
utf8
.
c_str
(),
quote
);
break
;
default
:
;
// not supported
}
}
...
...
eeschema/netform.cpp
View file @
f285c829
This diff is collapsed.
Click to expand it.
eeschema/netlist.keywords
0 → 100644
View file @
f285c829
code
comp
components
datasheet
date
description
design
docs
export
field
fields
footprint
lib
libpart
libraries
library
libsource
name
names
net
nets
node
num
part
pin
pins
ref
sheetpath
source
tool
tstamp
tstamps
uri
value
version
include/richio.h
View file @
f285c829
...
...
@@ -148,14 +148,14 @@ public:
/**
* Function Rewind
* a wrapper to the standard function rewind.
* also clear the current line number
* also clear the current line number
*/
void
Rewind
()
{
rewind
(
fp
);
lineNum
=
0
;
}
};
...
...
@@ -201,17 +201,43 @@ public:
/**
* Class OUTPUTFORMATTER
* is an i
nterface (abstract class) used to output ASCII
text in a convenient
* way.
The primary interface is printf() like
but with support for indentation
* is an i
mportant interface (abstract) class used to output UTF8
text in a convenient
* way.
The primary interface is "printf() - like"
but with support for indentation
* control. The destination of the 8 bit wide text is up to the implementer.
* <p>
* The implementer only has to implement the write() function, but can also optionaly
* re-implement GetQuoteChar().
* <p>
* If you want to output a wxString, then use CONV_TO_UTF8() on it before passing
* it as an argument to Print().
* <p>
* Since this is an abstract interface, only classes derived from this one
*
will be the implementations
.
*
may actually be used
.
*/
class
OUTPUTFORMATTER
{
std
::
vector
<
char
>
buffer
;
int
sprint
(
const
char
*
fmt
,
...
)
throw
(
IOError
);
int
vprint
(
const
char
*
fmt
,
va_list
ap
)
throw
(
IOError
);
protected
:
OUTPUTFORMATTER
(
int
aReserve
=
300
)
:
buffer
(
aReserve
,
'\0'
)
{
}
/**
* Function write
* should be coded in the interface implementation (derived) classes.
*
* @param aOutBuf is the start of a byte buffer to write.
* @param aCount tells how many bytes to write.
* @throw IOError, if there is a problem outputting, such as a full disk.
*/
virtual
void
write
(
const
char
*
aOutBuf
,
int
aCount
)
throw
(
IOError
)
=
0
;
#if defined(__GNUG__) // The GNU C++ compiler defines this
...
...
@@ -238,7 +264,7 @@ public:
* @return int - the number of characters output.
* @throw IOError, if there is a problem outputting, such as a full disk.
*/
virtual
int
PRINTF_FUNC
Print
(
int
nestLevel
,
const
char
*
fmt
,
...
)
throw
(
IOError
)
=
0
;
int
PRINTF_FUNC
Print
(
int
nestLevel
,
const
char
*
fmt
,
...
)
throw
(
IOError
)
;
/**
* Function GetQuoteChar
...
...
@@ -256,7 +282,10 @@ public:
* @return const char* - the quote_char as a single character string, or ""
* if the wrapee does not need to be wrapped.
*/
virtual
const
char
*
GetQuoteChar
(
const
char
*
wrapee
)
=
0
;
virtual
const
char
*
GetQuoteChar
(
const
char
*
wrapee
)
{
return
GetQuoteChar
(
wrapee
,
"
\"
"
);
}
virtual
~
OUTPUTFORMATTER
()
{}
...
...
@@ -283,12 +312,8 @@ public:
*/
class
STRINGFORMATTER
:
public
OUTPUTFORMATTER
{
std
::
vector
<
char
>
buffer
;
std
::
string
mystring
;
int
sprint
(
const
char
*
fmt
,
...
);
int
vprint
(
const
char
*
fmt
,
va_list
ap
);
public
:
/**
...
...
@@ -296,11 +321,10 @@ public:
* reserves space in the buffer
*/
STRINGFORMATTER
(
int
aReserve
=
300
)
:
buffer
(
aReserve
,
'\0'
)
OUTPUTFORMATTER
(
aReserve
)
{
}
/**
* Function Clear
* clears the buffer and empties the internal string.
...
...
@@ -316,16 +340,47 @@ public:
*/
void
StripUseless
();
std
::
string
GetString
()
{
return
mystring
;
}
//-----<OUTPUTFORMATTER>------------------------------------------------
protected
:
void
write
(
const
char
*
aOutBuf
,
int
aCount
)
throw
(
IOError
);
//-----</OUTPUTFORMATTER>-----------------------------------------------
};
/**
* Class STREAM_OUTPUTFORMATTER
* implements OUTPUTFORMATTER to a wxWidgets wxOutputStream. The stream is
* neither opened nor closed by this class.
*/
class
STREAM_OUTPUTFORMATTER
:
public
OUTPUTFORMATTER
{
wxOutputStream
&
os
;
char
quoteChar
[
2
];
public
:
/**
* Constructor STREAM_OUTPUTFORMATTER
* can take any number of wxOutputStream derivations, so it can write
* to a file, socket, or zip file.
*/
STREAM_OUTPUTFORMATTER
(
wxOutputStream
&
aStream
,
char
aQuoteChar
=
'"'
)
:
os
(
aStream
)
{
quoteChar
[
0
]
=
aQuoteChar
;
quoteChar
[
1
]
=
0
;
}
//-----<OUTPUTFORMATTER>------------------------------------------------
int
PRINTF_FUNC
Print
(
int
nestLevel
,
const
char
*
fmt
,
...
)
throw
(
IOError
);
const
char
*
GetQuoteChar
(
const
char
*
wrapee
);
protected
:
void
write
(
const
char
*
aOutBuf
,
int
aCount
)
throw
(
IOError
);
//-----</OUTPUTFORMATTER>-----------------------------------------------
};
...
...
include/xnode.h
View file @
f285c829
...
...
@@ -25,55 +25,10 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "richio.h"
// #define WXUSINGDLL
#include <wx/xml/xml.h>
// These are classes for eXporting document trees, and thus have names
// starting with X. They can export either in XML or S-expression format.
/**
* Class XATTR
* holds an XML or S-expression attribute/child value. It is used for eXporting
* a document tree in EITHER XML or S-expression.
*/
class
XATTR
:
public
wxXmlProperty
// use wxXmlAttribute for wx >= 2.9
{
public
:
XATTR
()
:
wxXmlProperty
()
{
}
XATTR
(
const
wxString
&
aName
,
const
wxString
&
aValue
)
:
wxXmlProperty
(
aName
,
aValue
)
{
}
/**
* Function Format
* writes this object as UTF8 out to an OUTPUTFORMATTER as an S-expression
* @param out The formatter to write to.
* @param nestLevel A multiple of the number of spaces to preceed the output with.
* @throw IOError if a system error writing the output, such as a full disk.
*/
virtual
void
Format
(
OUTPUTFORMATTER
*
out
,
int
nestLevel
)
throw
(
IOError
);
/**
* Function FormatContents
* writes the contents of object as UTF8 out to an OUTPUTFORMATTER as an S-expression
* This is the same as Format() except that the outer wrapper is not included.
* @param out The formatter to write to.
* @param nestLevel A multiple of the number of spaces to preceed the output with.
* @throw IOError if a system error writing the output, such as a full disk.
*/
virtual
void
FormatContents
(
OUTPUTFORMATTER
*
out
,
int
nestLevel
)
throw
(
IOError
);
};
/**
* Class XNODE
...
...
@@ -88,13 +43,11 @@ public:
{
}
XNODE
(
wxXmlNodeType
aType
,
const
wxString
&
aName
,
const
wxString
&
aContent
=
wxEmptyString
)
:
wxXmlNode
(
NULL
,
aType
,
aName
,
aContent
)
{
}
/**
* Function Format
* writes this object as UTF8 out to an OUTPUTFORMATTER as an S-expression
...
...
@@ -104,7 +57,6 @@ public:
*/
virtual
void
Format
(
OUTPUTFORMATTER
*
out
,
int
nestLevel
)
throw
(
IOError
);
/**
* Function FormatContents
* writes the contents of object as UTF8 out to an OUTPUTFORMATTER as an S-expression
...
...
pcbnew/specctra.cpp
View file @
f285c829
...
...
@@ -52,7 +52,9 @@
#include "specctra.h"
#include <wx/ffile.h>
//#include <wx/ffile.h>
#include <wx/wfstream.h> // wxFFileOutputStream
#include "build_version.h"
...
...
@@ -3850,81 +3852,42 @@ void SPECCTRA_DB::doSUPPLY_PIN( SUPPLY_PIN* growth ) throw( IOError )
}
int
SPECCTRA_DB
::
Print
(
int
nestLevel
,
const
char
*
fmt
,
...
)
throw
(
IOError
)
void
SPECCTRA_DB
::
ExportPCB
(
wxString
filename
,
bool
aNameChange
)
throw
(
IOError
)
{
va_list
args
;
va_start
(
args
,
fmt
);
int
result
=
0
;
int
total
=
0
;
for
(
int
i
=
0
;
i
<
nestLevel
;
++
i
)
{
result
=
fprintf
(
fp
,
"%*c"
,
NESTWIDTH
,
' '
);
if
(
result
<
0
)
break
;
total
+=
result
;
}
if
(
result
<
0
||
(
result
=
vfprintf
(
fp
,
fmt
,
args
))
<
0
)
if
(
pcb
)
{
ThrowIOError
(
_
(
"System file error writing to file
\"
%s
\"
"
),
GetChars
(
filename
)
);
}
va_end
(
args
);
total
+=
result
;
return
total
;
}
const
char
*
SPECCTRA_DB
::
GetQuoteChar
(
const
char
*
wrapee
)
{
return
OUTPUTFORMATTER
::
GetQuoteChar
(
wrapee
,
quote_char
.
c_str
()
);
}
wxFFileOutputStream
os
(
filename
,
wxT
(
"wt"
)
);
void
SPECCTRA_DB
::
ExportPCB
(
wxString
filename
,
bool
aNameChange
)
throw
(
IOError
)
{
fp
=
wxFopen
(
filename
,
wxT
(
"w"
)
);
if
(
!
os
.
IsOk
()
)
{
ThrowIOError
(
_
(
"Unable to open file
\"
%s
\"
"
),
GetChars
(
filename
)
);
}
if
(
!
fp
)
{
ThrowIOError
(
_
(
"Unable to open file
\"
%s
\"
"
),
GetChars
(
filename
)
);
}
STREAM_OUTPUTFORMATTER
outputFormatter
(
os
,
quote_char
[
0
]
);
if
(
pcb
)
{
if
(
aNameChange
)
pcb
->
pcbname
=
CONV_TO_UTF8
(
filename
);
pcb
->
Format
(
this
,
0
);
pcb
->
Format
(
&
outputFormatter
,
0
);
}
// if an exception is thrown by Format, then ~SPECCTRA_DB() will close
// the file.
fclose
(
fp
);
fp
=
0
;
}
void
SPECCTRA_DB
::
ExportSESSION
(
wxString
filename
)
{
fp
=
wxFopen
(
filename
,
wxT
(
"w"
)
);
if
(
!
fp
)
if
(
session
)
{
ThrowIOError
(
_
(
"Unable to open file
\"
%s
\"
"
),
GetChars
(
filename
)
);
}
wxFFileOutputStream
os
(
filename
,
wxT
(
"wt"
)
);
if
(
session
)
session
->
Format
(
this
,
0
);
if
(
!
os
.
IsOk
()
)
{
ThrowIOError
(
_
(
"Unable to open file
\"
%s
\"
"
),
GetChars
(
filename
)
);
}
fclose
(
fp
);
fp
=
0
;
STREAM_OUTPUTFORMATTER
outputFormatter
(
os
,
quote_char
[
0
]
);
session
->
Format
(
&
outputFormatter
,
0
);
}
}
...
...
pcbnew/specctra.h
View file @
f285c829
...
...
@@ -3970,7 +3970,7 @@ typedef boost::ptr_set<PADSTACK> PADSTACKSET;
* Class SPECCTRA_DB
* holds a DSN data tree, usually coming from a DSN file.
*/
class
SPECCTRA_DB
:
public
OUTPUTFORMATTER
class
SPECCTRA_DB
{
/// specctra DSN keywords
static
const
KEYWORD
keywords
[];
...
...
@@ -3979,13 +3979,8 @@ class SPECCTRA_DB : public OUTPUTFORMATTER
DSNLEXER
*
lexer
;
PCB
*
pcb
;
SESSION
*
session
;
FILE
*
fp
;
wxString
filename
;
std
::
string
quote_char
;
bool
modulesAreFlipped
;
...
...
@@ -4304,7 +4299,6 @@ public:
lexer
=
0
;
pcb
=
0
;
session
=
0
;
fp
=
0
;
quote_char
+=
'"'
;
modulesAreFlipped
=
false
;
}
...
...
@@ -4316,18 +4310,8 @@ public:
delete
session
;
deleteNETs
();
if
(
fp
)
fclose
(
fp
);
}
//-----<OUTPUTFORMATTER>-------------------------------------------------
int
PRINTF_FUNC
Print
(
int
nestLevel
,
const
char
*
fmt
,
...
)
throw
(
IOError
);
const
char
*
GetQuoteChar
(
const
char
*
wrapee
);
//-----</OUTPUTFORMATTER>------------------------------------------------
static
const
char
*
TokenName
(
int
aToken
);
...
...
@@ -4354,11 +4338,6 @@ public:
}
PCB
*
GetPCB
()
{
return
pcb
;
}
void
SetFILE
(
FILE
*
aFile
)
{
fp
=
aFile
;
}
/**
* Function SetSESSION
* deletes any existing SESSION and replaces it with the given one.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment