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
		
			
				
	
	
		
			698 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			698 lines
		
	
	
		
			20 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 "internal.h"
 | 
						|
 | 
						|
/*******************************************************************************
 | 
						|
 * $Header$
 | 
						|
 *
 | 
						|
 * File : comment.cxx
 | 
						|
 *
 | 
						|
 * This is a semi-magical module for associating C/C++ comments with 
 | 
						|
 * documentation entries.   While this sounds like it might be easy,
 | 
						|
 * there are a number of subtle problems getting things to associate
 | 
						|
 * correctly.
 | 
						|
 *
 | 
						|
 * Here's the general idea :
 | 
						|
 *
 | 
						|
 *      1.   The parser and scanner feed both C comments and documentation
 | 
						|
 *           entries to this class.    These may show up in really bizarre
 | 
						|
 *           orders (not necessarily the order seen in an interface file). 
 | 
						|
 *
 | 
						|
 *      2.   We maintain separate lists of comments and documentation 
 | 
						|
 *           entries.
 | 
						|
 *
 | 
						|
 *      3.   Periodically, we go through the list of documentation entries
 | 
						|
 *           and see if we can associate any comments.
 | 
						|
 *
 | 
						|
 *      4.   Upon completion of parsing, it's critical that we cleanup
 | 
						|
 *           the lists using the cleanup() method.
 | 
						|
 *
 | 
						|
 *******************************************************************************/
 | 
						|
 | 
						|
// -----------------------------------------------------------------------------
 | 
						|
// struct Comment
 | 
						|
// 
 | 
						|
// Structure used to maintain a linked list of comments for later use.
 | 
						|
// -----------------------------------------------------------------------------
 | 
						|
 | 
						|
class Comment {
 | 
						|
public:  
 | 
						|
  String          *text;                   // Text of the comment
 | 
						|
  int              first_line;             // First line of the comment
 | 
						|
  int              last_line;              // Last line of the comment
 | 
						|
  int              column;                 // First column of comment
 | 
						|
  char            *file;                   // Name of the file that it was in
 | 
						|
  Comment         *next;                   // Next comment (when in a linked list)
 | 
						|
  Comment         *prev;                   // Previous comment
 | 
						|
  static Comment  *comment_list;           // List of all comments
 | 
						|
 | 
						|
  Comment(char *t, int line, int col, char *f);
 | 
						|
  ~Comment();
 | 
						|
  static Comment *find(DocEntry *de, CommentHandler *ch);
 | 
						|
  void attach(DocEntry *de, CommentHandler *ch);
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
// -----------------------------------------------------------------------
 | 
						|
// Create a new comment.  Automatically puts it on the linked list
 | 
						|
// -----------------------------------------------------------------------
 | 
						|
Comment::Comment(char *t, int line, int col, char *f) {
 | 
						|
    int   nlines = 0;
 | 
						|
    char *c;
 | 
						|
 | 
						|
    text = new String(t);
 | 
						|
    c = t;
 | 
						|
    while (*c) {
 | 
						|
      if (*c == '\n') nlines++;
 | 
						|
      c++;
 | 
						|
    }
 | 
						|
    first_line = line;
 | 
						|
    column = col;
 | 
						|
    last_line = line + nlines - 1;
 | 
						|
    file = copy_string(f);
 | 
						|
    if (comment_list) {
 | 
						|
      comment_list->prev = this;
 | 
						|
    }
 | 
						|
    next = comment_list;
 | 
						|
    comment_list = this;
 | 
						|
    prev = 0;
 | 
						|
}
 | 
						|
 | 
						|
// -----------------------------------------------------------------------
 | 
						|
// Destroy a comment
 | 
						|
// -----------------------------------------------------------------------
 | 
						|
Comment::~Comment() {
 | 
						|
    delete text;
 | 
						|
    delete file;
 | 
						|
    // Remove from linked list (if applicable)
 | 
						|
    if (prev) {
 | 
						|
      prev->next = next;
 | 
						|
    }
 | 
						|
    if (next) {
 | 
						|
      next->prev = prev;
 | 
						|
    }
 | 
						|
    if (this == comment_list) comment_list = next;
 | 
						|
}
 | 
						|
// -----------------------------------------------------------------------
 | 
						|
// find(DocEntry *de, CommentHandler *ch)
 | 
						|
// 
 | 
						|
// This function tries to a find a comment matching the search criteria
 | 
						|
// of a given comment handler and documentation entry.
 | 
						|
// -----------------------------------------------------------------------
 | 
						|
  
 | 
						|
Comment *Comment::find(DocEntry *de, CommentHandler *ch) {
 | 
						|
    Comment *c;
 | 
						|
 | 
						|
    c = comment_list;
 | 
						|
 | 
						|
    // Start walking down our list of stored comments
 | 
						|
 | 
						|
    while (c) {
 | 
						|
      //      printf("Searching %x : %s\n", c, c->text->get());
 | 
						|
      if (strcmp(de->file,c->file) == 0) {
 | 
						|
 | 
						|
	// At least comment is in the right file.  Now check line numbers
 | 
						|
 | 
						|
	if (ch->location == BEFORE) {
 | 
						|
	  
 | 
						|
	  // Check to see if the last line of the comment is close
 | 
						|
	  // enough to our declaration.
 | 
						|
 | 
						|
	  if ((c->last_line <= de->line_number) && 
 | 
						|
	      ((de->line_number - c->last_line) <= ch->skip_lines)) {
 | 
						|
	    return c;
 | 
						|
	  }
 | 
						|
	} else {     // AFTER mode
 | 
						|
	  // Check to see if the first line of the comment is close
 | 
						|
	  // enough to our declaration.
 | 
						|
 | 
						|
	  if ((c->first_line >= de->end_line) &&
 | 
						|
	      ((c->first_line - de->end_line) <= ch->skip_lines)) {
 | 
						|
	    return c;
 | 
						|
	  }
 | 
						|
	}
 | 
						|
	// Check to see if the line numbers are too small.  Comments
 | 
						|
	// are processed in order so there's no sense in checking
 | 
						|
	// all entries.
 | 
						|
 | 
						|
	if (c->last_line < de->line_number)
 | 
						|
	  return 0;
 | 
						|
 | 
						|
      }
 | 
						|
      c = c->next;
 | 
						|
    }
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
// -----------------------------------------------------------------------
 | 
						|
// void attach(DocEntry *de, CommentHandler *ch)
 | 
						|
// 
 | 
						|
// This function attachs a comment to a documentation entry and applies
 | 
						|
// all of the style information in the comment handler.
 | 
						|
// -----------------------------------------------------------------------
 | 
						|
void Comment::attach(DocEntry *de, CommentHandler *ch) {
 | 
						|
    int    nlines = 0;
 | 
						|
    char   **split = 0;
 | 
						|
    char   *c;
 | 
						|
    int    i,lnum,el;
 | 
						|
    if (!de) return;
 | 
						|
 | 
						|
    // If we're ignoring comments, forget it
 | 
						|
    if (ch->ignore) {
 | 
						|
      return;
 | 
						|
    }
 | 
						|
 | 
						|
    // If the comment is formatted, no style processing is applied
 | 
						|
 | 
						|
    if (de->format) {
 | 
						|
      de->text << *text;
 | 
						|
      return;
 | 
						|
    }
 | 
						|
 | 
						|
    // Untabify the comment
 | 
						|
 | 
						|
    if (ch->untabify) text->untabify(); 
 | 
						|
 | 
						|
    // Count how many lines we have
 | 
						|
 | 
						|
    c = text->get();
 | 
						|
    while (*c) {
 | 
						|
      if (*c == '\n') nlines++;
 | 
						|
      c++;
 | 
						|
    }
 | 
						|
 | 
						|
    if (nlines == 0) return;
 | 
						|
 | 
						|
    // Tokenize the documentation string into lines
 | 
						|
 | 
						|
    split = new char*[nlines+1];
 | 
						|
    c = text->get();
 | 
						|
    i = 0;
 | 
						|
    split[i] = c;
 | 
						|
    while (*c) {
 | 
						|
      if (*c == '\n') {
 | 
						|
	*(c++) = 0;
 | 
						|
 	split[++i] = c;
 | 
						|
      } else c++;
 | 
						|
    }
 | 
						|
    lnum = 0;
 | 
						|
 | 
						|
    // Now process the chop_top and chop_bottom values
 | 
						|
    // if nlines < (chop_top + chop_bottom), then we do nothing
 | 
						|
 | 
						|
    if (nlines > (ch->chop_top + ch->chop_bottom)) {
 | 
						|
      lnum += ch->chop_top;
 | 
						|
      el = nlines-ch->chop_bottom;
 | 
						|
    } else {
 | 
						|
      el = nlines;
 | 
						|
    }
 | 
						|
 | 
						|
    // Now process in-between lines
 | 
						|
 | 
						|
    while (lnum < el) {
 | 
						|
      /* Chop line */
 | 
						|
      if (split[lnum]) {
 | 
						|
	if (strlen(split[lnum]) > (unsigned) (ch->chop_left+ch->chop_right)) {
 | 
						|
	  if (ch->chop_right > 0) 
 | 
						|
	    split[lnum][strlen(split[lnum]) - ch->chop_right] = 0;
 | 
						|
	  de->text << &split[lnum][ch->chop_left];
 | 
						|
	}
 | 
						|
      }
 | 
						|
      lnum++;
 | 
						|
      de->text << "\n";
 | 
						|
    }
 | 
						|
 | 
						|
    //    printf("*** ATTACHING %s : %s\n", de->usage.get(), de->text.get());
 | 
						|
    delete split;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
CommentHandler     *comment_handler = 0;
 | 
						|
Comment            *Comment::comment_list = 0;
 | 
						|
 | 
						|
// ------------------------------------------------------------------------
 | 
						|
// struct DocEntryList
 | 
						|
//
 | 
						|
// This structure manages a linked list of documentation entries that
 | 
						|
// haven't had comments attached to them yet.
 | 
						|
//
 | 
						|
// As a general rule, this list tends to remain rather short.
 | 
						|
// ------------------------------------------------------------------------
 | 
						|
 | 
						|
struct DocEntryList {
 | 
						|
  DocEntry         *de;
 | 
						|
  CommentHandler   *ch;
 | 
						|
  DocEntryList     *next;
 | 
						|
  DocEntryList     *prev;
 | 
						|
  static DocEntryList *doc_list;
 | 
						|
  
 | 
						|
  // -----------------------------------------------------------------------
 | 
						|
  // Create a new list entry
 | 
						|
  // -----------------------------------------------------------------------
 | 
						|
  DocEntryList(DocEntry *d, CommentHandler *c) {
 | 
						|
 | 
						|
    de = d;
 | 
						|
    ch = c;
 | 
						|
    next = doc_list;
 | 
						|
    prev = 0;
 | 
						|
    if (doc_list)
 | 
						|
      doc_list->prev = this;
 | 
						|
    doc_list = this;
 | 
						|
 | 
						|
    // Only allow a few doc entries to survive
 | 
						|
 | 
						|
    if (this->next) {
 | 
						|
      if (this->next->next) {
 | 
						|
	delete this->next->next;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  // -----------------------------------------------------------------------
 | 
						|
  // Destroy a list entry
 | 
						|
  // -----------------------------------------------------------------------
 | 
						|
  ~DocEntryList() {
 | 
						|
    if (prev) {
 | 
						|
      prev->next = next;
 | 
						|
    }
 | 
						|
    if (next) {
 | 
						|
      next->prev = prev;
 | 
						|
    }
 | 
						|
    if (this == doc_list) doc_list = next;
 | 
						|
  };
 | 
						|
  
 | 
						|
  // -----------------------------------------------------------------------
 | 
						|
  // static check()
 | 
						|
  //
 | 
						|
  // Checks the list of documentation entries to see if any can be associated.
 | 
						|
  // -----------------------------------------------------------------------
 | 
						|
 | 
						|
  static void check() {
 | 
						|
    
 | 
						|
    DocEntryList *dl, *dl_temp;
 | 
						|
    Comment      *cmt;
 | 
						|
 | 
						|
    //    printf ("Checking\n");
 | 
						|
    dl = doc_list;
 | 
						|
    while (dl) {
 | 
						|
      cmt = Comment::find(dl->de,dl->ch);
 | 
						|
      if (cmt) {
 | 
						|
	// Okay, we found a matching comment. Attach it to this
 | 
						|
	// documentation entry.
 | 
						|
	cmt->attach(dl->de,dl->ch);
 | 
						|
 | 
						|
	// Destroy the comment and doc list entry
 | 
						|
	delete cmt;
 | 
						|
 | 
						|
	// Declarations are always coming in order so we're going
 | 
						|
	// to blow away all of them past this point
 | 
						|
 | 
						|
	dl_temp = dl->next;
 | 
						|
	delete dl;
 | 
						|
	dl = dl_temp;
 | 
						|
      } else {
 | 
						|
	dl = dl->next;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
DocEntryList  *DocEntryList::doc_list = 0;
 | 
						|
 | 
						|
// -----------------------------------------------------------------------------
 | 
						|
// CommentHandler::CommentHandler()
 | 
						|
//
 | 
						|
// Constructor.  Creates a new comment handler.  Sets up some default values
 | 
						|
// for comment handling. 
 | 
						|
// 
 | 
						|
// Inputs : None
 | 
						|
//
 | 
						|
// Output : New CommentHandler object.
 | 
						|
//
 | 
						|
// Side Effects : Sets default comment handling parameters.
 | 
						|
// -----------------------------------------------------------------------------
 | 
						|
 | 
						|
CommentHandler::CommentHandler() {
 | 
						|
  skip_lines = 1;
 | 
						|
  location = AFTER;
 | 
						|
  chop_top = 0;
 | 
						|
  chop_bottom = 0;
 | 
						|
  chop_left = 3;
 | 
						|
  chop_right = 0;
 | 
						|
  untabify = 1;
 | 
						|
  ignore = 0;
 | 
						|
}
 | 
						|
 | 
						|
// -----------------------------------------------------------------------------
 | 
						|
// CommentHandler::CommentHandler(CommentHandler *c) 
 | 
						|
// 
 | 
						|
// Constructor.  Creates a new comment handler, but copies attributes from 
 | 
						|
// another handler.
 | 
						|
//
 | 
						|
// Inputs : 
 | 
						|
//          c   = A different comment handler.
 | 
						|
//
 | 
						|
// Output : A new CommentHandler object.
 | 
						|
//
 | 
						|
// Side Effects : None
 | 
						|
// -----------------------------------------------------------------------------
 | 
						|
 | 
						|
CommentHandler::CommentHandler(CommentHandler *c) {
 | 
						|
  skip_lines = c->skip_lines;
 | 
						|
  location = c->location;
 | 
						|
  chop_top = c->chop_top;
 | 
						|
  chop_bottom = c->chop_bottom;
 | 
						|
  chop_left = c->chop_left;
 | 
						|
  chop_right = c->chop_right; 
 | 
						|
  untabify = c->untabify;
 | 
						|
  ignore = c->ignore;
 | 
						|
}
 | 
						|
 | 
						|
// -----------------------------------------------------------------------------
 | 
						|
// CommentHandler::~CommentHandler()
 | 
						|
// 
 | 
						|
// Destructor.  Destroys a comment handler.  Does nothing interesting at the
 | 
						|
// moment.
 | 
						|
//
 | 
						|
// Inputs : None
 | 
						|
//
 | 
						|
// Output : None
 | 
						|
//
 | 
						|
// Side Effects : None
 | 
						|
// -----------------------------------------------------------------------------
 | 
						|
 | 
						|
CommentHandler::~CommentHandler() {
 | 
						|
}
 | 
						|
 | 
						|
// -----------------------------------------------------------------------------
 | 
						|
// void CommentHandler::add_comment(char *text, int line_num, int col, char *file)
 | 
						|
//
 | 
						|
// This function takes a character string as comment text and appends
 | 
						|
// it to the current comment string (which is held in Comment::comment_list)
 | 
						|
//
 | 
						|
//     1.   If two comments appear in successive lines, they are
 | 
						|
//          concatenated.   This is to handle C++ style comments like the
 | 
						|
//          one surrounding this text.
 | 
						|
//
 | 
						|
//     2.   If a new comment appears, we simply create a new one
 | 
						|
// 
 | 
						|
// Inputs :
 | 
						|
//          text     = Text of the comment
 | 
						|
//          line_num = Starting line number of the comment
 | 
						|
//          col      = Starting column of the comment
 | 
						|
//          file     = File in which the comment was located.
 | 
						|
//
 | 
						|
// Output : None
 | 
						|
//
 | 
						|
// Side Effects :
 | 
						|
//          Saves the comment in an internal linked list.
 | 
						|
//          If multiple comments appear in succession, some may end up
 | 
						|
//          in our comment list permanently (ie. never attached to any
 | 
						|
//          particular declaration).
 | 
						|
// -----------------------------------------------------------------------------
 | 
						|
 | 
						|
void CommentHandler::add_comment(char *text, int line_num, int col, char *file) {
 | 
						|
 | 
						|
  char *c;
 | 
						|
  int  nlines = 0;
 | 
						|
  Comment *cmt;
 | 
						|
 | 
						|
  //  printf("line_num = %d, %s\n", line_num,text);
 | 
						|
 | 
						|
  // Count up how many lines are in this comment
 | 
						|
 | 
						|
  c = text;
 | 
						|
  while (*c) {
 | 
						|
    if (*c == '\n') nlines++;
 | 
						|
    c++;
 | 
						|
  }
 | 
						|
 | 
						|
  // Check to see if this comment is in a successive line to the last one
 | 
						|
 | 
						|
  cmt = Comment::comment_list;
 | 
						|
  
 | 
						|
  if (cmt) {
 | 
						|
    
 | 
						|
    // Check for column alignment
 | 
						|
    if ((cmt->column == col) && (line_num == (cmt->last_line + 1)) &&
 | 
						|
	(nlines <= 1)) {
 | 
						|
      *(cmt->text) << text;
 | 
						|
      cmt->last_line = line_num + nlines - 1;
 | 
						|
    } else {
 | 
						|
    // This is a new comment, add it to our list
 | 
						|
      cmt = new Comment(text,line_num,col,file);
 | 
						|
    }
 | 
						|
  } else {
 | 
						|
    cmt = new Comment(text,line_num,col,file);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
// -----------------------------------------------------------------------------
 | 
						|
// void CommentHanlder::set_entry(DocEntry *d)
 | 
						|
//
 | 
						|
// This grabs a DocEntry and hangs onto it.
 | 
						|
//
 | 
						|
// We will place the doc entry into our documentation list and then
 | 
						|
// check it to see if any comments are sitting around.
 | 
						|
// 
 | 
						|
// Inputs : d = Documentation Entry
 | 
						|
//
 | 
						|
// Output : None
 | 
						|
//
 | 
						|
// Side Effects :
 | 
						|
//          May attach comments to the documentation entry.  In this case,
 | 
						|
//          comments and DocEntries may be removed from internal lists.
 | 
						|
// -----------------------------------------------------------------------------
 | 
						|
 | 
						|
void CommentHandler::set_entry(DocEntry *d) {
 | 
						|
 | 
						|
  //  printf("Set entry : file: %s, line %d, %s\n", d->file, d->line_number, d->usage.get());
 | 
						|
 | 
						|
  // Create a new list entry and save it
 | 
						|
 | 
						|
  new DocEntryList(d,this);
 | 
						|
 | 
						|
  // Check all of the documentation entries to see if they can be placed
 | 
						|
 | 
						|
  DocEntryList::check();
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
// -----------------------------------------------------------------------------
 | 
						|
// static void CommentHandler::cleanup() 
 | 
						|
// 
 | 
						|
// Checks all documentation entries and sees if there are any comments available.
 | 
						|
// If so, they are attached.  This function is usually only called upon completion
 | 
						|
// of parsing.
 | 
						|
//
 | 
						|
// Inputs : None
 | 
						|
//
 | 
						|
// Output : None
 | 
						|
//
 | 
						|
// Side Effects : 
 | 
						|
//          Removes documentation entries and comments from internal lists.
 | 
						|
//          
 | 
						|
// -----------------------------------------------------------------------------
 | 
						|
 | 
						|
void CommentHandler::cleanup() {
 | 
						|
  int nc, nd;
 | 
						|
  Comment *c;
 | 
						|
  DocEntryList *d;
 | 
						|
 | 
						|
  DocEntryList::check();
 | 
						|
 | 
						|
  // Figure out how bad we're doing on memory
 | 
						|
 | 
						|
  nc = 0;
 | 
						|
  nd = 0;
 | 
						|
  c = Comment::comment_list;
 | 
						|
  while (c) {
 | 
						|
    nc++;
 | 
						|
    c = c->next;
 | 
						|
  }
 | 
						|
  
 | 
						|
  d = DocEntryList::doc_list;
 | 
						|
  while(d) {
 | 
						|
    nd++;
 | 
						|
    d = d->next;
 | 
						|
  }
 | 
						|
 | 
						|
  if (Verbose) {
 | 
						|
    printf("%d unprocessed comments, %d unprocessed doc entries.\n",nc,nd);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
// -----------------------------------------------------------------------------
 | 
						|
// void CommentHandler::style(char *name, char *value)
 | 
						|
// 
 | 
						|
// Processes comment handling style parameters. The following parameters
 | 
						|
// are available :
 | 
						|
//
 | 
						|
//          after           - Comments appear after a declaration
 | 
						|
//          before          - Comments appear before a declaration
 | 
						|
//          skip            - Number of blank lines between comment and decl.
 | 
						|
//          chop_top        - Number of lines to chop from top of a comment
 | 
						|
//          chop_bottom     - Number of lines to chop from bottom of a comment
 | 
						|
//          chop_left       - Number of characters to chop from left
 | 
						|
//          chop_right      - Number of characters to chop from right
 | 
						|
//          tabify          - Leave tabs in comment text
 | 
						|
//          untabify        - Strip tabs and convert them into spaces.
 | 
						|
//          ignore          - Ignore comments
 | 
						|
//          enable          - Enable comments
 | 
						|
//
 | 
						|
// Inputs :
 | 
						|
//          name            - Name of style parameter
 | 
						|
//          value           - Optional parameter value
 | 
						|
//
 | 
						|
// Output : None
 | 
						|
//
 | 
						|
// Side Effects : Changes style of comment handler object.
 | 
						|
//           
 | 
						|
// -----------------------------------------------------------------------------
 | 
						|
 | 
						|
void CommentHandler::style(char *name, char *value) {
 | 
						|
 | 
						|
  if (strcmp(name,"before") == 0) {
 | 
						|
    location = BEFORE;
 | 
						|
  } else if (strcmp(name,"after") == 0) {
 | 
						|
    location = AFTER;
 | 
						|
  } else if (strcmp(name,"skip") == 0) {
 | 
						|
    if (value) 
 | 
						|
      skip_lines = atoi(value);
 | 
						|
  } else if (strcmp(name,"chop_top") == 0) {
 | 
						|
    if (value) 
 | 
						|
      chop_top = atoi(value);
 | 
						|
  } else if (strcmp(name,"chop_bottom") == 0) {
 | 
						|
    if (value) 
 | 
						|
      chop_bottom = atoi(value);
 | 
						|
  } else if (strcmp(name,"chop_left") == 0) {
 | 
						|
    if (value) 
 | 
						|
      chop_left = atoi(value);
 | 
						|
  } else if (strcmp(name,"chop_right") == 0) {
 | 
						|
    if (value) 
 | 
						|
      chop_right = atoi(value);
 | 
						|
  } else if (strcmp(name,"tabify") == 0) {
 | 
						|
    untabify = 0;
 | 
						|
  } else if (strcmp(name,"untabify") == 0) {
 | 
						|
    untabify = 1;
 | 
						|
  } else if (strcmp(name,"ignore") == 0) {
 | 
						|
    ignore = 1;
 | 
						|
  } else if (strcmp(name,"enable") == 0) {
 | 
						|
    ignore = 0;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
// -----------------------------------------------------------------------------
 | 
						|
// void CommentHandler::parse_args(int argc, char **argv)
 | 
						|
//
 | 
						|
// Function for processing command line options given on the SWIG command line.
 | 
						|
// See the help string below for available options.
 | 
						|
// 
 | 
						|
// Inputs : 
 | 
						|
//          argc = Argument count
 | 
						|
//          argv = Argument strings
 | 
						|
//
 | 
						|
// Output : None
 | 
						|
//
 | 
						|
// Side Effects :
 | 
						|
//          Changes various style parameters for the top-level CommentHandler.
 | 
						|
// -----------------------------------------------------------------------------
 | 
						|
 | 
						|
static char *comment_usage = "\
 | 
						|
Comment Style Options : \n\
 | 
						|
     -Safter         - Use comments after a declaration.\n\
 | 
						|
     -Sbefore        - Use comments before a declaration.\n\
 | 
						|
     -Schop_bottom n - Chop n lines from bottom of comments.\n\
 | 
						|
     -Schop_left n   - Chop n characters from left of a comment.\n\
 | 
						|
     -Schop_right n  - Chop n characters from right of a comment.\n\
 | 
						|
     -Schop_top n    - Chop n lines from top of comments.\n\
 | 
						|
     -Signore        - Ignore comments.\n\
 | 
						|
     -Sskip n        - Max lines between comment and declaration.\n\
 | 
						|
     -Stabify        - Do not convert tabs.\n\
 | 
						|
     -Suntabify      - Convert tabs into spaces (the default).\n\n";
 | 
						|
 | 
						|
void CommentHandler::parse_args(int argc, char **argv) {
 | 
						|
  int i;
 | 
						|
 | 
						|
  for (i = 1; i < argc; i++) {
 | 
						|
      if (argv[i]) {
 | 
						|
	  if (strcmp(argv[i],"-Sbefore") == 0) {
 | 
						|
	    this->style("before",0);
 | 
						|
	    mark_arg(i);
 | 
						|
	  } else if (strcmp(argv[i],"-Safter") == 0) {
 | 
						|
	    this->style("after",0);
 | 
						|
	    mark_arg(i);
 | 
						|
	  } else if (strcmp(argv[i],"-Schop_top") == 0) {
 | 
						|
	    if (argv[i+1]) {
 | 
						|
	      this->style("chop_top",argv[i+1]);
 | 
						|
	      mark_arg(i);
 | 
						|
	      mark_arg(i+1);
 | 
						|
	      i++;
 | 
						|
	    } else {
 | 
						|
	      arg_error();
 | 
						|
	    }
 | 
						|
	  } else if (strcmp(argv[i],"-Schop_bottom") == 0) {
 | 
						|
	    if (argv[i+1]) {
 | 
						|
	      this->style("chop_bottom",argv[i+1]);
 | 
						|
	      mark_arg(i);
 | 
						|
	      mark_arg(i+1);
 | 
						|
	      i++;
 | 
						|
	    } else {
 | 
						|
	      arg_error();
 | 
						|
	    }
 | 
						|
	  } else if (strcmp(argv[i],"-Schop_left") == 0) {
 | 
						|
	    if (argv[i+1]) {
 | 
						|
	      this->style("chop_left",argv[i+1]);
 | 
						|
	      mark_arg(i);
 | 
						|
	      mark_arg(i+1);
 | 
						|
	      i++;
 | 
						|
	    } else {
 | 
						|
	      arg_error();
 | 
						|
	    }
 | 
						|
	  } else if (strcmp(argv[i],"-Schop_right") == 0) {
 | 
						|
	    if (argv[i+1]) {
 | 
						|
	      this->style("chop_right",argv[i+1]);
 | 
						|
	      mark_arg(i);
 | 
						|
	      mark_arg(i+1);
 | 
						|
	      i++;
 | 
						|
	    } else {
 | 
						|
	      arg_error();
 | 
						|
	    }
 | 
						|
	  } else if (strcmp(argv[i],"-Sskip") == 0) {
 | 
						|
	    if (argv[i+1]) {
 | 
						|
	      this->style("skip",argv[i+1]);
 | 
						|
	      mark_arg(i);
 | 
						|
	      mark_arg(i+1);
 | 
						|
	      i++;
 | 
						|
	    } else {
 | 
						|
	      arg_error();
 | 
						|
	    }
 | 
						|
	  } else if (strcmp(argv[i],"-Suntabify") == 0) {
 | 
						|
	    this->style("untabify",0);
 | 
						|
	    mark_arg(i);
 | 
						|
	  } else if (strcmp(argv[i],"-Stabify") == 0) {
 | 
						|
	    this->style("tabify",0);
 | 
						|
	    mark_arg(i);
 | 
						|
	  } else if (strcmp(argv[i],"-Signore") == 0) {
 | 
						|
	    this->style("ignore",0);
 | 
						|
	  } else if (strcmp(argv[i],"-help") == 0) {
 | 
						|
	    fputs(comment_usage,stderr);
 | 
						|
	  }
 | 
						|
      }
 | 
						|
  }
 | 
						|
}
 |