c90f71dd8c
special cases and other things in wxPython, and since I plan on making several more, I've decided to put the SWIG sources in wxPython's CVS instead of relying on maintaining patches. This effectivly becomes a fork of an obsolete version of SWIG, :-( but since SWIG 1.3 still doesn't have some things I rely on in 1.1, not to mention that my custom patches would all have to be redone, I felt that this is the easier road to take. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15307 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
465 lines
11 KiB
C++
465 lines
11 KiB
C++
/*******************************************************************************
|
|
* Simplified Wrapper and Interface Generator (SWIG)
|
|
*
|
|
* Author : David Beazley
|
|
*
|
|
* Department of Computer Science
|
|
* University of Chicago
|
|
* 1100 E 58th Street
|
|
* Chicago, IL 60637
|
|
* beazley@cs.uchicago.edu
|
|
*
|
|
* Please read the file LICENSE for the copyright and terms by which SWIG
|
|
* can be used and distributed.
|
|
*******************************************************************************/
|
|
|
|
#include "swig.h"
|
|
#include "ascii.h"
|
|
#include <ctype.h>
|
|
|
|
/*******************************************************************************
|
|
* $Header$
|
|
*
|
|
* File : ascii.cxx
|
|
*
|
|
* Module for producing ASCII documentation.
|
|
*
|
|
*******************************************************************************/
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// ASCII::ASCII()
|
|
//
|
|
// Constructor. Initializes the ASCII module.
|
|
//
|
|
// Inputs : None
|
|
//
|
|
// Output : Documentation module object
|
|
//
|
|
// Side Effects :
|
|
// Sets page-width and indentation.
|
|
// -----------------------------------------------------------------------------
|
|
|
|
ASCII::ASCII() {
|
|
sect_count = 0;
|
|
indent = 8;
|
|
columns = 70;
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// void ASCII::print_string(char *s, int margin, int mode)
|
|
//
|
|
// Prints a string to the documentation file. Performs line wrapping and
|
|
// other formatting.
|
|
//
|
|
// Inputs :
|
|
// s = NULL terminate ASCII string
|
|
// margin = Number of characters to be inserted on left side
|
|
// mode = If set, text will be reformatted. Otherwise, it's
|
|
// printed verbatim (with indentation).
|
|
//
|
|
// Output : None
|
|
//
|
|
// Side Effects : None
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void ASCII::print_string(char *s, int margin, int mode) {
|
|
|
|
char *c;
|
|
int i;
|
|
int lbreak = 0;
|
|
int col;
|
|
|
|
c = s;
|
|
|
|
if (!s) return;
|
|
// Apply indentation
|
|
|
|
for (i = 0; i < margin; i++)
|
|
fputc(' ',f_doc);
|
|
|
|
col = margin;
|
|
if (mode) {
|
|
|
|
// Dump out text in formatted mode
|
|
|
|
// Strip leading white-space
|
|
|
|
while ((*c) && (isspace(*c))) {
|
|
c++;
|
|
}
|
|
while (*c) {
|
|
switch(*c) {
|
|
case '\n':
|
|
case '\\':
|
|
if (lbreak) {
|
|
col = margin;
|
|
fputc('\n',f_doc);
|
|
for (i = 0; i < margin; i++)
|
|
fputc(' ',f_doc);
|
|
lbreak = 0;
|
|
} else {
|
|
if ((*c) == '\n') {
|
|
col++;
|
|
}
|
|
lbreak++;
|
|
}
|
|
break;
|
|
case ' ':
|
|
case '\t':
|
|
case '\r':
|
|
case '\f':
|
|
if (col > columns) {
|
|
fputc('\n',f_doc);
|
|
for (i = 0; i < margin; i++)
|
|
fputc(' ',f_doc);
|
|
col = margin;
|
|
} else {
|
|
fputc(' ',f_doc);
|
|
col++;
|
|
}
|
|
// Skip over rest of white space found
|
|
while ((*c) && isspace(*c)) c++;
|
|
c--;
|
|
lbreak = 0;
|
|
break;
|
|
default :
|
|
if (lbreak) fputc(' ',f_doc);
|
|
lbreak = 0;
|
|
fputc(*c,f_doc);
|
|
col++;
|
|
break;
|
|
}
|
|
c++;
|
|
}
|
|
} else {
|
|
// Dump out text in pre-formatted mode
|
|
while (*c) {
|
|
switch(*c) {
|
|
case '\n':
|
|
fputc('\n',f_doc);
|
|
for (i = 0; i < margin; i++)
|
|
fputc(' ',f_doc);
|
|
break;
|
|
default :
|
|
fputc(*c,f_doc);
|
|
col++;
|
|
break;
|
|
}
|
|
c++;
|
|
}
|
|
}
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// void ASCII::print_decl(DocEntry *de)
|
|
//
|
|
// Prints the documentation entry corresponding to a declaration
|
|
//
|
|
// Inputs :
|
|
// de = Documentation entry (which should be for a declaration)
|
|
//
|
|
// Output : None
|
|
//
|
|
// Side Effects : None
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void ASCII::print_decl(DocEntry *de) {
|
|
|
|
int i;
|
|
char *c;
|
|
|
|
c = de->usage.get();
|
|
fprintf(f_doc,"%s\n",c);
|
|
|
|
// If there is any C annotation, print that
|
|
if (de->print_info) {
|
|
c = de->cinfo.get();
|
|
if (strlen(c) > 0) {
|
|
for (i = 0; i < indent; i++)
|
|
fputc(' ',f_doc);
|
|
fprintf(f_doc,"[ ");
|
|
print_string(c,0,1);
|
|
fprintf(f_doc," ]\n");
|
|
}
|
|
}
|
|
|
|
c = de->text.get();
|
|
if (strlen(c) > 0) {
|
|
print_string(c,indent,de->format);
|
|
fprintf(f_doc,"\n");
|
|
if (de->format) fputc('\n',f_doc);
|
|
} else {
|
|
fprintf(f_doc,"\n");
|
|
}
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// void ASCII::print_text(DocEntry *de)
|
|
//
|
|
// Prints the documentation for a block of text. Will strip any leading white
|
|
// space from the text block.
|
|
//
|
|
// Inputs :
|
|
// de = Documentation entry of text
|
|
//
|
|
// Output : None
|
|
//
|
|
// Side Effects : None
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void ASCII::print_text(DocEntry *de) {
|
|
char *c;
|
|
c = de->text.get();
|
|
if (strlen(c) > 0) {
|
|
while ((*c == '\n')) c++;
|
|
print_string(c,0,de->format);
|
|
fprintf(f_doc,"\n\n");
|
|
}
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// void ASCII::title(DocEntry *de)
|
|
//
|
|
// Sets the title of the documentation file.
|
|
//
|
|
// Inputs :
|
|
// de = Documentation entry of the title.
|
|
//
|
|
// Output : None
|
|
//
|
|
// Side Effects : None
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void ASCII::title(DocEntry *de) {
|
|
char *c;
|
|
|
|
c = de->usage.get();
|
|
if (strlen(c) > 0) {
|
|
fprintf(f_doc,"%s\n\n",c);
|
|
}
|
|
|
|
// If there is any C annotation, print that
|
|
if (de->print_info) {
|
|
c = de->cinfo.get();
|
|
if (strlen(c) > 0) {
|
|
fprintf(f_doc,"[ ");
|
|
print_string(c,0,1);
|
|
fprintf(f_doc," ]\n");
|
|
}
|
|
}
|
|
|
|
c = de->text.get();
|
|
if (strlen(c)) {
|
|
print_string(c,0,de->format);
|
|
}
|
|
fprintf(f_doc,"\n\n");
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// void ASCII::newsection(DocEntry *de, int sectnum)
|
|
//
|
|
// Starts a new section. Will underline major sections and subsections, but
|
|
// not minor subsections.
|
|
//
|
|
// Inputs :
|
|
// de = Documentation entry of the section
|
|
// sectnum = Section number.
|
|
//
|
|
// Output : None
|
|
//
|
|
// Side Effects :
|
|
// Forces a new subsection to be created within the ASCII module.
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void ASCII::newsection(DocEntry *de,int sectnum) {
|
|
int i,len = 0;
|
|
char temp[256];
|
|
char *c;
|
|
|
|
sect_num[sect_count] = sectnum;
|
|
sect_count++;
|
|
for (i = 0; i < sect_count; i++) {
|
|
sprintf(temp,"%d.",sect_num[i]);
|
|
fprintf(f_doc,"%s",temp);
|
|
len += strlen(temp);
|
|
}
|
|
c = de->usage.get();
|
|
fprintf(f_doc," %s\n", c);
|
|
len += strlen(c) + 2;
|
|
|
|
// Print an underline if this is a major category
|
|
|
|
if (sect_count <= 1) {
|
|
for (i = 0; i < len; i++)
|
|
fputc('=',f_doc);
|
|
fputc('\n',f_doc);
|
|
} else if (sect_count == 2) {
|
|
for (i = 0; i < len; i++)
|
|
fputc('-',f_doc);
|
|
fputc('\n',f_doc);
|
|
} else {
|
|
fputc('\n',f_doc);
|
|
}
|
|
|
|
// If there is any C annotation, print that
|
|
if (de->print_info) {
|
|
c = de->cinfo.get();
|
|
if (strlen(c) > 0) {
|
|
fprintf(f_doc,"[ ");
|
|
print_string(c,0,1);
|
|
fprintf(f_doc," ]\n\n");
|
|
}
|
|
}
|
|
|
|
// If there is a description text. Print it
|
|
|
|
c = de->text.get();
|
|
if (strlen(c) > 0) {
|
|
print_string(c,0,de->format);
|
|
fprintf(f_doc,"\n");
|
|
}
|
|
fprintf(f_doc,"\n");
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// void ASCII::endsection()
|
|
//
|
|
// Ends the current section. It is an error to call this without having first
|
|
// called newsection().
|
|
//
|
|
// Inputs : None
|
|
//
|
|
// Output : None
|
|
//
|
|
// Side Effects :
|
|
// Pops out of the current section, moving back into the parent section
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void ASCII::endsection() {
|
|
if (sect_count > 0) sect_count--;
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// void ASCII::separator()
|
|
//
|
|
// Prints a small dashed line that is used to designate the end of C++ class
|
|
// subsections.
|
|
//
|
|
// Inputs : None
|
|
//
|
|
// Output : None
|
|
//
|
|
// Side Effects : None
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void ASCII::separator() {
|
|
int i;
|
|
for (i = 0; i < 10; i++)
|
|
fputc('-',f_doc);
|
|
fprintf(f_doc,"\n\n");
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// void ASCII::init(char *filename)
|
|
//
|
|
// Initializes the documentation module and opens up the documentation file.
|
|
//
|
|
// Inputs : filename = name of documentation file (without suffix)
|
|
//
|
|
// Output : None
|
|
//
|
|
// Side Effects : Opens the documentation file.
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void ASCII::init(char *filename) {
|
|
char f[256];
|
|
|
|
sprintf(f,"%s.doc",filename);
|
|
sprintf(fn,"%s",filename);
|
|
f_doc = fopen(f,"w");
|
|
if (f_doc == NULL) {
|
|
fprintf(stderr, "Unable to open %s\n", fn);
|
|
SWIG_exit(1);
|
|
}
|
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// void ASCII::close()
|
|
//
|
|
// Closes the documentation module. This function should only be called once
|
|
//
|
|
// Inputs : None
|
|
//
|
|
// Output : None
|
|
//
|
|
// Side Effects : Closes the documentation file.
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void ASCII::close(void) {
|
|
|
|
fclose(f_doc);
|
|
if (Verbose)
|
|
fprintf(stderr,"Documentation written to %s.doc\n", fn);
|
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// void ASCII::style(char *name, char *value)
|
|
//
|
|
// Looks for style parameters that the user might have supplied using the
|
|
// %style directive. Unrecognized options are simply ignored.
|
|
//
|
|
// Inputs :
|
|
// name = name of the style parameter
|
|
// value = value of the style parameter (optional)
|
|
//
|
|
// Output : None
|
|
//
|
|
// Side Effects : Can change internal settings of 'indent' and 'columns' members.
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void ASCII::style(char *name, char *value) {
|
|
if (strcmp(name,"ascii_indent") == 0) {
|
|
if (value) {
|
|
indent = atoi(value);
|
|
}
|
|
} else if (strcmp(name,"ascii_columns") == 0) {
|
|
if (value) {
|
|
columns = atoi(value);
|
|
}
|
|
}
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// void ASCII::parse_args(int argc, char **argv)
|
|
//
|
|
// Function for processing options supplied on the SWIG command line.
|
|
//
|
|
// Inputs :
|
|
// argc = Number of arguments
|
|
// argv = Argument strings
|
|
//
|
|
// Output : None
|
|
//
|
|
// Side Effects : May set various internal parameters.
|
|
// -----------------------------------------------------------------------------
|
|
|
|
static char *ascii_usage = "\
|
|
ASCII Documentation Options (available with -dascii)\n\
|
|
None available.\n\n";
|
|
|
|
void ASCII::parse_args(int argc, char **argv) {
|
|
int i;
|
|
|
|
for (i = 0; i < argc; i++) {
|
|
if (argv[i]) {
|
|
if (strcmp(argv[i],"-help") == 0) {
|
|
fputs(ascii_usage,stderr);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|