% % Tango/Weevil - A WEB Tangler and Weaver % Copyright (C) 1995 Corey Minyard % % 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, write to the Free Software % Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. % % Corey Minyard - minyard@metronet.com % @includefile weevinfo.xfr \section{C Language Handler Intro} This module holds the routines used to process ``C'' code for weevil. @code <*> @ @ @ @ @endcode \section{Includes} @code #include #include #include "weevinfo.h" @endcode \section{Structures} @code typedef struct { bool in_comment; int quote_char; } t_c_lang; @endcode \section{c\_handler\_char} \begin{twproc}{c\_handle\_char} \Description Handles a character for the ``C'' language. It will scan the input and return the proper code depending on if the code is currently in a string or comment. \ReturnValues \verb|int| - May be one of the following: \begin{twparmlist} \item[PROCESS\_CHAR\_NORMALLY] This is a standard character that should be handled normally by weevil. \item[PROCESS\_CHAR\_INSTRING] This character is in a string or comment, it should not be scanned for special weevil characters. \item[PROCESS\_CHAR\_SKIPNEXT] This character and the following character should be skipped without being scanned for special weevil characters. \end{twparmlist} \Inputs \begin{twparmlist} \item[lpwd] Weevil information. \item[c] The current input character. \item[next\_c] The next input character. \end{twparmlist} \StartCode @code int c_handle_char(t_lpweevildat *lpwd, char c, char next_c) { int retval; t_c_lang *c_info; c_info = lpwd->lang_data; if (c_info->in_comment) { if ((c == '*') && (next_c == '/')) { c_info->in_comment = FALSE; retval = PROCESS_CHAR_SKIPNEXT; } else { retval = PROCESS_CHAR_INSTRING; } } else if (c_info->quote_char != -1) { if (c == c_info->quote_char) { c_info->quote_char = -1; retval = PROCESS_CHAR_INSTRING; } else if (c == '\\') { retval = PROCESS_CHAR_SKIPNEXT; } else { retval = PROCESS_CHAR_INSTRING; } } else { retval = PROCESS_CHAR_NORMALLY; switch(c) { case '\'': case '"': c_info->quote_char = c; retval = PROCESS_CHAR_INSTRING; break; case '/': if (next_c == '*') { c_info->in_comment = TRUE; retval = PROCESS_CHAR_INSTRING; break; } break; default: /* Nothing to do. */ break; } } return(retval); } @endcode \end{twproc} \section{init\_c\_lang} \begin{twproc}{init\_c\_lang} \Description Initializes the ``C'' language handler. It allocates some memory and initializes it. \Inputs \begin{twparmlist} \item[lpwd] Weevil information. \end{twparmlist} \StartCode @code void init_c_lang(t_lpweevildat *lpwd) { t_c_lang *c_info; c_info = malloc(sizeof(*c_info)); if (c_info == NULL) { fprintf(stderr, "Unable to allocate enough memory\n"); exit(1); } c_info->quote_char = -1; c_info->in_comment = FALSE; lpwd->lang_data = c_info; } @endcode \end{twproc}