|
Packit |
1c1d7e |
/*****************************************************************************
|
|
Packit |
1c1d7e |
* Parser for Tcl subset
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Copyright (C) 2010 by Rene Zaumseil
|
|
Packit |
1c1d7e |
* based on the work of Dimitri van Heesch.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Permission to use, copy, modify, and distribute this software and its
|
|
Packit |
1c1d7e |
* documentation under the terms of the GNU General Public License is hereby
|
|
Packit |
1c1d7e |
* granted. No representations are made about the suitability of this software
|
|
Packit |
1c1d7e |
* for any purpose. It is provided "as is" without express or implied warranty.
|
|
Packit |
1c1d7e |
* See the GNU General Public License for more details.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Documents produced by Doxygen are derivative works derived from the
|
|
Packit |
1c1d7e |
* input used in their production; they are not affected by this license.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
%option never-interactive
|
|
Packit |
1c1d7e |
%option case-insensitive
|
|
Packit |
1c1d7e |
%option prefix="tclscannerYY"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
%{
|
|
Packit |
1c1d7e |
#include <stdio.h>
|
|
Packit |
1c1d7e |
#include <stdlib.h>
|
|
Packit |
1c1d7e |
#include <assert.h>
|
|
Packit |
1c1d7e |
#include <ctype.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include <qstring.h>
|
|
Packit |
1c1d7e |
#include <qstringlist.h>
|
|
Packit |
1c1d7e |
#include <qlist.h>
|
|
Packit |
1c1d7e |
#include <qmap.h>
|
|
Packit |
1c1d7e |
#include <qarray.h>
|
|
Packit |
1c1d7e |
#include <qstack.h>
|
|
Packit |
1c1d7e |
#include <qregexp.h>
|
|
Packit |
1c1d7e |
#include <qfile.h>
|
|
Packit |
1c1d7e |
#include <qdict.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "entry.h"
|
|
Packit |
1c1d7e |
#include "message.h"
|
|
Packit |
1c1d7e |
#include "config.h"
|
|
Packit |
1c1d7e |
#include "doxygen.h"
|
|
Packit |
1c1d7e |
#include "util.h"
|
|
Packit |
1c1d7e |
#include "defargs.h"
|
|
Packit |
1c1d7e |
#include "language.h"
|
|
Packit |
1c1d7e |
#include "commentscan.h"
|
|
Packit |
1c1d7e |
#include "pre.h"
|
|
Packit |
1c1d7e |
#include "tclscanner.h"
|
|
Packit |
1c1d7e |
#include "outputlist.h"
|
|
Packit |
1c1d7e |
#include "membername.h"
|
|
Packit |
1c1d7e |
#include "searchindex.h"
|
|
Packit |
1c1d7e |
#include "commentcnv.h"
|
|
Packit |
1c1d7e |
#include "bufstr.h"
|
|
Packit |
1c1d7e |
#include "portable.h"
|
|
Packit |
1c1d7e |
#include "arguments.h"
|
|
Packit |
1c1d7e |
#include "namespacedef.h"
|
|
Packit |
1c1d7e |
#include "filedef.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#define YY_NO_INPUT 1
|
|
Packit |
1c1d7e |
#define YY_NO_UNISTD_H 1
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#define MAX_INCLUDE_DEPTH 10
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Application error.
|
|
Packit |
1c1d7e |
#define tcl_err \
|
|
Packit |
1c1d7e |
printf("Error %d %s() at line %d! ",__LINE__,tcl.file_name.data(),yylineno); \
|
|
Packit |
1c1d7e |
yy_push_state(ERROR); \
|
|
Packit |
1c1d7e |
yyless(0); \
|
|
Packit |
1c1d7e |
printf
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Application warning.
|
|
Packit |
1c1d7e |
#define tcl_war \
|
|
Packit |
1c1d7e |
printf("Warning %d %s() at line %d: ",__LINE__,tcl.file_name.data(),yylineno); \
|
|
Packit |
1c1d7e |
printf
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Application message.
|
|
Packit |
1c1d7e |
#define tcl_inf \
|
|
Packit |
1c1d7e |
if (0) printf("--- %.4d %d@%d: ",__LINE__,yylineno,yy_start_stack_ptr) && printf
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Debug message.
|
|
Packit |
1c1d7e |
#define D\
|
|
Packit |
1c1d7e |
if (0) printf("--- %.4d %d@%d: %s\n",__LINE__,yylineno,yy_start_stack_ptr,yytext);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// BEGIN of copy from tclUtil.c
|
|
Packit |
1c1d7e |
// - Tcl_Interp removed
|
|
Packit |
1c1d7e |
// - changes are marked with RZ
|
|
Packit |
1c1d7e |
// #define's to adapt the code:
|
|
Packit |
1c1d7e |
#define CONST const
|
|
Packit |
1c1d7e |
#define UCHAR (unsigned char)
|
|
Packit |
1c1d7e |
#define TCL_ERROR 1
|
|
Packit |
1c1d7e |
#define TCL_OK 0
|
|
Packit |
1c1d7e |
#define ckalloc malloc
|
|
Packit |
1c1d7e |
#define ckfree free
|
|
Packit |
1c1d7e |
#define TclCopyAndCollapse(size,src,dest) memcpy(dest,src,size); *(dest+size)=0
|
|
Packit |
1c1d7e |
int TclFindElement(
|
|
Packit |
1c1d7e |
CONST char *list, /* Points to the first byte of a string
|
|
Packit |
1c1d7e |
* containing a Tcl list with zero or more
|
|
Packit |
1c1d7e |
* elements (possibly in braces). */
|
|
Packit |
1c1d7e |
int listLength, /* Number of bytes in the list's string. */
|
|
Packit |
1c1d7e |
CONST char **elementPtr, /* Where to put address of first significant
|
|
Packit |
1c1d7e |
* character in first element of list. */
|
|
Packit |
1c1d7e |
CONST char **nextPtr, /* Fill in with location of character just
|
|
Packit |
1c1d7e |
* after all white space following end of
|
|
Packit |
1c1d7e |
* argument (next arg or end of list). */
|
|
Packit |
1c1d7e |
int *sizePtr, /* If non-zero, fill in with size of
|
|
Packit |
1c1d7e |
* element. */
|
|
Packit |
1c1d7e |
int *bracePtr) /* If non-zero, fill in with non-zero/zero to
|
|
Packit |
1c1d7e |
* indicate that arg was/wasn't in braces. */
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
CONST char *p = list;
|
|
Packit |
1c1d7e |
CONST char *elemStart; /* Points to first byte of first element. */
|
|
Packit |
1c1d7e |
CONST char *limit; /* Points just after list's last byte. */
|
|
Packit |
1c1d7e |
int openBraces = 0; /* Brace nesting level during parse. */
|
|
Packit |
1c1d7e |
int inQuotes = 0;
|
|
Packit |
1c1d7e |
int size = 0; /* lint. */
|
|
Packit |
1c1d7e |
//RZ int numChars;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
* Skim off leading white space and check for an opening brace or quote.
|
|
Packit |
1c1d7e |
* We treat embedded NULLs in the list as bytes belonging to a list
|
|
Packit |
1c1d7e |
* element.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
limit = (list + listLength);
|
|
Packit |
1c1d7e |
while ((p < limit) && (isspace(UCHAR(*p))))
|
|
Packit |
1c1d7e |
{ /* INTL: ISO space. */
|
|
Packit |
1c1d7e |
p++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (p == limit)
|
|
Packit |
1c1d7e |
{ /* no element found */
|
|
Packit |
1c1d7e |
elemStart = limit;
|
|
Packit |
1c1d7e |
goto done;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (*p == '{') /* } to keep vi happy */
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
openBraces = 1;
|
|
Packit |
1c1d7e |
p++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (*p == '"')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
inQuotes = 1;
|
|
Packit |
1c1d7e |
p++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
elemStart = p;
|
|
Packit |
1c1d7e |
if (bracePtr != 0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
*bracePtr = openBraces;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
* Find element's end (a space, close brace, or the end of the string).
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
while (p < limit)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
switch (*p)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
* Open brace: don't treat specially unless the element is in
|
|
Packit |
1c1d7e |
* braces. In this case, keep a nesting count.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
case '{':
|
|
Packit |
1c1d7e |
if (openBraces != 0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
openBraces++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
* Close brace: if element is in braces, keep nesting count and
|
|
Packit |
1c1d7e |
* quit when the last close brace is seen.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
case '}':
|
|
Packit |
1c1d7e |
if (openBraces > 1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
openBraces--;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (openBraces == 1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
size = (int)(p - elemStart);
|
|
Packit |
1c1d7e |
p++;
|
|
Packit |
1c1d7e |
if ((p >= limit) || isspace(UCHAR(*p)))
|
|
Packit |
1c1d7e |
{ /* INTL: ISO space. */
|
|
Packit |
1c1d7e |
goto done;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
* Garbage after the closing brace; return an error.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
return TCL_ERROR;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
* Backslash: skip over everything up to the end of the backslash
|
|
Packit |
1c1d7e |
* sequence.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
case '\\':
|
|
Packit |
1c1d7e |
//RZ Tcl_UtfBackslash(p, &numChars, NULL);
|
|
Packit |
1c1d7e |
//RZ p += (numChars - 1);
|
|
Packit |
1c1d7e |
p++; //RZ
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
* Space: ignore if element is in braces or quotes; otherwise
|
|
Packit |
1c1d7e |
* terminate element.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
case ' ':
|
|
Packit |
1c1d7e |
case '\f':
|
|
Packit |
1c1d7e |
case '\n':
|
|
Packit |
1c1d7e |
case '\r':
|
|
Packit |
1c1d7e |
case '\t':
|
|
Packit |
1c1d7e |
case '\v':
|
|
Packit |
1c1d7e |
if ((openBraces == 0) && !inQuotes)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
size = (int)(p - elemStart);
|
|
Packit |
1c1d7e |
goto done;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
* Double-quote: if element is in quotes then terminate it.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
case '"':
|
|
Packit |
1c1d7e |
if (inQuotes)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
size = (int)(p - elemStart);
|
|
Packit |
1c1d7e |
p++;
|
|
Packit |
1c1d7e |
if ((p >= limit) || isspace(UCHAR(*p)))
|
|
Packit |
1c1d7e |
{ /* INTL: ISO space */
|
|
Packit |
1c1d7e |
goto done;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
* Garbage after the closing quote; return an error.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
return TCL_ERROR;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
p++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
* End of list: terminate element.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (p == limit)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (openBraces != 0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return TCL_ERROR;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (inQuotes)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return TCL_ERROR;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
size = (int)(p - elemStart);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
done:
|
|
Packit |
1c1d7e |
while ((p < limit) && (isspace(UCHAR(*p))))
|
|
Packit |
1c1d7e |
{ /* INTL: ISO space. */
|
|
Packit |
1c1d7e |
p++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
*elementPtr = elemStart;
|
|
Packit |
1c1d7e |
*nextPtr = p;
|
|
Packit |
1c1d7e |
if (sizePtr != 0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
*sizePtr = size;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return TCL_OK;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int Tcl_SplitList(
|
|
Packit |
1c1d7e |
CONST char *list, /* Pointer to string with list structure. */
|
|
Packit |
1c1d7e |
int *argcPtr, /* Pointer to location to fill in with the
|
|
Packit |
1c1d7e |
* number of elements in the list. */
|
|
Packit |
1c1d7e |
CONST char ***argvPtr) /* Pointer to place to store pointer to array
|
|
Packit |
1c1d7e |
* of pointers to list elements. */
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
CONST char **argv, *l, *element;
|
|
Packit |
1c1d7e |
char *p;
|
|
Packit |
1c1d7e |
int length, size, i, result, elSize, brace;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
* Figure out how much space to allocate. There must be enough space for
|
|
Packit |
1c1d7e |
* both the array of pointers and also for a copy of the list. To estimate
|
|
Packit |
1c1d7e |
* the number of pointers needed, count the number of space characters in
|
|
Packit |
1c1d7e |
* the list.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
for (size = 2, l = list; *l != 0; l++)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (isspace(UCHAR(*l)))
|
|
Packit |
1c1d7e |
{ /* INTL: ISO space. */
|
|
Packit |
1c1d7e |
size++;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
* Consecutive space can only count as a single list delimiter.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
while (1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
char next = *(l + 1);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (next == '\0')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
++l;
|
|
Packit |
1c1d7e |
if (isspace(UCHAR(next)))
|
|
Packit |
1c1d7e |
{ /* INTL: ISO space. */
|
|
Packit |
1c1d7e |
continue;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
length = (int)(l - list);
|
|
Packit |
1c1d7e |
argv = (CONST char **) ckalloc((unsigned)
|
|
Packit |
1c1d7e |
((size * sizeof(char *)) + length + 1));
|
|
Packit |
1c1d7e |
for (i = 0, p = ((char *) argv) + size*sizeof(char *);
|
|
Packit |
1c1d7e |
*list != 0; i++)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
CONST char *prevList = list;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
result = TclFindElement(list, length, &element, &list,
|
|
Packit |
1c1d7e |
&elSize, &brace);
|
|
Packit |
1c1d7e |
length -= (int)(list - prevList);
|
|
Packit |
1c1d7e |
if (result != TCL_OK)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ckfree((char *) argv);
|
|
Packit |
1c1d7e |
return result;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (*element == 0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (i >= size)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ckfree((char *) argv);
|
|
Packit |
1c1d7e |
return TCL_ERROR;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
argv[i] = p;
|
|
Packit |
1c1d7e |
if (brace)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
memcpy(p, element, (size_t) elSize);
|
|
Packit |
1c1d7e |
p += elSize;
|
|
Packit |
1c1d7e |
*p = 0;
|
|
Packit |
1c1d7e |
p++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
TclCopyAndCollapse(elSize, element, p);
|
|
Packit |
1c1d7e |
p += elSize+1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
argv[i] = NULL;
|
|
Packit |
1c1d7e |
*argvPtr = argv;
|
|
Packit |
1c1d7e |
*argcPtr = i;
|
|
Packit |
1c1d7e |
return TCL_OK;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// END of tclUtil.c
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void tcl_split_list(QString &str, QStringList &list)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int argc;
|
|
Packit |
1c1d7e |
const char **argv;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
list.clear();
|
|
Packit |
1c1d7e |
if (str.left(1)=="{" && str.right(1)=="}")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
str=str.mid(1,str.length()-2);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (str.left(1)=="\"" && str.right(1)=="\"")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
str=str.mid(1,str.length()-2);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (Tcl_SplitList(str.ascii(),&argc,&argv) != TCL_OK)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
list.append(str);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
for (int i = 0; i < argc; i++)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
list.append(argv[i]);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ckfree((char *) argv);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Structure containing information about current scan context.
|
|
Packit |
1c1d7e |
typedef struct
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
char type[2]; // type of scan context: "\"" "{" "[" "?" " "
|
|
Packit |
1c1d7e |
int line0; // start line of scan context
|
|
Packit |
1c1d7e |
int line1; // end line of scan context
|
|
Packit |
1c1d7e |
YY_BUFFER_STATE buffer_state; // value of scan context
|
|
Packit |
1c1d7e |
QCString ns; // current namespace
|
|
Packit |
1c1d7e |
Entry *entry_fn; // if set contains the current proc/method/constructor/destructor
|
|
Packit |
1c1d7e |
Entry *entry_cl; // if set contain the current class
|
|
Packit |
1c1d7e |
Entry *entry_scan; // current scan entry
|
|
Packit |
1c1d7e |
Protection protection; // current protections state
|
|
Packit |
1c1d7e |
QStringList after; // option/value list (options: NULL comment keyword script)
|
|
Packit |
1c1d7e |
} tcl_scan;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//* Structure containing all internal global variables.
|
|
Packit |
1c1d7e |
static struct
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
CodeOutputInterface * code; // if set then we are codifying the file
|
|
Packit |
1c1d7e |
int code_line; // current line of code
|
|
Packit |
1c1d7e |
int code_linenumbers; // if true create line numbers in code
|
|
Packit |
1c1d7e |
const char *code_font; // used font to codify
|
|
Packit |
1c1d7e |
bool config_autobrief; // value of configuration option
|
|
Packit |
1c1d7e |
QMap<QString,QString> config_subst; // map of configuration option values
|
|
Packit |
1c1d7e |
QCString input_string; // file contents
|
|
Packit |
1c1d7e |
int input_position; // position in file
|
|
Packit |
1c1d7e |
QCString file_name; // name of used file
|
|
Packit |
1c1d7e |
ParserInterface *this_parser; // myself
|
|
Packit |
1c1d7e |
int command; // true if command was found
|
|
Packit |
1c1d7e |
int comment; // set true if comment was scanned
|
|
Packit |
1c1d7e |
int brace_level; // bookkeeping of braces
|
|
Packit |
1c1d7e |
int bracket_level; // bookkeeping of brackets
|
|
Packit |
1c1d7e |
int bracket_quote; // bookkeeping of quotes (toggles)
|
|
Packit |
1c1d7e |
char word_is; // type of current word: "\"" "{" "[" "?" " "
|
|
Packit |
1c1d7e |
int line_comment; // line number of comment
|
|
Packit |
1c1d7e |
int line_commentline; // line number of comment after command
|
|
Packit |
1c1d7e |
int line_command; // line number of command
|
|
Packit |
1c1d7e |
int line_body0; // start line of body
|
|
Packit |
1c1d7e |
int line_body1; // end line of body
|
|
Packit |
1c1d7e |
QCString string_command; // contain current command
|
|
Packit |
1c1d7e |
QCString string_commentline; // contain current comment after command
|
|
Packit |
1c1d7e |
QCString string_commentcodify; // current comment string used in codifying
|
|
Packit |
1c1d7e |
QCString string_comment; // contain current comment
|
|
Packit |
1c1d7e |
QCString string_last; // contain last read word or part of word
|
|
Packit |
1c1d7e |
QCString string; // temporary string value
|
|
Packit |
1c1d7e |
Entry* entry_main; // top level entry
|
|
Packit |
1c1d7e |
Entry* entry_file; // entry of current file
|
|
Packit |
1c1d7e |
Entry* entry_current; // currently used entry
|
|
Packit |
1c1d7e |
Entry* entry_inside; // contain entry of current scan context
|
|
Packit |
1c1d7e |
QStringList list_commandwords; // list of command words
|
|
Packit |
1c1d7e |
QList<tcl_scan> scan; // stack of scan contexts
|
|
Packit |
1c1d7e |
QAsciiDict<Entry> ns; // all read namespace entries
|
|
Packit |
1c1d7e |
QAsciiDict<Entry> cl; // all read class entries
|
|
Packit |
1c1d7e |
QAsciiDict<Entry> fn; // all read function entries
|
|
Packit |
1c1d7e |
QList<Entry> entry; // list of all created entries, will be deleted after codifying
|
|
Packit |
1c1d7e |
Protection protection; // current protections state
|
|
Packit |
1c1d7e |
MemberDef *memberdef; // contain current MemberDef when codifying
|
|
Packit |
1c1d7e |
bool collectXRefs;
|
|
Packit |
1c1d7e |
} tcl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// scanner functions
|
|
Packit |
1c1d7e |
static int yyread(char *buf,int max_size);
|
|
Packit |
1c1d7e |
static tcl_scan *tcl_scan_start(char type, QString content, QCString ns, Entry *entry_cls, Entry *entry_fn);
|
|
Packit |
1c1d7e |
static void tcl_scan_end();
|
|
Packit |
1c1d7e |
static void tcl_comment(int what,const char *text);
|
|
Packit |
1c1d7e |
static void tcl_word(int what,const char *text);
|
|
Packit |
1c1d7e |
static void tcl_command(int what,const char *text);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// helper functions
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Create new entry.
|
|
Packit |
1c1d7e |
// @return new initialised entry
|
|
Packit |
1c1d7e |
Entry* tcl_entry_new()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Entry *myEntry = new Entry;
|
|
Packit |
1c1d7e |
myEntry->section = Entry::EMPTY_SEC;
|
|
Packit |
1c1d7e |
myEntry->name = "";
|
|
Packit |
1c1d7e |
// myEntry->type = "";
|
|
Packit |
1c1d7e |
myEntry->brief = "";
|
|
Packit |
1c1d7e |
// myEntry->doc = "";
|
|
Packit |
1c1d7e |
myEntry->protection = Public;
|
|
Packit |
1c1d7e |
// myEntry->mtype = Method;
|
|
Packit |
1c1d7e |
// myEntry->virt = Normal;
|
|
Packit |
1c1d7e |
// myEntry->stat = FALSE;
|
|
Packit |
1c1d7e |
myEntry->fileName = tcl.file_name;
|
|
Packit |
1c1d7e |
myEntry->lang = SrcLangExt_Tcl;
|
|
Packit |
1c1d7e |
initGroupInfo(myEntry);
|
|
Packit |
1c1d7e |
// collect entries
|
|
Packit |
1c1d7e |
if (!tcl.code)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.entry.insert(0,myEntry);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return myEntry;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Set protection level.
|
|
Packit |
1c1d7e |
void tcl_protection(Entry *entry)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (entry->protection!=Public&&entry->protection!=Protected&&entry->protection!=Private)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
entry->protection = tcl.protection;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (entry->protection!=Protected&&entry->protection!=Private)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
entry->protection = Public;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Check name.
|
|
Packit |
1c1d7e |
// @return 'ns' and 'name' of given current 'ns0' and 'name0'
|
|
Packit |
1c1d7e |
static void tcl_name(const QCString &ns0, const QCString &name0, QCString &ns, QCString &name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString myNm;
|
|
Packit |
1c1d7e |
int myStart;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (qstrncmp(name0.data(),"::",2)==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myNm = name0.mid(2);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (ns0.length() && ns0 != " ")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myNm = ns0 + "::" + name0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myNm = name0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
myStart = myNm.findRev("::");
|
|
Packit |
1c1d7e |
if (myStart == -1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ns = "";
|
|
Packit |
1c1d7e |
name = myNm;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ns = myNm.mid(0,myStart);
|
|
Packit |
1c1d7e |
name = myNm.mid(myStart+2);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Check name. Strip namespace qualifiers from name0 if inside inlined code segment.
|
|
Packit |
1c1d7e |
// @return 'ns' and 'name' of given current 'ns0' and 'name0'
|
|
Packit |
1c1d7e |
static void tcl_name_SnippetAware(const QCString &ns0, const QCString &name0, QCString &ns, QCString &name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// If we are inside an inlined code snippet then ns0
|
|
Packit |
1c1d7e |
// already contains the complete namespace path.
|
|
Packit |
1c1d7e |
// Any namespace qualifiers in name0 are redundant.
|
|
Packit |
1c1d7e |
int i = name0.findRev("::");
|
|
Packit |
1c1d7e |
if (i>=0 && tcl.memberdef)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_name(ns0, name0.mid(i+2), ns, name);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_name(ns0, name0, ns, name);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// Check and return namespace entry.
|
|
Packit |
1c1d7e |
// @return namespace entry
|
|
Packit |
1c1d7e |
Entry* tcl_entry_namespace(const QCString ns)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Entry *myEntry;
|
|
Packit |
1c1d7e |
if (ns.length())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myEntry = tcl.ns.find(ns);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myEntry = tcl.ns.find("::");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myEntry == NULL)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myEntry = tcl_entry_new();
|
|
Packit |
1c1d7e |
myEntry->section = Entry::NAMESPACE_SEC;
|
|
Packit |
1c1d7e |
myEntry->name = ns;
|
|
Packit |
1c1d7e |
tcl.entry_main->addSubEntry(myEntry);
|
|
Packit |
1c1d7e |
tcl.ns.insert(ns,myEntry);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return myEntry;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// Check and return class entry.
|
|
Packit |
1c1d7e |
// @return class entry
|
|
Packit |
1c1d7e |
Entry* tcl_entry_class(const QCString cl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Entry *myEntry;
|
|
Packit |
1c1d7e |
if (!cl.length()) return(NULL);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
myEntry = tcl.cl.find(cl);
|
|
Packit |
1c1d7e |
if (myEntry == NULL)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myEntry = tcl_entry_new();
|
|
Packit |
1c1d7e |
myEntry->section = Entry::CLASS_SEC;
|
|
Packit |
1c1d7e |
myEntry->name = cl;
|
|
Packit |
1c1d7e |
tcl.entry_main->addSubEntry(myEntry);
|
|
Packit |
1c1d7e |
tcl.cl.insert(cl,myEntry);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return myEntry;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Check for keywords.
|
|
Packit |
1c1d7e |
// @return 1 if keyword and 0 otherwise
|
|
Packit |
1c1d7e |
static int tcl_keyword(QCString str)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static QStringList myList;
|
|
Packit |
1c1d7e |
static int myInit=1;
|
|
Packit |
1c1d7e |
if (myInit)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// tcl keywords
|
|
Packit |
1c1d7e |
myList <<"append"<<"apply"<<"array"<<"auto_execok"<<"auto_import"<<"auto_load"<<"auto_mkindex"<<"auto_qualify"<<"auto_reset";
|
|
Packit |
1c1d7e |
myList <<"binary";
|
|
Packit |
1c1d7e |
myList <<"catch"<<"cd"<<"close"<<"clock"<<"concat";
|
|
Packit |
1c1d7e |
myList <<"eof"<<"eval"<<"exec"<<"exit"<<"expr";
|
|
Packit |
1c1d7e |
myList <<"fblocked"<<"fconfigure"<<"file"<<"fileevent"<<"flush"<<"for"<<"foreach"<<"format";
|
|
Packit |
1c1d7e |
myList <<"gets"<<"global";
|
|
Packit |
1c1d7e |
myList <<"http";
|
|
Packit |
1c1d7e |
myList <<"if"<<"incr"<<"info"<<"interp";
|
|
Packit |
1c1d7e |
myList <<"join";
|
|
Packit |
1c1d7e |
myList <<"lappend"<<"lassign"<<"lindex"<<"linsert"<<"llength"<<"load"<<"lrange"<<"lrepeat"<<"lreplace"<<"lreverse"<<"lset";
|
|
Packit |
1c1d7e |
myList <<"namespace";
|
|
Packit |
1c1d7e |
myList <<"package"<<"parray"<<"pid"<<"pkg_mkIndex"<<"proc"<<"puts"<<"pwd";
|
|
Packit |
1c1d7e |
myList <<"registry"<<"rename"<<"return";
|
|
Packit |
1c1d7e |
myList <<"scan"<<"set"<<"split"<<"string"<<"switch";
|
|
Packit |
1c1d7e |
myList <<"tclLog"<<"tcl_endOfWord"<<"tcl_findLibrary"<<"tcl_startOfNextWord"<<"tcl_startOfPreviousWord"<<"tcl_wordBreakAfter"<<"tcl_wordBreakBefore"<<"tell"<<"time";
|
|
Packit |
1c1d7e |
myList <<"unknown"<<"upvar";
|
|
Packit |
1c1d7e |
myList <<"variable"<<"vwait";
|
|
Packit |
1c1d7e |
// tk keywords
|
|
Packit |
1c1d7e |
myList <<"bell"<<"bind"<<"bindtags";
|
|
Packit |
1c1d7e |
myList <<"clipboard"<<"console"<<"consoleinterp";
|
|
Packit |
1c1d7e |
myList <<"destroy";
|
|
Packit |
1c1d7e |
myList <<"event";
|
|
Packit |
1c1d7e |
myList <<"focus";
|
|
Packit |
1c1d7e |
myList <<"grid";
|
|
Packit |
1c1d7e |
myList <<"lower";
|
|
Packit |
1c1d7e |
myList <<"option";
|
|
Packit |
1c1d7e |
myList <<"pack"<<"place";
|
|
Packit |
1c1d7e |
myList <<"raise";
|
|
Packit |
1c1d7e |
myList <<"send";
|
|
Packit |
1c1d7e |
myList <<"tkerror"<<"tkwait"<<"tk_bisque"<<"tk_focusNext"<<"tk_focusPrev"<<"tk_focusFollowsMouse"<<"tk_popup"<<"tk_setPalette"<<"tk_textCut"<<"tk_TextCopy"<<"tk_textPaste"<<"chooseColor"<<"tk_chooseColor"<<"tk_chooseDirectory"<<"tk_dialog"<<"tk_getOpenFile"<<"tkDialog"<<"tk_getSaveFile"<<"tk_messageBox";
|
|
Packit |
1c1d7e |
myList <<"winfo"<<"wm";
|
|
Packit |
1c1d7e |
myList <<"button"<<"canvas"<<"checkbutton"<<"entry"<<"frame"<<"image"<<"label"<<"labelframe"<<"listbox"<<"menu"<<"menubutton"<<"message"<<"panedwindow"<<"radiobutton"<<"scale"<<"scrollbar"<<"spinbox"<<"toplevel";
|
|
Packit |
1c1d7e |
myList.sort();
|
|
Packit |
1c1d7e |
myInit=0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
str=str.stripWhiteSpace();
|
|
Packit |
1c1d7e |
if (str.left(2)=="::") {str=str.mid(2);}
|
|
Packit |
1c1d7e |
if (myList.findIndex(str) != -1) return(1);
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! End codifying with special font class.
|
|
Packit |
1c1d7e |
static void tcl_font_end()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!tcl.code) return;
|
|
Packit |
1c1d7e |
if (tcl.code_font)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.code->endFontClass();
|
|
Packit |
1c1d7e |
tcl.code_font=NULL;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Codify 'str' with special font class 's'.
|
|
Packit |
1c1d7e |
static void tcl_codify(const char *s,const char *str)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!tcl.code || !str) return;
|
|
Packit |
1c1d7e |
if (s && qstrcmp(s,"NULL")!=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_font_end();
|
|
Packit |
1c1d7e |
tcl.code->startFontClass(s);
|
|
Packit |
1c1d7e |
tcl.code_font=s;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
char *tmp = (char *) malloc(strlen(str)+1);
|
|
Packit |
1c1d7e |
strcpy(tmp, str);
|
|
Packit |
1c1d7e |
char *p=tmp,*sp=p;
|
|
Packit |
1c1d7e |
char c;
|
|
Packit |
1c1d7e |
bool done=FALSE;
|
|
Packit |
1c1d7e |
while (!done)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
sp=p;
|
|
Packit |
1c1d7e |
while ((c=*p++) && c!='\n') {}
|
|
Packit |
1c1d7e |
if (c=='\n')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.code_line++;
|
|
Packit |
1c1d7e |
*(p-1)='\0'; // Dimitri: is this really needed?
|
|
Packit |
1c1d7e |
// wtschueller: As far as I can see: yes.
|
|
Packit |
1c1d7e |
// Deletes that \n that would produce ugly source listings otherwise.
|
|
Packit |
1c1d7e |
// However, there may exist more sophisticated solutions.
|
|
Packit |
1c1d7e |
tcl.code->codify(sp);
|
|
Packit |
1c1d7e |
if (tcl.code_font)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.code->endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl.code->endCodeLine();
|
|
Packit |
1c1d7e |
tcl.code->startCodeLine(tcl.code_linenumbers);
|
|
Packit |
1c1d7e |
if (tcl.code_linenumbers)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.code->writeLineNumber(0,0,0,tcl.code_line);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (tcl.code_font)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.code->startFontClass(tcl.code_font);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.code->codify(sp);
|
|
Packit |
1c1d7e |
done=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
free(tmp);
|
|
Packit |
1c1d7e |
tcl_font_end();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#if 0
|
|
Packit |
1c1d7e |
//! Codify 'str' with special font class 's'.
|
|
Packit |
1c1d7e |
static void tcl_codify(const char *s,const char *str)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.code==NULL) return;
|
|
Packit |
1c1d7e |
char *tmp= (char *) malloc(strlen(str)+1);
|
|
Packit |
1c1d7e |
strcpy(tmp, str);
|
|
Packit |
1c1d7e |
tcl_codify(s,tmp);
|
|
Packit |
1c1d7e |
free(tmp);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Codify 'str' with special font class 's'.
|
|
Packit |
1c1d7e |
static void tcl_codify(const char *s,const QString &str)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.code==NULL) return;
|
|
Packit |
1c1d7e |
tcl_codify(s,str.utf8());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Codify 'str' with special font class 's'.
|
|
Packit |
1c1d7e |
static void tcl_codify(const char *s,const QCString &str)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!tcl.code) return;
|
|
Packit |
1c1d7e |
tcl_codify(s,str.data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void tcl_codify_cmd(const char *s,int i)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_codify(s,(*tcl.list_commandwords.at(i)).utf8());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//! codify a string token
|
|
Packit |
1c1d7e |
//
|
|
Packit |
1c1d7e |
// codifies string according to type.
|
|
Packit |
1c1d7e |
// Starts a new scan context if needed (*myScan==0 and type == "script").
|
|
Packit |
1c1d7e |
// Returns NULL or the created scan context.
|
|
Packit |
1c1d7e |
//
|
|
Packit |
1c1d7e |
static tcl_scan *tcl_codify_token(tcl_scan *myScan, const QCString type, const QCString string)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (myScan != NULL)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (type != NULL)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan->after << type << string;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan->after << "NULL" << string;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (qstrcmp(type, "script") == 0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan = tcl.scan.at(0);
|
|
Packit |
1c1d7e |
myScan = tcl_scan_start('?', string,
|
|
Packit |
1c1d7e |
myScan->ns, myScan->entry_cl, myScan->entry_fn);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_codify((const char*)type, string);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return myScan;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//-----------------------------------------------------------------------------
|
|
Packit |
1c1d7e |
#undef YY_INPUT
|
|
Packit |
1c1d7e |
#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
|
|
Packit |
1c1d7e |
//-----------------------------------------------------------------------------
|
|
Packit |
1c1d7e |
%}
|
|
Packit |
1c1d7e |
ws ([ \t]|\\\n)
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
%option yylineno
|
|
Packit |
1c1d7e |
%option noyywrap
|
|
Packit |
1c1d7e |
%option stack
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
%x ERROR
|
|
Packit |
1c1d7e |
%x TOP
|
|
Packit |
1c1d7e |
%x COMMAND
|
|
Packit |
1c1d7e |
%x WORD
|
|
Packit |
1c1d7e |
%x COMMENT
|
|
Packit |
1c1d7e |
%x COMMENT_NL
|
|
Packit |
1c1d7e |
%x COMMENT_CODE
|
|
Packit |
1c1d7e |
%x COMMENT_VERB
|
|
Packit |
1c1d7e |
%x COMMENTLINE
|
|
Packit |
1c1d7e |
%x COMMENTLINE_NL
|
|
Packit |
1c1d7e |
%%
|
|
Packit |
1c1d7e |
<ERROR>. {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
yyterminate();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<<EOF>> {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
if (tcl.scan.count()<1)
|
|
Packit |
1c1d7e |
{// error
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl_err("Tcl parser stack empty! Parser error in file '%s'.\n",tcl.file_name.data());
|
|
Packit |
1c1d7e |
yyterminate();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (tcl.scan.count()==1)
|
|
Packit |
1c1d7e |
{// exit, check on input?
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
yyterminate();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{// continue
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl_command(-1,"");
|
|
Packit |
1c1d7e |
tcl_scan_end();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<TOP>"#" {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
yyless(0);
|
|
Packit |
1c1d7e |
tcl.line_comment=yylineno;
|
|
Packit |
1c1d7e |
tcl_comment(0,"");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<TOP>({ws}|[\;\n])+ {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl_codify(NULL,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<TOP>. {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
yyless(0);
|
|
Packit |
1c1d7e |
tcl.line_command=yylineno;
|
|
Packit |
1c1d7e |
tcl_command(0,"");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
<COMMENT>[ \t]* {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl_codify("comment",yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENT>"###".*\n {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl_codify("comment",yytext);
|
|
Packit |
1c1d7e |
tcl_comment(2,yytext+1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENT>"##".*\\\n {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl_codify("comment",yytext);
|
|
Packit |
1c1d7e |
QCString t=yytext;
|
|
Packit |
1c1d7e |
t = t.mid(2,t.length()-3);
|
|
Packit |
1c1d7e |
t.append("\n");
|
|
Packit |
1c1d7e |
tcl_comment(1,t.data());
|
|
Packit |
1c1d7e |
yy_push_state(COMMENT_NL);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENT>"##".*\n {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl_codify("comment",yytext);
|
|
Packit |
1c1d7e |
tcl_comment(1,yytext+2);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENT>"#"[@\\]"code"\n[ \t]*[^#] {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
QCString t=yytext;
|
|
Packit |
1c1d7e |
tcl_codify("comment",t.left(7));
|
|
Packit |
1c1d7e |
tcl_comment(2,"\n@code\n");
|
|
Packit |
1c1d7e |
yyless(7);
|
|
Packit |
1c1d7e |
yy_push_state(COMMENT_CODE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENT>"#"[@\\]"verbatim"\n[ \t]*[^#] {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
QCString t=yytext;
|
|
Packit |
1c1d7e |
tcl_codify("comment",t.left(11));
|
|
Packit |
1c1d7e |
tcl_comment(2,"\n@verbatim\n");
|
|
Packit |
1c1d7e |
yyless(11);
|
|
Packit |
1c1d7e |
yy_push_state(COMMENT_VERB);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENT>"#".*\\\n {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl_codify("comment",yytext);
|
|
Packit |
1c1d7e |
QCString t=yytext;
|
|
Packit |
1c1d7e |
t = t.mid(1,t.length()-3);
|
|
Packit |
1c1d7e |
t.append("\n");
|
|
Packit |
1c1d7e |
tcl_comment(2,t.data());
|
|
Packit |
1c1d7e |
yy_push_state(COMMENT_NL);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENT>"#".*\n {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl_codify("comment",yytext);
|
|
Packit |
1c1d7e |
tcl_comment(2,yytext+1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENT>"#".*\x1A {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
QCString t=yytext;
|
|
Packit |
1c1d7e |
t = t.mid(0,t.length()-1);
|
|
Packit |
1c1d7e |
tcl_codify("comment",t.data());
|
|
Packit |
1c1d7e |
t = t.mid(1,t.length());
|
|
Packit |
1c1d7e |
tcl_comment(-2,t.data());
|
|
Packit |
1c1d7e |
unput(0x1A);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENT>\x1A {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl_comment(-2,"");
|
|
Packit |
1c1d7e |
unput(0x1A);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENT>.|\n {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl_comment(-2,yytext);
|
|
Packit |
1c1d7e |
yyless(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
<COMMENT_CODE>"#"[@\\]"endcode"\n {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
QCString t=yytext;
|
|
Packit |
1c1d7e |
t = t.left(t.length()-10);
|
|
Packit |
1c1d7e |
tcl_comment(2,t.data());
|
|
Packit |
1c1d7e |
tcl_comment(2,"\n@endcode\n");
|
|
Packit |
1c1d7e |
yy_pop_state();
|
|
Packit |
1c1d7e |
yyless(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENT_CODE>.*\n {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
yymore();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENT_CODE>.*\x1A {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
yy_pop_state();
|
|
Packit |
1c1d7e |
yyless(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
<COMMENT_VERB>"#"[@\\]"endverbatim"\n {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
QCString t=yytext;
|
|
Packit |
1c1d7e |
t = t.left(t.length()-14);
|
|
Packit |
1c1d7e |
tcl_comment(2,t.data());
|
|
Packit |
1c1d7e |
tcl_comment(2,"\n@endverbatim\n");
|
|
Packit |
1c1d7e |
yy_pop_state();
|
|
Packit |
1c1d7e |
yyless(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENT_VERB>.*\n {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
yymore();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENT_VERB>.*\x1A {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
yy_pop_state();
|
|
Packit |
1c1d7e |
yyless(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
<COMMENT_NL>.*\\\n {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl_codify("comment",yytext);
|
|
Packit |
1c1d7e |
tcl_comment(2,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENT_NL>.*\n {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl_codify("comment",yytext);
|
|
Packit |
1c1d7e |
tcl_comment(2,yytext);
|
|
Packit |
1c1d7e |
yy_pop_state();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENT_NL>.*\x1A {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
yy_pop_state();
|
|
Packit |
1c1d7e |
yyless(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
<COMMENTLINE>.*\x1A {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
yy_pop_state();
|
|
Packit |
1c1d7e |
yyless(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENTLINE>[ \t]* {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl.string_commentcodify += yytext;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENTLINE>"#<".*\\\n {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl.string_commentcodify += yytext;
|
|
Packit |
1c1d7e |
QCString t=yytext;
|
|
Packit |
1c1d7e |
t = t.mid(2,t.length()-4);
|
|
Packit |
1c1d7e |
t.append("\n");
|
|
Packit |
1c1d7e |
tcl.string_commentline += t;
|
|
Packit |
1c1d7e |
yy_push_state(COMMENTLINE_NL);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENTLINE>"#<".*\n {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl.string_commentcodify += yytext;
|
|
Packit |
1c1d7e |
tcl.string_commentline += (yytext+2);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENTLINE>.|\n {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
yy_pop_state();
|
|
Packit |
1c1d7e |
if (tcl.string_commentline.length())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.entry_current->brief = tcl.string_commentline;
|
|
Packit |
1c1d7e |
tcl.entry_current->briefLine = tcl.line_commentline;
|
|
Packit |
1c1d7e |
tcl.entry_current->briefFile = tcl.file_name;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
yyless(0);
|
|
Packit |
1c1d7e |
tcl_command(-1,tcl.string_commentcodify.data());
|
|
Packit |
1c1d7e |
tcl.string_commentline="";
|
|
Packit |
1c1d7e |
tcl.string_commentcodify="";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
<COMMENTLINE_NL>.*\\\n {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl.string_commentcodify += yytext;
|
|
Packit |
1c1d7e |
QCString t=yytext;
|
|
Packit |
1c1d7e |
t = t.left(t.length()-3);
|
|
Packit |
1c1d7e |
t.append("\n");
|
|
Packit |
1c1d7e |
tcl.string_commentline += t;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENTLINE_NL>.*\n {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl.string_commentcodify += yytext;
|
|
Packit |
1c1d7e |
tcl.string_commentline += yytext;
|
|
Packit |
1c1d7e |
yy_pop_state();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMENTLINE_NL>.*\x1A {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
QCString t=yytext;
|
|
Packit |
1c1d7e |
t = t.left(t.length()-1);
|
|
Packit |
1c1d7e |
tcl.string_commentcodify += t;
|
|
Packit |
1c1d7e |
tcl.string_commentline += t;
|
|
Packit |
1c1d7e |
yy_pop_state();
|
|
Packit |
1c1d7e |
unput(0x1A);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
<COMMAND>{ws}*[\;]{ws}*"#<" {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl.string_commentcodify = yytext;
|
|
Packit |
1c1d7e |
tcl.string_commentcodify = tcl.string_commentcodify.left(tcl.string_commentcodify.length()-2);
|
|
Packit |
1c1d7e |
tcl.string_commentline = "";
|
|
Packit |
1c1d7e |
tcl.line_commentline = yylineno;
|
|
Packit |
1c1d7e |
tcl.line_body1=yylineno;
|
|
Packit |
1c1d7e |
unput('<');
|
|
Packit |
1c1d7e |
unput('#');
|
|
Packit |
1c1d7e |
yy_push_state(COMMENTLINE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMAND>{ws}*\x1A {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl.string_commentcodify = "";
|
|
Packit |
1c1d7e |
tcl.string_commentline = "";
|
|
Packit |
1c1d7e |
tcl.line_body1=yylineno;
|
|
Packit |
1c1d7e |
tcl_command(-1,"");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMAND>{ws}*; {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl.string_commentcodify = "";
|
|
Packit |
1c1d7e |
tcl.string_commentline = "";
|
|
Packit |
1c1d7e |
tcl.line_body1=yylineno;
|
|
Packit |
1c1d7e |
tcl_command(-1,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMAND>{ws}*\n {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl.string_commentcodify = "";
|
|
Packit |
1c1d7e |
tcl.string_commentline = "";
|
|
Packit |
1c1d7e |
tcl.line_body1=yylineno-1;
|
|
Packit |
1c1d7e |
tcl_command(-1,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMAND>{ws}+ {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl_command(1,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMAND>"{*}". {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl.word_is = ' ';
|
|
Packit |
1c1d7e |
tcl.string_last = "{*}";
|
|
Packit |
1c1d7e |
tcl_word(0,&yytext[3]);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMAND>"\\"[\{\}\[\]\;\" \t] {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl.word_is=' ';
|
|
Packit |
1c1d7e |
tcl.string_last = "";
|
|
Packit |
1c1d7e |
tcl_word(0,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<COMMAND>. {
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl.word_is=' ';
|
|
Packit |
1c1d7e |
if (yytext[0]=='{'||yytext[0]=='['||yytext[0]=='"') tcl.word_is = yytext[0];
|
|
Packit |
1c1d7e |
tcl.string_last = "";
|
|
Packit |
1c1d7e |
tcl_word(0,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
<WORD>"\\\\" |
|
|
Packit |
1c1d7e |
<WORD>"\\"[\{\}\[\]\;\" \t] {
|
|
Packit |
1c1d7e |
tcl_word(1,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<WORD>"\\\n" {
|
|
Packit |
1c1d7e |
tcl_word(2,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<WORD>"{" {
|
|
Packit |
1c1d7e |
tcl_word(3,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<WORD>"}" {
|
|
Packit |
1c1d7e |
tcl_word(4,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<WORD>"[" {
|
|
Packit |
1c1d7e |
tcl_word(5,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<WORD>"]" {
|
|
Packit |
1c1d7e |
tcl_word(6,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<WORD>"\"" {
|
|
Packit |
1c1d7e |
tcl_word(7,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<WORD>" " {
|
|
Packit |
1c1d7e |
tcl_word(8,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<WORD>"\t" {
|
|
Packit |
1c1d7e |
tcl_word(9,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<WORD>";" {
|
|
Packit |
1c1d7e |
tcl_word(10,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<WORD>"\n" {
|
|
Packit |
1c1d7e |
tcl_word(11,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<WORD>\x1A {
|
|
Packit |
1c1d7e |
tcl_word(12,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<WORD>. {
|
|
Packit |
1c1d7e |
tcl_word(1,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
%%
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Start new scan context for given 'content'.
|
|
Packit |
1c1d7e |
// @return created new scan context.
|
|
Packit |
1c1d7e |
static tcl_scan *tcl_scan_start(char type, QString content, QCString ns, Entry *entry_cl, Entry *entry_fn)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_scan *myScan=tcl.scan.at(0);
|
|
Packit |
1c1d7e |
tcl_inf("line=%d type=%d '%s'\n",tcl.line_body0,type,content.ascii());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
myScan->line1=yylineno;
|
|
Packit |
1c1d7e |
yy_push_state(TOP);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
myScan=new tcl_scan;
|
|
Packit |
1c1d7e |
myScan->type[0] =' ';
|
|
Packit |
1c1d7e |
myScan->type[1] = '\0';
|
|
Packit |
1c1d7e |
switch (type) {
|
|
Packit |
1c1d7e |
case '"':
|
|
Packit |
1c1d7e |
case '{':
|
|
Packit |
1c1d7e |
case '[':
|
|
Packit |
1c1d7e |
myScan->type[0] = type;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case '?':
|
|
Packit |
1c1d7e |
if (content[0]=='"' && content[content.length()-1]=='"') myScan->type[0]='"';
|
|
Packit |
1c1d7e |
if (content[0]=='{' && content[content.length()-1]=='}') myScan->type[0]='{';
|
|
Packit |
1c1d7e |
if (content[0]=='[' && content[content.length()-1]==']') myScan->type[0]='[';
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myScan->type[0]!=' ')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_codify(NULL,&myScan->type[0]);
|
|
Packit |
1c1d7e |
content = content.mid(1,content.length()-2);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
content += (char)0x1A;// for detection end of scan context
|
|
Packit |
1c1d7e |
myScan->ns = ns;
|
|
Packit |
1c1d7e |
myScan->entry_cl = entry_cl;
|
|
Packit |
1c1d7e |
myScan->entry_fn = entry_fn;
|
|
Packit |
1c1d7e |
myScan->entry_scan = tcl.entry_current;
|
|
Packit |
1c1d7e |
myScan->buffer_state=yy_scan_string(content.ascii());
|
|
Packit |
1c1d7e |
myScan->line0=tcl.line_body0;
|
|
Packit |
1c1d7e |
myScan->line1=tcl.line_body1;
|
|
Packit |
1c1d7e |
myScan->after.clear();
|
|
Packit |
1c1d7e |
yylineno=myScan->line0;
|
|
Packit |
1c1d7e |
myScan->protection = tcl.protection;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
tcl.entry_inside = myScan->entry_scan;
|
|
Packit |
1c1d7e |
tcl.entry_current = tcl_entry_new();
|
|
Packit |
1c1d7e |
tcl.scan.insert(0,myScan);
|
|
Packit |
1c1d7e |
yy_switch_to_buffer(myScan->buffer_state);
|
|
Packit |
1c1d7e |
return (myScan);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Close current scan context.
|
|
Packit |
1c1d7e |
static void tcl_scan_end()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_scan *myScan=tcl.scan.at(0);
|
|
Packit |
1c1d7e |
tcl_scan *myScan1=tcl.scan.at(1);
|
|
Packit |
1c1d7e |
tcl_inf("line=%d\n",myScan->line1);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (myScan->type[0]=='{') myScan->type[0]='}';
|
|
Packit |
1c1d7e |
if (myScan->type[0]=='[') myScan->type[0]=']';
|
|
Packit |
1c1d7e |
if (myScan->type[0]!=' ') tcl_codify(NULL,&myScan->type[0]);
|
|
Packit |
1c1d7e |
int myStart=-1;
|
|
Packit |
1c1d7e |
for (unsigned int i=0;i<myScan->after.count();i=i+2)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (myScan->after[i]=="script") {
|
|
Packit |
1c1d7e |
myStart=i;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl_codify(myScan->after[i].utf8(),myScan->after[i+1].utf8());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
yy_delete_buffer(myScan->buffer_state);
|
|
Packit |
1c1d7e |
yy_pop_state();
|
|
Packit |
1c1d7e |
tcl.entry_inside = myScan1->entry_scan;
|
|
Packit |
1c1d7e |
yy_switch_to_buffer(myScan1->buffer_state);
|
|
Packit |
1c1d7e |
yylineno=myScan1->line1;
|
|
Packit |
1c1d7e |
tcl.protection = myScan1->protection;
|
|
Packit |
1c1d7e |
if (myStart>=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan1 = tcl_scan_start('?', myScan->after[myStart+1], myScan->ns, myScan->entry_cl, myScan->entry_fn);
|
|
Packit |
1c1d7e |
for (unsigned int i=myStart+2;i<myScan->after.count();i++)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan1->after.append(myScan->after[i]);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl.scan.remove(1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.scan.removeFirst();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Handling of word parsing.
|
|
Packit |
1c1d7e |
static void tcl_word(int what,const char *text)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static char myList[1024]="";// nesting level list
|
|
Packit |
1c1d7e |
static int myLevel=0;// number of current nesting level
|
|
Packit |
1c1d7e |
static int myWhite=0;// set true when next char should be whitespace
|
|
Packit |
1c1d7e |
static char myWord;// internal state
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
switch (what)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case 0:// start
|
|
Packit |
1c1d7e |
yy_push_state(WORD);
|
|
Packit |
1c1d7e |
switch (text[0])
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case '{':
|
|
Packit |
1c1d7e |
case '[':
|
|
Packit |
1c1d7e |
case '"': myWord = text[0]; break;
|
|
Packit |
1c1d7e |
default: myWord = '.';
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
myList[0]=myWord;
|
|
Packit |
1c1d7e |
myLevel=1;
|
|
Packit |
1c1d7e |
myWhite=0;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case 1:// all other chars
|
|
Packit |
1c1d7e |
if (myWhite)
|
|
Packit |
1c1d7e |
{// {x}y "x"y
|
|
Packit |
1c1d7e |
tcl_err("expected word separator: %s\n",text);
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myLevel==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myWord='.';
|
|
Packit |
1c1d7e |
myList[0]=myWord;
|
|
Packit |
1c1d7e |
myLevel=1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case 2:// \\\n
|
|
Packit |
1c1d7e |
if (myLevel==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myWord=' ';
|
|
Packit |
1c1d7e |
yy_pop_state();
|
|
Packit |
1c1d7e |
yyless(0);
|
|
Packit |
1c1d7e |
tcl_inf("(\\\n) ?%s?\n",tcl.string_last.data());
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
switch (myList[myLevel-1])
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case '{':
|
|
Packit |
1c1d7e |
case '[':
|
|
Packit |
1c1d7e |
case '"':
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case '.':
|
|
Packit |
1c1d7e |
if (myLevel==1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myWord=' ';
|
|
Packit |
1c1d7e |
yy_pop_state();
|
|
Packit |
1c1d7e |
yyless(0);
|
|
Packit |
1c1d7e |
tcl_inf("(\\\n) ?%s?\n",tcl.string_last.data());
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
myWhite=0;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case 3:// {
|
|
Packit |
1c1d7e |
if (myWhite)
|
|
Packit |
1c1d7e |
{// {x}{ "x"{
|
|
Packit |
1c1d7e |
tcl_err("expected word separator: %s\n",text);
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
switch (myList[myLevel-1])
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case '{':
|
|
Packit |
1c1d7e |
case '[':
|
|
Packit |
1c1d7e |
myList[myLevel++]='{';
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case '"':
|
|
Packit |
1c1d7e |
case '.':
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
myWhite=0;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case 4:// }
|
|
Packit |
1c1d7e |
if (myWhite)
|
|
Packit |
1c1d7e |
{// {x}{ "x"{
|
|
Packit |
1c1d7e |
tcl_err("expected word separator: %s\n",text);
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
switch (myList[myLevel-1])
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case '{':// {{x}}
|
|
Packit |
1c1d7e |
myLevel--;
|
|
Packit |
1c1d7e |
if (myLevel==0 && !tcl.code)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myWhite=1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case '[':
|
|
Packit |
1c1d7e |
case '"':
|
|
Packit |
1c1d7e |
case '.':
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case 5:// [
|
|
Packit |
1c1d7e |
if (myWhite)
|
|
Packit |
1c1d7e |
{// {x}[
|
|
Packit |
1c1d7e |
tcl_err("expected word separator: %s\n",text);
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
switch (myList[myLevel-1])
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case '{':
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case '[':
|
|
Packit |
1c1d7e |
case '"':
|
|
Packit |
1c1d7e |
case '.':
|
|
Packit |
1c1d7e |
myList[myLevel++]='[';
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
myWhite=0;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case 6:// ]
|
|
Packit |
1c1d7e |
if (myWhite)
|
|
Packit |
1c1d7e |
{// {x}]
|
|
Packit |
1c1d7e |
tcl_err("expected word separator: %s\n",text);
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
switch (myList[myLevel-1])
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case '{':
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case '[':
|
|
Packit |
1c1d7e |
myLevel--;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case '"':
|
|
Packit |
1c1d7e |
case '.':
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
myWhite=0;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case 7:// "
|
|
Packit |
1c1d7e |
if (myWhite)
|
|
Packit |
1c1d7e |
{// {x}"
|
|
Packit |
1c1d7e |
tcl_err("expected word separator: %s\n",text);
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
switch (myList[myLevel-1])
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case '{':
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case '[':
|
|
Packit |
1c1d7e |
myList[myLevel++]='"';
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case '"':
|
|
Packit |
1c1d7e |
myLevel--;
|
|
Packit |
1c1d7e |
case '.':
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case 8:// ' '
|
|
Packit |
1c1d7e |
case 9:// \t
|
|
Packit |
1c1d7e |
case 10:// ;
|
|
Packit |
1c1d7e |
case 11:// \n
|
|
Packit |
1c1d7e |
if (myLevel==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myWord=' ';
|
|
Packit |
1c1d7e |
yy_pop_state();
|
|
Packit |
1c1d7e |
yyless(0);
|
|
Packit |
1c1d7e |
tcl_inf("(%d) ?%s?\n",what,tcl.string_last.data());
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
switch (myList[myLevel-1])
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case '{':
|
|
Packit |
1c1d7e |
case '[':
|
|
Packit |
1c1d7e |
case '"':
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case '.':
|
|
Packit |
1c1d7e |
if (myLevel==1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myWord=' ';
|
|
Packit |
1c1d7e |
yy_pop_state();
|
|
Packit |
1c1d7e |
yyless(0);
|
|
Packit |
1c1d7e |
tcl_inf("(.%d) ?%s?\n",what,tcl.string_last.data());
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myLevel--;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
myWhite=0;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case 12:// \x1A
|
|
Packit |
1c1d7e |
if (myLevel==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myWord=' ';
|
|
Packit |
1c1d7e |
yy_pop_state();
|
|
Packit |
1c1d7e |
yyless(0);
|
|
Packit |
1c1d7e |
tcl_inf("(%d) ?%s?\n",what,tcl.string_last.data());
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myLevel!=1 || myList[0] != '.')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_war("level=%d expected=%c\n",myLevel,myList[myLevel-1]);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
myWord=' ';
|
|
Packit |
1c1d7e |
yy_pop_state();
|
|
Packit |
1c1d7e |
yyless(0);
|
|
Packit |
1c1d7e |
tcl_inf("(.%d) ?%s?\n",what,tcl.string_last.data());
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
myWhite=0;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
default:
|
|
Packit |
1c1d7e |
tcl_err("wrong state: %d\n",what);
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl.string_last += text;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Handling of comment parsing.
|
|
Packit |
1c1d7e |
static void tcl_comment(int what,const char *text)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (what==0)
|
|
Packit |
1c1d7e |
{ // begin of comment
|
|
Packit |
1c1d7e |
if (tcl.comment)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_err("comment in comment\n");
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
yy_push_state(COMMENT);
|
|
Packit |
1c1d7e |
tcl_inf("<- %s\n",text);
|
|
Packit |
1c1d7e |
tcl.string_comment="";
|
|
Packit |
1c1d7e |
tcl.comment=0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (what==1)
|
|
Packit |
1c1d7e |
{ // start new comment
|
|
Packit |
1c1d7e |
if (tcl.comment)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_comment(99,""); // inbody
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl.string_comment=text;
|
|
Packit |
1c1d7e |
tcl.comment=1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (what==2)
|
|
Packit |
1c1d7e |
{ // add to comment
|
|
Packit |
1c1d7e |
if (tcl.comment)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.string_comment+=text;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (what==-1 || what == -2)
|
|
Packit |
1c1d7e |
{ // end of comment without/with command
|
|
Packit |
1c1d7e |
if (tcl.comment)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.string_last=tcl.string_comment;
|
|
Packit |
1c1d7e |
tcl_comment(100+what,"");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.string_last = "";
|
|
Packit |
1c1d7e |
tcl_inf("-> %s\n",(const char *)tcl.string_comment);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
yy_pop_state();
|
|
Packit |
1c1d7e |
tcl.string_comment="";
|
|
Packit |
1c1d7e |
tcl.comment=0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (what==98 || what==99)
|
|
Packit |
1c1d7e |
{ // 98=new 99=inbody
|
|
Packit |
1c1d7e |
if (tcl.this_parser && tcl.string_comment.length())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_inf("-> %s\n",(const char *)tcl.string_comment);
|
|
Packit |
1c1d7e |
int myPos=0;
|
|
Packit |
1c1d7e |
bool myNew=0;
|
|
Packit |
1c1d7e |
int myLine=tcl.line_comment;
|
|
Packit |
1c1d7e |
BufStr myI(1024);
|
|
Packit |
1c1d7e |
BufStr myO(1024);
|
|
Packit |
1c1d7e |
Protection myProt=tcl.protection;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// resolve ALIASES
|
|
Packit |
1c1d7e |
myI.addArray("/*!",3);
|
|
Packit |
1c1d7e |
myI.addArray(tcl.string_comment.data(),tcl.string_comment.length());
|
|
Packit |
1c1d7e |
myI.addArray("*/",2);
|
|
Packit |
1c1d7e |
convertCppComments(&myI,&myO,tcl.file_name);
|
|
Packit |
1c1d7e |
myO.dropFromStart(3);
|
|
Packit |
1c1d7e |
myO.shrink(myO.curPos()-2);
|
|
Packit |
1c1d7e |
myO.addChar('\0');
|
|
Packit |
1c1d7e |
QCString myDoc = myO.data();
|
|
Packit |
1c1d7e |
if (what==99)
|
|
Packit |
1c1d7e |
{ // inbody comment file or namespace or class or proc/method
|
|
Packit |
1c1d7e |
int myPos0;
|
|
Packit |
1c1d7e |
int myLine0;
|
|
Packit |
1c1d7e |
Entry myEntry0; // used to test parsing
|
|
Packit |
1c1d7e |
Entry *myEntry;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Entry *myEntry1=NULL;
|
|
Packit |
1c1d7e |
if (tcl.scan.at(0)->entry_fn)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myEntry1=tcl.scan.at(0)->entry_fn;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (tcl.scan.at(0)->entry_cl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myEntry1=tcl.scan.at(0)->entry_cl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
myPos0=myPos;
|
|
Packit |
1c1d7e |
myLine0=myLine;
|
|
Packit |
1c1d7e |
while (parseCommentBlock(tcl.this_parser, &myEntry0, myDoc, tcl.file_name,
|
|
Packit |
1c1d7e |
myLine, FALSE, tcl.config_autobrief, FALSE, myProt, myPos, myNew))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (myNew)
|
|
Packit |
1c1d7e |
{ // we need a new entry in this case
|
|
Packit |
1c1d7e |
myNew=0;
|
|
Packit |
1c1d7e |
myEntry = tcl_entry_new();
|
|
Packit |
1c1d7e |
parseCommentBlock(tcl.this_parser, myEntry, myDoc, tcl.file_name,
|
|
Packit |
1c1d7e |
myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
|
|
Packit |
1c1d7e |
tcl.entry_inside->addSubEntry(myEntry);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{ // we can add to current entry in this case
|
|
Packit |
1c1d7e |
if (!myEntry1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myEntry1=tcl_entry_namespace(tcl.scan.at(0)->ns);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
parseCommentBlock(tcl.this_parser, myEntry1, myDoc, tcl.file_name,
|
|
Packit |
1c1d7e |
myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
myPos0=myPos;
|
|
Packit |
1c1d7e |
myLine0=myLine;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myNew)
|
|
Packit |
1c1d7e |
{ // we need a new entry
|
|
Packit |
1c1d7e |
myNew=0;
|
|
Packit |
1c1d7e |
myEntry = tcl_entry_new();
|
|
Packit |
1c1d7e |
parseCommentBlock(tcl.this_parser, myEntry, myDoc, tcl.file_name,
|
|
Packit |
1c1d7e |
myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
|
|
Packit |
1c1d7e |
tcl.entry_inside->addSubEntry(myEntry);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{ // we can add to current entry
|
|
Packit |
1c1d7e |
if (!myEntry1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myEntry1=tcl_entry_namespace(tcl.scan.at(0)->ns);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
parseCommentBlock(tcl.this_parser, myEntry1, myDoc, tcl.file_name,
|
|
Packit |
1c1d7e |
myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{ // new entry
|
|
Packit |
1c1d7e |
tcl.entry_current = tcl_entry_new();
|
|
Packit |
1c1d7e |
while (parseCommentBlock(tcl.this_parser, tcl.entry_current, myDoc,
|
|
Packit |
1c1d7e |
tcl.file_name, myLine, FALSE, tcl.config_autobrief, FALSE,
|
|
Packit |
1c1d7e |
myProt, myPos, myNew))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (myNew)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.entry_inside->addSubEntry(tcl.entry_current);
|
|
Packit |
1c1d7e |
tcl.entry_current = tcl_entry_new();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.entry_current->section = tcl.entry_inside->section;
|
|
Packit |
1c1d7e |
tcl.entry_current->name = tcl.entry_inside->name;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myNew)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.entry_inside->addSubEntry(tcl.entry_current);
|
|
Packit |
1c1d7e |
tcl.entry_current = tcl_entry_new();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.entry_current->section = tcl.entry_inside->section;
|
|
Packit |
1c1d7e |
tcl.entry_current->name = tcl.entry_inside->name;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (tcl.protection != myProt)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.scan.at(0)->protection = tcl.protection = myProt;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_err("what %d\n",what);
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Parse given \c arglist .
|
|
Packit |
1c1d7e |
static void tcl_command_ARGLIST(QString &arglist)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
Argument *myArg;
|
|
Packit |
1c1d7e |
QStringList myArgs;
|
|
Packit |
1c1d7e |
QString myArglist="";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (!tcl.entry_current->argList)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.entry_current->argList=new ArgumentList;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl_split_list(arglist,myArgs);
|
|
Packit |
1c1d7e |
for (uint i=0;i
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QStringList myArgs1;
|
|
Packit |
1c1d7e |
myArg=new Argument;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
tcl_split_list(*myArgs.at(i),myArgs1);
|
|
Packit |
1c1d7e |
if (myArgs1.count()==2)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myArg->name= (*myArgs1.at(0)).utf8();
|
|
Packit |
1c1d7e |
myArg->defval= (*myArgs1.at(1)).utf8();
|
|
Packit |
1c1d7e |
if (myArg->defval.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myArg->defval = " ";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
myArglist += "?" + QCString(myArg->name) + "? ";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myArg->name= (*myArgs.at(i)).utf8();
|
|
Packit |
1c1d7e |
myArglist += QString(myArg->name) + " ";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl.entry_current->argList->append(myArg);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
arglist = myArglist;
|
|
Packit |
1c1d7e |
tcl.entry_current->args = arglist.utf8();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Create link.
|
|
Packit |
1c1d7e |
static void tcl_codify_link(QCString name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.code == NULL || name.isEmpty()) return;
|
|
Packit |
1c1d7e |
static int init=0;
|
|
Packit |
1c1d7e |
static QAsciiDict<MemberDef> fn;
|
|
Packit |
1c1d7e |
if (init==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
init=1;
|
|
Packit |
1c1d7e |
MemberNameSDict::Iterator mni(*Doxygen::memberNameSDict);
|
|
Packit |
1c1d7e |
MemberNameSDict::Iterator fni(*Doxygen::functionNameSDict);
|
|
Packit |
1c1d7e |
MemberName *mn=0;
|
|
Packit |
1c1d7e |
MemberDef *md;
|
|
Packit |
1c1d7e |
for (mni.toFirst();(mn=mni.current());++mni)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberNameIterator mi(*mn);
|
|
Packit |
1c1d7e |
for (mi.toFirst();(md=mi.current());++mi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
fn.insert(md->qualifiedName(),md);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
for (fni.toFirst();(mn=fni.current());++fni)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberNameIterator fi(*mn);
|
|
Packit |
1c1d7e |
for (fi.toFirst();(md=fi.current());++fi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
fn.insert(md->qualifiedName(),md);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
MemberDef *myDef;
|
|
Packit |
1c1d7e |
QCString myName=name;
|
|
Packit |
1c1d7e |
if (name.mid(0,2)=="::") // fully qualified global command
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myName = myName.mid(2);
|
|
Packit |
1c1d7e |
myDef = fn.find(myName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // not qualified name
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString myName1=myName;
|
|
Packit |
1c1d7e |
myDef = NULL;
|
|
Packit |
1c1d7e |
myName1 = tcl.scan.at(0)->ns;
|
|
Packit |
1c1d7e |
if (myName1 == " " || myName1 == "")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myName1 = myName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myName1 = myName1 + "::" + myName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
myDef = fn.find(myName1); // search namespace command
|
|
Packit |
1c1d7e |
if (myDef == NULL)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myDef = fn.find(myName); // search global command
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myDef != NULL) // documented command
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.code->writeCodeLink(myDef->getReference().data(),
|
|
Packit |
1c1d7e |
myDef->getOutputFileBase().data(),
|
|
Packit |
1c1d7e |
myDef->anchor().data(),
|
|
Packit |
1c1d7e |
name,
|
|
Packit |
1c1d7e |
myDef->qualifiedName().data());
|
|
Packit |
1c1d7e |
if (tcl.memberdef)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myDef->addSourceReferencedBy(tcl.memberdef);
|
|
Packit |
1c1d7e |
tcl.memberdef->addSourceReferences(myDef);
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
Entry* callerEntry;
|
|
Packit |
1c1d7e |
unsigned int i;
|
|
Packit |
1c1d7e |
// walk the stack of scan contexts and find the enclosing method or proc
|
|
Packit |
1c1d7e |
for (i=0;i
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
callerEntry=tcl.scan.at(i)->entry_scan;
|
|
Packit |
1c1d7e |
if (callerEntry->mtype==Method && !callerEntry->name.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (i
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// enclosing method found
|
|
Packit |
1c1d7e |
QCString callerName = callerEntry->name;
|
|
Packit |
1c1d7e |
if (callerName.mid(0,2)=="::") // fully qualified global command
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
callerName = callerName.mid(2);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!(tcl.scan.at(0)->ns.stripWhiteSpace().isEmpty()))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
callerName = tcl.scan.at(0)->ns + "::" + callerEntry->name;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
MemberDef *callerDef=NULL;
|
|
Packit |
1c1d7e |
callerDef = fn.find(callerName);
|
|
Packit |
1c1d7e |
if (callerDef!=NULL && myDef!= NULL && tcl.collectXRefs)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
addDocCrossReference(callerDef,myDef);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (tcl_keyword(myName)) // check keyword
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_codify("keyword",name);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_codify(NULL,name); // something else
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! scan general argument for brackets
|
|
Packit |
1c1d7e |
//
|
|
Packit |
1c1d7e |
// parses (*tcl.list_commandwords.at(i)).utf8() and checks for brackets.
|
|
Packit |
1c1d7e |
// Starts a new scan context if needed (*myScan==0 and brackets found).
|
|
Packit |
1c1d7e |
// Returns NULL or the created scan context.
|
|
Packit |
1c1d7e |
//
|
|
Packit |
1c1d7e |
static tcl_scan *tcl_command_ARG(tcl_scan *myScan, unsigned int i, bool ignoreOutermostBraces)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString myName;
|
|
Packit |
1c1d7e |
bool insideQuotes=false;
|
|
Packit |
1c1d7e |
unsigned int insideBrackets=0;
|
|
Packit |
1c1d7e |
unsigned int insideBraces=0;
|
|
Packit |
1c1d7e |
myName = (*tcl.list_commandwords.at(i)).utf8();
|
|
Packit |
1c1d7e |
if (i%2 != 0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// handle white space
|
|
Packit |
1c1d7e |
myScan = tcl_codify_token(myScan, "NULL", myName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString myStr = "";
|
|
Packit |
1c1d7e |
unsigned int j;
|
|
Packit |
1c1d7e |
for (j=0;j
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QChar c = myName[j];
|
|
Packit |
1c1d7e |
bool backslashed = false;
|
|
Packit |
1c1d7e |
if (j>0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
backslashed = myName[j-1]=='\\';
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// this is a state machine
|
|
Packit |
1c1d7e |
// input is c
|
|
Packit |
1c1d7e |
// internal state is myScan and insideXXX
|
|
Packit |
1c1d7e |
// these are the transitions:
|
|
Packit |
1c1d7e |
if (c=='[' && !backslashed && insideBraces==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
insideBrackets++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (c==']' && !backslashed && insideBraces==0 && insideBrackets>0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
insideBrackets--;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (c=='{' && !backslashed && !insideQuotes && !(ignoreOutermostBraces && j==0))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
insideBraces++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (c=='}' && !backslashed && !insideQuotes && insideBraces>0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
insideBraces--;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (c=='"' && !backslashed && insideBraces==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
insideQuotes=!insideQuotes;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// all output, depending on state and input
|
|
Packit |
1c1d7e |
if (c=='[' && !backslashed && insideBrackets==1 && insideBraces==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// the first opening bracket, output what we have so far
|
|
Packit |
1c1d7e |
myStr+=c;
|
|
Packit |
1c1d7e |
myScan = tcl_codify_token(myScan, "NULL", myStr);
|
|
Packit |
1c1d7e |
myStr="";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (c==']' && !backslashed && insideBrackets==0 && insideBraces==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// the last closing bracket, start recursion, switch to deferred
|
|
Packit |
1c1d7e |
myScan = tcl_codify_token(myScan, "script", myStr);
|
|
Packit |
1c1d7e |
myStr="";
|
|
Packit |
1c1d7e |
myStr+=c;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myStr+=c;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (i == 0 && myScan == NULL)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_codify_link(myStr);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan = tcl_codify_token(myScan, "NULL", myStr);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return (myScan);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Handle internal tcl commands.
|
|
Packit |
1c1d7e |
// "eval arg ?arg ...?"
|
|
Packit |
1c1d7e |
static void tcl_command_EVAL()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl_codify_cmd("keyword", 0);
|
|
Packit |
1c1d7e |
tcl_scan *myScan = tcl.scan.at(0);
|
|
Packit |
1c1d7e |
QCString myString = "";
|
|
Packit |
1c1d7e |
// we simply rescan the line without the eval
|
|
Packit |
1c1d7e |
// we include leading whitespace because tcl_scan_start will examine
|
|
Packit |
1c1d7e |
// the first char. If it finds a bracket it will assume one expression in brackets.
|
|
Packit |
1c1d7e |
// Example: eval [list set] [list NotInvoked] [Invoked NotInvoked]
|
|
Packit |
1c1d7e |
for (unsigned int i = 1; i < tcl.list_commandwords.count(); i++)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myString += (*tcl.list_commandwords.at(i)).utf8();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
myScan = tcl_scan_start('?', myString,
|
|
Packit |
1c1d7e |
myScan->ns, myScan->entry_cl, myScan->entry_fn);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Handle internal tcl commands.
|
|
Packit |
1c1d7e |
// switch ?options? string pattern body ?pattern body ...?
|
|
Packit |
1c1d7e |
// switch ?options? string {pattern body ?pattern body ...?}
|
|
Packit |
1c1d7e |
static void tcl_command_SWITCH()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl_codify_cmd("keyword",0);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,1);
|
|
Packit |
1c1d7e |
tcl_scan *myScan=NULL;
|
|
Packit |
1c1d7e |
unsigned int i;
|
|
Packit |
1c1d7e |
QCString token;
|
|
Packit |
1c1d7e |
// first: find the last option token
|
|
Packit |
1c1d7e |
unsigned int lastOptionIndex = 0;
|
|
Packit |
1c1d7e |
for (i = 2; i
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
token = (*tcl.list_commandwords.at(i)).utf8();
|
|
Packit |
1c1d7e |
if (token == "--")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
lastOptionIndex = i;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (token[0] == '-' && i - lastOptionIndex == 2)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// options start with dash and should form a continuous chain
|
|
Packit |
1c1d7e |
lastOptionIndex = i;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// second: eat up options
|
|
Packit |
1c1d7e |
for (i = 2; i <= lastOptionIndex; i++)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan = tcl_command_ARG(myScan, i, false);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// third: how many tokens are left?
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() - lastOptionIndex == 5)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("syntax: switch ?options? string {pattern body ?pattern body ...?}\n");
|
|
Packit |
1c1d7e |
myScan = tcl_command_ARG(myScan, lastOptionIndex + 1, false);
|
|
Packit |
1c1d7e |
myScan = tcl_command_ARG(myScan, lastOptionIndex + 2, false);
|
|
Packit |
1c1d7e |
myScan = tcl_command_ARG(myScan, lastOptionIndex + 3, false);
|
|
Packit |
1c1d7e |
// walk trough the list step by step
|
|
Packit |
1c1d7e |
// this way we can preserve whitespace
|
|
Packit |
1c1d7e |
bool inBraces = false;
|
|
Packit |
1c1d7e |
bool nextIsPattern = true;
|
|
Packit |
1c1d7e |
int size;
|
|
Packit |
1c1d7e |
const char *elem;
|
|
Packit |
1c1d7e |
const char *next;
|
|
Packit |
1c1d7e |
token = (*tcl.list_commandwords.at(lastOptionIndex + 4)).utf8();
|
|
Packit |
1c1d7e |
if (token[0] == '{')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
inBraces = true;
|
|
Packit |
1c1d7e |
token = token.mid(1, token.length() - 2);
|
|
Packit |
1c1d7e |
myScan = tcl_codify_token(myScan, "NULL", QCString("{"));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// ToDo: check if multibyte chars are handled correctly
|
|
Packit |
1c1d7e |
while (token.length() > 0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
TclFindElement((const char*)token, token.length(), &elem, &next, &size, NULL);
|
|
Packit |
1c1d7e |
//printf("%s\nstart=%d, elem=%d, next=%d, size=%d, brace=%d\n",
|
|
Packit |
1c1d7e |
// (const char*) token, (const char*) token, elem, next, size, brace);
|
|
Packit |
1c1d7e |
//
|
|
Packit |
1c1d7e |
// handle leading whitespace/opening brace/double quotes
|
|
Packit |
1c1d7e |
if (elem - token > 0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan = tcl_codify_token(myScan, "NULL", token.left(elem - token));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// handle actual element without braces/double quotes
|
|
Packit |
1c1d7e |
if (nextIsPattern)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan = tcl_codify_token(myScan, "NULL", token.mid(elem - token,size));
|
|
Packit |
1c1d7e |
//printf("pattern=%s\n",(const char*) token.mid(elem - token, size));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else {
|
|
Packit |
1c1d7e |
myScan = tcl_codify_token(myScan, "script", token.mid(elem - token, size));
|
|
Packit |
1c1d7e |
//printf("script =%s\n", (const char*) token.mid(elem - token, size));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// handle trailing whitespace/closing brace/double quotes
|
|
Packit |
1c1d7e |
if (next - elem - size > 0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan = tcl_codify_token(myScan, "NULL", token.mid(elem - token + size, next - elem - size));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
nextIsPattern = !nextIsPattern;
|
|
Packit |
1c1d7e |
token = token.mid(next - token);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (inBraces)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan = tcl_codify_token(myScan, "NULL", QCString("}"));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!nextIsPattern)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_war("Invalid switch syntax: last token is not a list of even elements.\n");
|
|
Packit |
1c1d7e |
//tcl_war("%s\n", tcl.list_commandwords.join(" ").ascii());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if ((tcl.list_commandwords.count() - lastOptionIndex > 6) &&
|
|
Packit |
1c1d7e |
((tcl.list_commandwords.count() - lastOptionIndex-3) % 4 == 0))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("detected: switch ?options? string pattern body ?pattern body ...?\n");
|
|
Packit |
1c1d7e |
myScan = tcl_command_ARG(myScan, lastOptionIndex + 1, false);
|
|
Packit |
1c1d7e |
myScan = tcl_command_ARG(myScan, lastOptionIndex + 2, false);
|
|
Packit |
1c1d7e |
//printf("value=%s\n",(const char*) (*tcl.list_commandwords.at(lastOptionIndex + 2)).utf8());
|
|
Packit |
1c1d7e |
for (i = lastOptionIndex + 3; i < tcl.list_commandwords.count(); i += 4)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan = tcl_command_ARG(myScan, i + 0, false); // whitespace
|
|
Packit |
1c1d7e |
myScan = tcl_command_ARG(myScan, i + 1, false); // pattern
|
|
Packit |
1c1d7e |
myScan = tcl_command_ARG(myScan, i + 2, false); // whitespace
|
|
Packit |
1c1d7e |
myScan = tcl_codify_token(myScan, "script", (*tcl.list_commandwords.at(i+3)).utf8()); // script
|
|
Packit |
1c1d7e |
//printf("pattern=%s\n",(const char*) (*tcl.list_commandwords.at(i+1)).utf8());
|
|
Packit |
1c1d7e |
//printf("script=%s\n",(const char*) (*tcl.list_commandwords.at(i+3)).utf8());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// not properly detected syntax
|
|
Packit |
1c1d7e |
tcl_war("Invalid switch syntax: %d options followed by %d tokens.\n",
|
|
Packit |
1c1d7e |
lastOptionIndex / 2, (tcl.list_commandwords.count() - 1) / 2 - lastOptionIndex / 2);
|
|
Packit |
1c1d7e |
for (i = lastOptionIndex + 1; i <= tcl.list_commandwords.count(); i++)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan = tcl_command_ARG(myScan, i, false);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Handle internal tcl commands.
|
|
Packit |
1c1d7e |
// "catch script ?resultVarName? ?optionsVarName?"
|
|
Packit |
1c1d7e |
static void tcl_command_CATCH()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl_codify_cmd("keyword", 0);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL, 1);
|
|
Packit |
1c1d7e |
tcl_scan *myScan = tcl.scan.at(0);
|
|
Packit |
1c1d7e |
myScan = tcl_scan_start('?', *tcl.list_commandwords.at(2),
|
|
Packit |
1c1d7e |
myScan->ns, myScan->entry_cl, myScan->entry_fn);
|
|
Packit |
1c1d7e |
for (unsigned int i = 3; i < tcl.list_commandwords.count(); i++)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan = tcl_command_ARG(myScan, i, false);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Handle internal tcl commands.
|
|
Packit |
1c1d7e |
// "if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN?"
|
|
Packit |
1c1d7e |
static void tcl_command_IF(QStringList type)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl_codify_cmd("keyword",0);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,1);
|
|
Packit |
1c1d7e |
tcl_scan *myScan = NULL;
|
|
Packit |
1c1d7e |
myScan = tcl_command_ARG(myScan, 2, true);
|
|
Packit |
1c1d7e |
for (unsigned int i = 3;i
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (type[i] == "expr")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan = tcl_command_ARG(myScan, i, true);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (myScan!=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan->after << type[i] << tcl.list_commandwords[i];
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan=tcl.scan.at(0);
|
|
Packit |
1c1d7e |
myScan = tcl_scan_start('?',*tcl.list_commandwords.at(i),
|
|
Packit |
1c1d7e |
myScan->ns,myScan->entry_cl,myScan->entry_fn);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//! Handle internal tcl commands.
|
|
Packit |
1c1d7e |
// "for start test next body"
|
|
Packit |
1c1d7e |
static void tcl_command_FOR()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl_codify_cmd("keyword",0);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,1);
|
|
Packit |
1c1d7e |
tcl_scan *myScan=tcl.scan.at(0);
|
|
Packit |
1c1d7e |
myScan = tcl_scan_start('?',*tcl.list_commandwords.at(2),
|
|
Packit |
1c1d7e |
myScan->ns,myScan->entry_cl,myScan->entry_fn);
|
|
Packit |
1c1d7e |
myScan->after << "NULL" << tcl.list_commandwords[3];
|
|
Packit |
1c1d7e |
myScan = tcl_command_ARG(myScan, 4, true);
|
|
Packit |
1c1d7e |
myScan->after << "NULL" << tcl.list_commandwords[5];
|
|
Packit |
1c1d7e |
myScan->after << "script" << tcl.list_commandwords[6];
|
|
Packit |
1c1d7e |
myScan->after << "NULL" << tcl.list_commandwords[7];
|
|
Packit |
1c1d7e |
myScan->after << "script" << tcl.list_commandwords[8];
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
///! Handle internal tcl commands.
|
|
Packit |
1c1d7e |
// "foreach varname list body" and
|
|
Packit |
1c1d7e |
// "foreach varlist1 list1 ?varlist2 list2 ...? body"
|
|
Packit |
1c1d7e |
static void tcl_command_FOREACH()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
unsigned int i;
|
|
Packit |
1c1d7e |
tcl_scan *myScan=NULL;
|
|
Packit |
1c1d7e |
tcl_codify_cmd("keyword",0);
|
|
Packit |
1c1d7e |
for (i = 1;i
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan = tcl_command_ARG(myScan, i, false);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myScan!=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan->after << "script" << tcl.list_commandwords[tcl.list_commandwords.count()-1];
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan=tcl.scan.at(0);
|
|
Packit |
1c1d7e |
myScan = tcl_scan_start('?',*tcl.list_commandwords.at(tcl.list_commandwords.count()-1),
|
|
Packit |
1c1d7e |
myScan->ns,myScan->entry_cl,myScan->entry_fn);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
///! Handle internal tcl commands.
|
|
Packit |
1c1d7e |
// "while test body"
|
|
Packit |
1c1d7e |
static void tcl_command_WHILE()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
tcl_codify_cmd("keyword",0);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,1);
|
|
Packit |
1c1d7e |
tcl_scan *myScan = NULL;
|
|
Packit |
1c1d7e |
myScan = tcl_command_ARG(myScan, 2, true);
|
|
Packit |
1c1d7e |
myScan = tcl_command_ARG(myScan, 3, false);
|
|
Packit |
1c1d7e |
if (myScan!=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan->after << "script" << tcl.list_commandwords[4];
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan=tcl.scan.at(0);
|
|
Packit |
1c1d7e |
myScan = tcl_scan_start('?',*tcl.list_commandwords.at(4),
|
|
Packit |
1c1d7e |
myScan->ns,myScan->entry_cl,myScan->entry_fn);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Handle all other commands.
|
|
Packit |
1c1d7e |
// Create links of first command word or first command word inside [].
|
|
Packit |
1c1d7e |
static void tcl_command_OTHER()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_scan *myScan=NULL;
|
|
Packit |
1c1d7e |
for (unsigned int i=0; i< tcl.list_commandwords.count(); i++)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myScan = tcl_command_ARG(myScan, i, false);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Handle \c proc statements.
|
|
Packit |
1c1d7e |
static void tcl_command_PROC()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
QCString myNs, myName;
|
|
Packit |
1c1d7e |
Entry *myEntryNs;
|
|
Packit |
1c1d7e |
Entry *myEntry;
|
|
Packit |
1c1d7e |
tcl_scan *myScan = tcl.scan.at(0);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
tcl_codify_cmd("keyword",0);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,1);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,2);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,3);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,4);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,5);
|
|
Packit |
1c1d7e |
tcl_name_SnippetAware(myScan->ns,(*tcl.list_commandwords.at(2)).utf8(),myNs,myName);
|
|
Packit |
1c1d7e |
if (myNs.length())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myEntryNs = tcl_entry_namespace(myNs);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myEntryNs = tcl_entry_namespace(myScan->ns);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//why not needed here? tcl.fn.remove(myName);
|
|
Packit |
1c1d7e |
tcl.entry_current->section = Entry::FUNCTION_SEC;
|
|
Packit |
1c1d7e |
tcl.entry_current->mtype = Method;
|
|
Packit |
1c1d7e |
tcl.entry_current->name = myName;
|
|
Packit |
1c1d7e |
tcl.entry_current->startLine = tcl.line_command;
|
|
Packit |
1c1d7e |
tcl.entry_current->bodyLine = tcl.line_body0;
|
|
Packit |
1c1d7e |
tcl.entry_current->endBodyLine = tcl.line_body1;
|
|
Packit |
1c1d7e |
tcl_protection(tcl.entry_current);
|
|
Packit |
1c1d7e |
tcl_command_ARGLIST(*tcl.list_commandwords.at(4));
|
|
Packit |
1c1d7e |
myEntryNs->addSubEntry(tcl.entry_current);
|
|
Packit |
1c1d7e |
myEntry = tcl.entry_current;
|
|
Packit |
1c1d7e |
tcl.fn.insert(myName,myEntry);
|
|
Packit |
1c1d7e |
myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6),
|
|
Packit |
1c1d7e |
myEntryNs->name,NULL,myEntry);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Handle \c itcl::body statements and \c oo::define method and method inside \c itcl::class statements.
|
|
Packit |
1c1d7e |
static void tcl_command_METHOD()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
QCString myNs, myName;
|
|
Packit |
1c1d7e |
Entry *myEntryCl, *myEntry;
|
|
Packit |
1c1d7e |
tcl_scan *myScan = tcl.scan.at(0);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
tcl_codify_cmd("keyword",0);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,1);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,2);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,3);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,4);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,5);
|
|
Packit |
1c1d7e |
tcl_name(myScan->ns,(*tcl.list_commandwords.at(2)).utf8(),myNs,myName);
|
|
Packit |
1c1d7e |
if (myNs.length())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myEntryCl = tcl_entry_class(myNs);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myNs = myScan->ns;
|
|
Packit |
1c1d7e |
myEntryCl = myScan->entry_cl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// needed in case of more then one definition p.e. itcl::method and itcl::body
|
|
Packit |
1c1d7e |
// see also bug #
|
|
Packit |
1c1d7e |
tcl.fn.remove(myName);
|
|
Packit |
1c1d7e |
tcl.entry_current->section = Entry::FUNCTION_SEC;
|
|
Packit |
1c1d7e |
tcl.entry_current->mtype = Method;
|
|
Packit |
1c1d7e |
tcl.entry_current->name = myName;
|
|
Packit |
1c1d7e |
tcl.entry_current->startLine = tcl.line_command;
|
|
Packit |
1c1d7e |
tcl.entry_current->bodyLine = tcl.line_body0;
|
|
Packit |
1c1d7e |
tcl.entry_current->endBodyLine = tcl.line_body1;
|
|
Packit |
1c1d7e |
tcl_protection(tcl.entry_current);
|
|
Packit |
1c1d7e |
tcl_command_ARGLIST(*tcl.list_commandwords.at(4));
|
|
Packit |
1c1d7e |
myEntryCl->addSubEntry(tcl.entry_current);
|
|
Packit |
1c1d7e |
tcl.fn.insert(myName,tcl.entry_current);
|
|
Packit |
1c1d7e |
myEntry = tcl.entry_current;
|
|
Packit |
1c1d7e |
myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6),
|
|
Packit |
1c1d7e |
myNs, myEntryCl, myEntry);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Handle \c constructor statements inside class definitions.
|
|
Packit |
1c1d7e |
static void tcl_command_CONSTRUCTOR()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
QCString myNs, myName;
|
|
Packit |
1c1d7e |
Entry *myEntryCl, *myEntry;
|
|
Packit |
1c1d7e |
tcl_scan *myScan = tcl.scan.at(0);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
tcl_codify_cmd("keyword",0);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,1);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,2);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,3);
|
|
Packit |
1c1d7e |
tcl_name(myScan->ns,(*tcl.list_commandwords.at(0)).utf8(),myNs,myName);
|
|
Packit |
1c1d7e |
if (myNs.length())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myEntryCl = tcl_entry_class(myNs);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myNs = myScan->ns;
|
|
Packit |
1c1d7e |
myEntryCl = myScan->entry_cl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl.entry_current->section = Entry::FUNCTION_SEC;
|
|
Packit |
1c1d7e |
tcl.entry_current->mtype = Method;
|
|
Packit |
1c1d7e |
tcl.entry_current->name = myName;
|
|
Packit |
1c1d7e |
tcl.entry_current->startLine = tcl.line_command;
|
|
Packit |
1c1d7e |
tcl.entry_current->bodyLine = tcl.line_body0;
|
|
Packit |
1c1d7e |
tcl.entry_current->endBodyLine = tcl.line_body1;
|
|
Packit |
1c1d7e |
tcl_protection(tcl.entry_current);
|
|
Packit |
1c1d7e |
tcl_command_ARGLIST(*tcl.list_commandwords.at(2));
|
|
Packit |
1c1d7e |
if (myEntryCl) myEntryCl->addSubEntry(tcl.entry_current);
|
|
Packit |
1c1d7e |
myEntry = tcl.entry_current;
|
|
Packit |
1c1d7e |
tcl.fn.insert(myName,myEntry);
|
|
Packit |
1c1d7e |
myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(4),
|
|
Packit |
1c1d7e |
myNs, myEntryCl, myEntry);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Handle \c destructor statements inside class definitions.
|
|
Packit |
1c1d7e |
static void tcl_command_DESTRUCTOR()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
QCString myNs, myName;
|
|
Packit |
1c1d7e |
Entry *myEntryCl, *myEntry;
|
|
Packit |
1c1d7e |
tcl_scan *myScan = tcl.scan.at(0);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
tcl_codify_cmd("keyword",0);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,1);
|
|
Packit |
1c1d7e |
tcl_name(myScan->ns,(*tcl.list_commandwords.at(0)).utf8(),myNs,myName);
|
|
Packit |
1c1d7e |
if (myNs.length())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myEntryCl = tcl_entry_class(myNs);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myNs = myScan->ns;
|
|
Packit |
1c1d7e |
myEntryCl = myScan->entry_cl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl.entry_current->section = Entry::FUNCTION_SEC;
|
|
Packit |
1c1d7e |
tcl.entry_current->mtype = Method;
|
|
Packit |
1c1d7e |
tcl.entry_current->name = myName;
|
|
Packit |
1c1d7e |
tcl.entry_current->startLine = tcl.line_command;
|
|
Packit |
1c1d7e |
tcl.entry_current->bodyLine = tcl.line_body0;
|
|
Packit |
1c1d7e |
tcl.entry_current->endBodyLine = tcl.line_body1;
|
|
Packit |
1c1d7e |
tcl_protection(tcl.entry_current);
|
|
Packit |
1c1d7e |
myEntryCl->addSubEntry(tcl.entry_current);
|
|
Packit |
1c1d7e |
myEntry = tcl.entry_current;
|
|
Packit |
1c1d7e |
tcl.fn.insert(myName,myEntry);
|
|
Packit |
1c1d7e |
myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(2),
|
|
Packit |
1c1d7e |
myNs, myEntryCl, myEntry);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Handle \c namespace statements.
|
|
Packit |
1c1d7e |
static void tcl_command_NAMESPACE()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
QCString myNs, myName, myStr;
|
|
Packit |
1c1d7e |
//Entry *myEntryNs=NULL;
|
|
Packit |
1c1d7e |
tcl_scan *myScan = tcl.scan.at(0);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
tcl_codify_cmd("keyword",0);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,1);
|
|
Packit |
1c1d7e |
tcl_codify_cmd("keyword",2);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,3);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,4);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,5);
|
|
Packit |
1c1d7e |
tcl_name(myScan->ns,(*tcl.list_commandwords.at(4)).utf8(),myNs,myName);
|
|
Packit |
1c1d7e |
if (myNs.length())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myName = myNs+"::"+myName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl.entry_current->section = Entry::NAMESPACE_SEC;
|
|
Packit |
1c1d7e |
tcl.entry_current->name = myName;
|
|
Packit |
1c1d7e |
tcl.entry_current->startLine = tcl.line_command;
|
|
Packit |
1c1d7e |
tcl.entry_current->bodyLine = tcl.line_body0;
|
|
Packit |
1c1d7e |
tcl.entry_current->endBodyLine = tcl.line_body1;
|
|
Packit |
1c1d7e |
tcl.entry_main->addSubEntry(tcl.entry_current);
|
|
Packit |
1c1d7e |
tcl.ns.insert(myName,tcl.entry_current);
|
|
Packit |
1c1d7e |
//myEntryNs = tcl.entry_current;
|
|
Packit |
1c1d7e |
myStr = (*tcl.list_commandwords.at(6)).utf8();
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() > 7)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
for (uint i=7;i
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myStr.append((*tcl.list_commandwords.at(i)).utf8());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl.word_is=' ';
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
myScan = tcl_scan_start(tcl.word_is,myStr, myName, NULL, NULL);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Handle \c itcl::class statements.
|
|
Packit |
1c1d7e |
static void tcl_command_ITCL_CLASS()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
QCString myNs, myName;
|
|
Packit |
1c1d7e |
Entry *myEntryCl;
|
|
Packit |
1c1d7e |
tcl_scan *myScan = tcl.scan.at(0);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
tcl_codify_cmd("keyword",0);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,1);
|
|
Packit |
1c1d7e |
tcl_codify_cmd("NULL",2);
|
|
Packit |
1c1d7e |
tcl_codify_cmd("NULL",3);
|
|
Packit |
1c1d7e |
tcl_name(myScan->ns,(*tcl.list_commandwords.at(2)).utf8(),myNs,myName);
|
|
Packit |
1c1d7e |
if (myNs.length())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myName = myNs+"::"+myName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl.entry_current->section = Entry::CLASS_SEC;
|
|
Packit |
1c1d7e |
tcl.entry_current->name = myName;
|
|
Packit |
1c1d7e |
tcl.entry_current->startLine = tcl.line_command;
|
|
Packit |
1c1d7e |
tcl.entry_current->bodyLine = tcl.line_body0;
|
|
Packit |
1c1d7e |
tcl.entry_current->endBodyLine = tcl.line_body1;
|
|
Packit |
1c1d7e |
tcl.entry_main->addSubEntry(tcl.entry_current);
|
|
Packit |
1c1d7e |
tcl.cl.insert(myName,tcl.entry_current);
|
|
Packit |
1c1d7e |
myEntryCl = tcl.entry_current;
|
|
Packit |
1c1d7e |
myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(4),
|
|
Packit |
1c1d7e |
myName, myEntryCl, NULL);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Handle \c oo::class statements.
|
|
Packit |
1c1d7e |
static void tcl_command_OO_CLASS()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
QCString myNs, myName;
|
|
Packit |
1c1d7e |
//Entry *myEntryNs;
|
|
Packit |
1c1d7e |
Entry *myEntryCl;
|
|
Packit |
1c1d7e |
tcl_scan *myScan = tcl.scan.at(0);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
tcl_codify_cmd("keyword",0);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,1);
|
|
Packit |
1c1d7e |
tcl_codify_cmd("NULL",2);
|
|
Packit |
1c1d7e |
tcl_codify_cmd("NULL",3);
|
|
Packit |
1c1d7e |
tcl_codify_cmd("NULL",4);
|
|
Packit |
1c1d7e |
tcl_codify_cmd("NULL",5);
|
|
Packit |
1c1d7e |
tcl_name(myScan->ns,(*tcl.list_commandwords.at(4)).utf8(),myNs,myName);
|
|
Packit |
1c1d7e |
if (myNs.length())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myName = myNs+"::"+myName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl.entry_current->section = Entry::CLASS_SEC;
|
|
Packit |
1c1d7e |
tcl.entry_current->name = myName;
|
|
Packit |
1c1d7e |
tcl.entry_current->startLine = tcl.line_command;
|
|
Packit |
1c1d7e |
tcl.entry_current->bodyLine = tcl.line_body0;
|
|
Packit |
1c1d7e |
tcl.entry_current->endBodyLine = tcl.line_body1;
|
|
Packit |
1c1d7e |
tcl.entry_main->addSubEntry(tcl.entry_current);
|
|
Packit |
1c1d7e |
//myEntryNs = tcl_entry_namespace(myName);
|
|
Packit |
1c1d7e |
tcl.cl.insert(myName,tcl.entry_current);
|
|
Packit |
1c1d7e |
myEntryCl = tcl.entry_current;
|
|
Packit |
1c1d7e |
myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6),
|
|
Packit |
1c1d7e |
myName, myEntryCl, NULL);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Handle \c oo::define statements.
|
|
Packit |
1c1d7e |
static void tcl_command_OO_DEFINE()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
QCString myNs, myName, myStr;
|
|
Packit |
1c1d7e |
Entry *myEntryCl;
|
|
Packit |
1c1d7e |
tcl_scan *myScan = tcl.scan.at(0);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
tcl_codify_cmd("keyword",0);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,1);
|
|
Packit |
1c1d7e |
tcl_codify_cmd("NULL",2);
|
|
Packit |
1c1d7e |
tcl_codify_cmd("NULL",3);
|
|
Packit |
1c1d7e |
tcl_name(myScan->ns,(*tcl.list_commandwords.at(2)).utf8(),myNs,myName);
|
|
Packit |
1c1d7e |
if (myNs.length())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myName = myNs+"::"+myName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
myEntryCl = tcl_entry_class(myName);
|
|
Packit |
1c1d7e |
myStr = (*tcl.list_commandwords.at(4)).utf8();
|
|
Packit |
1c1d7e |
//
|
|
Packit |
1c1d7e |
// special cases first
|
|
Packit |
1c1d7e |
// oo::define classname method methodname args script
|
|
Packit |
1c1d7e |
// oo::define classname constructor argList bodyScript
|
|
Packit |
1c1d7e |
// oo::define classname destructor bodyScript
|
|
Packit |
1c1d7e |
unsigned int n =tcl.list_commandwords.count();
|
|
Packit |
1c1d7e |
if ((myStr == "method" && n == 11) ||
|
|
Packit |
1c1d7e |
(myStr == "constructor" && n == 9) ||
|
|
Packit |
1c1d7e |
(myStr == "destructor" && n == 7))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
for (unsigned int i = 4; i < n-1; i++)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_codify_cmd("NULL",i);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
Entry *myEntry;
|
|
Packit |
1c1d7e |
QCString myMethod;
|
|
Packit |
1c1d7e |
tcl_name(myScan->ns,(*tcl.list_commandwords.at(n==11?6:4)).utf8(),myNs,myMethod);
|
|
Packit |
1c1d7e |
// code snippet taken from tcl_command_METHOD()/tcl_command_CONSTRUCTOR
|
|
Packit |
1c1d7e |
tcl.fn.remove(myMethod);
|
|
Packit |
1c1d7e |
tcl.entry_current->section = Entry::FUNCTION_SEC;
|
|
Packit |
1c1d7e |
tcl.entry_current->mtype = Method;
|
|
Packit |
1c1d7e |
tcl.entry_current->name = myMethod;
|
|
Packit |
1c1d7e |
tcl.entry_current->startLine = tcl.line_command;
|
|
Packit |
1c1d7e |
tcl.entry_current->bodyLine = tcl.line_body0;
|
|
Packit |
1c1d7e |
tcl.entry_current->endBodyLine = tcl.line_body1;
|
|
Packit |
1c1d7e |
tcl_protection(tcl.entry_current);
|
|
Packit |
1c1d7e |
if (n==11)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_command_ARGLIST(*tcl.list_commandwords.at(8));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (n==9)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_command_ARGLIST(*tcl.list_commandwords.at(6));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myEntryCl) myEntryCl->addSubEntry(tcl.entry_current);
|
|
Packit |
1c1d7e |
tcl.fn.insert(myMethod,tcl.entry_current);
|
|
Packit |
1c1d7e |
myEntry = tcl.entry_current;
|
|
Packit |
1c1d7e |
myScan = tcl_scan_start('?',*tcl.list_commandwords.at(n-1),
|
|
Packit |
1c1d7e |
myNs, myEntryCl, myEntry);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// The general case
|
|
Packit |
1c1d7e |
// Simply concat all arguments into a script.
|
|
Packit |
1c1d7e |
// Note: all documentation collected just before the
|
|
Packit |
1c1d7e |
// oo::define command is lost
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() > 5)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
for (uint i=5;i
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myStr.append((*tcl.list_commandwords.at(i)).utf8());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl.word_is=' ';
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
myScan = tcl_scan_start(tcl.word_is,myStr,myName,myEntryCl,NULL);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Handle \c variable statements.
|
|
Packit |
1c1d7e |
static void tcl_command_VARIABLE(int inclass)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
D
|
|
Packit |
1c1d7e |
QCString myNs, myName;
|
|
Packit |
1c1d7e |
Entry *myEntry;
|
|
Packit |
1c1d7e |
tcl_scan *myScan = tcl.scan.at(0);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
tcl_codify_cmd("keyword",0);
|
|
Packit |
1c1d7e |
for (unsigned int i=1; i< tcl.list_commandwords.count(); i++)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,i);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl_name(myScan->ns,(*tcl.list_commandwords.at(2)).utf8(),myNs,myName);
|
|
Packit |
1c1d7e |
if (myNs.length())
|
|
Packit |
1c1d7e |
{// qualified variables go into namespace
|
|
Packit |
1c1d7e |
myEntry = tcl_entry_namespace(myNs);
|
|
Packit |
1c1d7e |
tcl.entry_current->stat = true;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (inclass)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myEntry = myScan->entry_cl;
|
|
Packit |
1c1d7e |
tcl.entry_current->stat = false;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myEntry = tcl_entry_namespace(myScan->ns);
|
|
Packit |
1c1d7e |
tcl.entry_current->stat = true;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl.entry_current->section = Entry::VARIABLE_SEC;
|
|
Packit |
1c1d7e |
tcl.entry_current->name = myName;
|
|
Packit |
1c1d7e |
tcl.entry_current->startLine = tcl.line_command;
|
|
Packit |
1c1d7e |
tcl.entry_current->bodyLine = tcl.line_body0;
|
|
Packit |
1c1d7e |
tcl.entry_current->endBodyLine = tcl.line_body1;
|
|
Packit |
1c1d7e |
tcl_protection(tcl.entry_current);
|
|
Packit |
1c1d7e |
myEntry->addSubEntry(tcl.entry_current);
|
|
Packit |
1c1d7e |
tcl.entry_current = tcl_entry_new();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Handling of command parsing.
|
|
Packit |
1c1d7e |
//! what=0 -> ...
|
|
Packit |
1c1d7e |
//! what=1 -> ...
|
|
Packit |
1c1d7e |
//! what=-1 -> ...
|
|
Packit |
1c1d7e |
static void tcl_command(int what,const char *text)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int myLine=0;
|
|
Packit |
1c1d7e |
if (what==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.scan.at(0)->line1=yylineno;// current line in scan context
|
|
Packit |
1c1d7e |
tcl.line_body0=yylineno;// start line of command
|
|
Packit |
1c1d7e |
tcl_inf("<- %s\n",text);
|
|
Packit |
1c1d7e |
yy_push_state(COMMAND);
|
|
Packit |
1c1d7e |
tcl.list_commandwords.clear();
|
|
Packit |
1c1d7e |
tcl.string_command="";
|
|
Packit |
1c1d7e |
tcl.string_last="";
|
|
Packit |
1c1d7e |
tcl.command=1;
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (what==1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.string_last.length())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.list_commandwords.append(tcl.string_last);
|
|
Packit |
1c1d7e |
tcl.string_last="";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (text)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.list_commandwords.append(text);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (what!=-1)
|
|
Packit |
1c1d7e |
{// should not happen
|
|
Packit |
1c1d7e |
tcl_err("what %d\n",what);
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
QCString myText = text;
|
|
Packit |
1c1d7e |
tcl_inf("->\n");
|
|
Packit |
1c1d7e |
if (tcl.command==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return; //TODO check on inside comment
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (tcl.string_last != "")
|
|
Packit |
1c1d7e |
{// get last word
|
|
Packit |
1c1d7e |
tcl.list_commandwords.append(tcl.string_last);
|
|
Packit |
1c1d7e |
tcl.string_last="";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
yy_pop_state();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// check command
|
|
Packit |
1c1d7e |
QCString myStr = (*tcl.list_commandwords.at(0)).utf8();
|
|
Packit |
1c1d7e |
tcl_scan *myScanBackup=tcl.scan.at(0);
|
|
Packit |
1c1d7e |
int myLevel = 0;
|
|
Packit |
1c1d7e |
Protection myProt = tcl.protection;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() < 3)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_command_OTHER();
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// remove leading "::" and apply TCL_SUBST
|
|
Packit |
1c1d7e |
if (myStr.left(2)=="::") myStr = myStr.mid(2);
|
|
Packit |
1c1d7e |
if (tcl.config_subst.contains(myStr))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myStr=tcl.config_subst[myStr].utf8();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myStr=="private")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.protection = Private;
|
|
Packit |
1c1d7e |
myLevel = 1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (myStr=="protected")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.protection = Protected;
|
|
Packit |
1c1d7e |
myLevel = 1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (myStr=="public")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.protection = Public;
|
|
Packit |
1c1d7e |
myLevel = 1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myLevel)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_codify_cmd("keyword",0);
|
|
Packit |
1c1d7e |
tcl_codify_cmd(NULL,1);
|
|
Packit |
1c1d7e |
tcl.list_commandwords.remove(tcl.list_commandwords.at(1));
|
|
Packit |
1c1d7e |
tcl.list_commandwords.remove(tcl.list_commandwords.at(0));
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count()==1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_scan *myScan = tcl.scan.at(0);
|
|
Packit |
1c1d7e |
myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(0),
|
|
Packit |
1c1d7e |
myScan->ns,myScan->entry_cl,myScan->entry_fn);
|
|
Packit |
1c1d7e |
myProt = tcl.protection;
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
myStr = (*tcl.list_commandwords.at(0)).utf8();
|
|
Packit |
1c1d7e |
// remove leading "::" and apply TCL_SUBST
|
|
Packit |
1c1d7e |
if (myStr.left(2)=="::") myStr = myStr.mid(2);
|
|
Packit |
1c1d7e |
if (tcl.config_subst.contains(myStr))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myStr=tcl.config_subst[myStr].utf8();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myStr=="proc")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() == 5)
|
|
Packit |
1c1d7e |
{// itcl::proc
|
|
Packit |
1c1d7e |
tcl.list_commandwords.append("");
|
|
Packit |
1c1d7e |
tcl.list_commandwords.append("");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() != 7) {myLine=__LINE__;goto command_warn;}
|
|
Packit |
1c1d7e |
tcl_command_PROC();
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myStr=="method")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() == 5)
|
|
Packit |
1c1d7e |
{// itcl::method
|
|
Packit |
1c1d7e |
tcl.list_commandwords.append("");
|
|
Packit |
1c1d7e |
tcl.list_commandwords.append("");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() != 7) {myLine=__LINE__;goto command_warn;}
|
|
Packit |
1c1d7e |
tcl_command_METHOD();
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myStr=="constructor")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() != 5) {myLine=__LINE__;goto command_warn;}
|
|
Packit |
1c1d7e |
tcl_command_CONSTRUCTOR();
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myStr=="destructor")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() != 3) {myLine=__LINE__;goto command_warn;}
|
|
Packit |
1c1d7e |
tcl_command_DESTRUCTOR();
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myStr=="namespace")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ((*tcl.list_commandwords.at(2)).utf8()=="eval")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() < 7) {myLine=__LINE__;goto command_warn;}
|
|
Packit |
1c1d7e |
tcl_command_NAMESPACE();
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl_command_OTHER();
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myStr=="itcl::class")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() != 5) {myLine=__LINE__;goto command_warn;}
|
|
Packit |
1c1d7e |
tcl_command_ITCL_CLASS();
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myStr=="itcl::body")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() != 7) {myLine=__LINE__;goto command_warn;}
|
|
Packit |
1c1d7e |
tcl_command_METHOD();
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myStr=="oo::class")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ((*tcl.list_commandwords.at(2)).utf8()=="create")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() != 7) {myLine=__LINE__;goto command_warn;}
|
|
Packit |
1c1d7e |
tcl_command_OO_CLASS();
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl_command_OTHER();
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myStr=="oo::define")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() < 5) {myLine=__LINE__;goto command_warn;}
|
|
Packit |
1c1d7e |
tcl_command_OO_DEFINE();
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myStr=="variable")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;}
|
|
Packit |
1c1d7e |
if (tcl.scan.at(0)->entry_fn == NULL)
|
|
Packit |
1c1d7e |
{// only parsed outside functions
|
|
Packit |
1c1d7e |
tcl_command_VARIABLE(tcl.scan.at(0)->entry_cl && tcl.scan.at(0)->entry_cl->name!="");
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myStr=="common")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;}
|
|
Packit |
1c1d7e |
if (tcl.scan.at(0)->entry_fn == NULL)
|
|
Packit |
1c1d7e |
{// only parsed outside functions
|
|
Packit |
1c1d7e |
tcl_command_VARIABLE(0);
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myStr=="inherit" || myStr=="superclass")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;}
|
|
Packit |
1c1d7e |
if (tcl.scan.at(0)->entry_cl && tcl.scan.at(0)->entry_cl->name!="")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
for (unsigned int i = 2; i < tcl.list_commandwords.count(); i = i + 2)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.scan.at(0)->entry_cl->extends->append(new BaseInfo((*tcl.list_commandwords.at(i)).utf8(),Public,Normal));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
* Start of internal tcl keywords
|
|
Packit |
1c1d7e |
* Ready: switch, eval, catch, if, for, foreach, while
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
if (myStr=="switch")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() < 5) {myLine=__LINE__;goto command_warn;}
|
|
Packit |
1c1d7e |
tcl_command_SWITCH();
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myStr=="eval")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;}
|
|
Packit |
1c1d7e |
tcl_command_EVAL();
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myStr=="catch")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;}
|
|
Packit |
1c1d7e |
tcl_command_CATCH();
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myStr=="for")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() != 9) {myLine=__LINE__;goto command_warn;}
|
|
Packit |
1c1d7e |
tcl_command_FOR();
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myStr=="foreach")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() < 7 || tcl.list_commandwords.count()%2==0) {myLine=__LINE__;goto command_warn;}
|
|
Packit |
1c1d7e |
tcl_command_FOREACH();
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN?
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
if (myStr=="if" && tcl.list_commandwords.count() > 4)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QStringList myType;
|
|
Packit |
1c1d7e |
myType << "keyword" << "NULL" << "expr" << "NULL";
|
|
Packit |
1c1d7e |
char myState='x';// last word: e'x'pr 't'hen 'b'ody 'e'lse else'i'f..
|
|
Packit |
1c1d7e |
for (unsigned int i = 4; i < tcl.list_commandwords.count(); i = i + 2)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString myStr=(*tcl.list_commandwords.at(i)).utf8();
|
|
Packit |
1c1d7e |
if (myState=='x')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (myStr=="then")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myState='t';
|
|
Packit |
1c1d7e |
myType << "keyword" << "NULL";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myState='b';
|
|
Packit |
1c1d7e |
myType << "script" << "NULL";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (myState=='t')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myState='b';
|
|
Packit |
1c1d7e |
myType << "script" << "NULL";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (myState=='b')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (myStr=="elseif") {
|
|
Packit |
1c1d7e |
myState='i';
|
|
Packit |
1c1d7e |
myType << "keyword" << "NULL";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (myStr=="else" && i==tcl.list_commandwords.count()-3)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myState = 'b';
|
|
Packit |
1c1d7e |
myType << "keyword" << "NULL" << "script";
|
|
Packit |
1c1d7e |
i = tcl.list_commandwords.count();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (i==tcl.list_commandwords.count()-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myState = 'b';
|
|
Packit |
1c1d7e |
myType << "script";
|
|
Packit |
1c1d7e |
i = tcl.list_commandwords.count();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myLine=__LINE__;goto command_warn;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (myState=='i')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myState='x';
|
|
Packit |
1c1d7e |
myType << "expr" << "NULL";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myState != 'b') {myLine=__LINE__;goto command_warn;}
|
|
Packit |
1c1d7e |
tcl_command_IF(myType);
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (myStr=="while")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (tcl.list_commandwords.count() != 5) {myLine=__LINE__;goto command_warn;}
|
|
Packit |
1c1d7e |
tcl_command_WHILE();
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl_command_OTHER();
|
|
Packit |
1c1d7e |
goto command_end;
|
|
Packit |
1c1d7e |
command_warn:// print warning message because of wrong used syntax
|
|
Packit |
1c1d7e |
tcl_war("%d count=%d: %s\n",myLine,tcl.list_commandwords.count(),tcl.list_commandwords.join(" ").ascii());
|
|
Packit |
1c1d7e |
tcl_command_OTHER();
|
|
Packit |
1c1d7e |
command_end:// add remaining text to current context
|
|
Packit |
1c1d7e |
if (!myText.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if(myScanBackup==tcl.scan.at(0))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_codify("comment",myText);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.scan.at(0)->after << "comment" << myText;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl.list_commandwords.clear();
|
|
Packit |
1c1d7e |
tcl.command = 0;
|
|
Packit |
1c1d7e |
tcl.protection = myProt;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//----------------------------------------------------------------------------
|
|
Packit |
1c1d7e |
//! Common initializations.
|
|
Packit |
1c1d7e |
static void tcl_init()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// Get values from option TCL_SUBST
|
|
Packit |
1c1d7e |
tcl.config_subst.clear();
|
|
Packit |
1c1d7e |
QStrList myStrList = Config_getList(TCL_SUBST);
|
|
Packit |
1c1d7e |
const char *s=myStrList.first();
|
|
Packit |
1c1d7e |
while (s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString myStr=s;
|
|
Packit |
1c1d7e |
int i=myStr.find('=');
|
|
Packit |
1c1d7e |
if (i>0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString myName=myStr.left(i).stripWhiteSpace();
|
|
Packit |
1c1d7e |
QCString myValue=myStr.right(myStr.length()-i-1).stripWhiteSpace();
|
|
Packit |
1c1d7e |
if (!myName.isEmpty() && !myValue.isEmpty())
|
|
Packit |
1c1d7e |
tcl_inf("TCL_SUBST: use '%s'\n",s);
|
|
Packit |
1c1d7e |
tcl.config_subst[myName] = myValue;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
s = myStrList.next();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (tcl.input_string.at(tcl.input_string.length()-1) == 0x1A)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (tcl.input_string.at(tcl.input_string.length()-1) == '\n')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.input_string[tcl.input_string.length()-1] = 0x1A;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.input_string += 0x1A;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
tcl.code = NULL;
|
|
Packit |
1c1d7e |
tcl.code_font=NULL;
|
|
Packit |
1c1d7e |
tcl.code_line=1;
|
|
Packit |
1c1d7e |
tcl.code_linenumbers=1;
|
|
Packit |
1c1d7e |
tcl.config_autobrief = Config_getBool(JAVADOC_AUTOBRIEF);
|
|
Packit |
1c1d7e |
tcl.input_position = 0;
|
|
Packit |
1c1d7e |
tcl.file_name = NULL;
|
|
Packit |
1c1d7e |
tcl.this_parser = NULL;
|
|
Packit |
1c1d7e |
tcl.command=0;
|
|
Packit |
1c1d7e |
tcl.comment=0;
|
|
Packit |
1c1d7e |
tcl.brace_level=0;
|
|
Packit |
1c1d7e |
tcl.bracket_level=0;
|
|
Packit |
1c1d7e |
tcl.bracket_quote=0;
|
|
Packit |
1c1d7e |
tcl.word_is=' ';
|
|
Packit |
1c1d7e |
tcl.string_command="";
|
|
Packit |
1c1d7e |
tcl.string_commentline="";
|
|
Packit |
1c1d7e |
tcl.string_commentcodify="";
|
|
Packit |
1c1d7e |
tcl.string_comment = "";
|
|
Packit |
1c1d7e |
tcl.string_last = "";
|
|
Packit |
1c1d7e |
tcl.entry_main = NULL;
|
|
Packit |
1c1d7e |
tcl.entry_file = NULL;
|
|
Packit |
1c1d7e |
tcl.entry_current = NULL;
|
|
Packit |
1c1d7e |
tcl.entry_inside = NULL;
|
|
Packit |
1c1d7e |
tcl.list_commandwords.clear();
|
|
Packit |
1c1d7e |
tcl.scan.clear();
|
|
Packit |
1c1d7e |
tcl.ns.clear();
|
|
Packit |
1c1d7e |
tcl.cl.clear();
|
|
Packit |
1c1d7e |
tcl.fn.clear();
|
|
Packit |
1c1d7e |
yylineno = 1;
|
|
Packit |
1c1d7e |
tcl.protection = Public;
|
|
Packit |
1c1d7e |
tcl.memberdef = NULL;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Start parsing.
|
|
Packit |
1c1d7e |
static void tcl_parse(const QCString ns, const QCString cls)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_scan *myScan;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
tcl.entry_file = tcl_entry_new();
|
|
Packit |
1c1d7e |
tcl.entry_file->name = tcl.file_name;
|
|
Packit |
1c1d7e |
tcl.entry_file->section = Entry::SOURCE_SEC;
|
|
Packit |
1c1d7e |
tcl.entry_file->protection = Public;
|
|
Packit |
1c1d7e |
tcl.entry_main->addSubEntry(tcl.entry_file);
|
|
Packit |
1c1d7e |
Entry *myEntry=tcl_entry_new();
|
|
Packit |
1c1d7e |
myEntry->name="";
|
|
Packit |
1c1d7e |
tcl.entry_main->addSubEntry(myEntry);
|
|
Packit |
1c1d7e |
tcl.ns.insert("::",myEntry);
|
|
Packit |
1c1d7e |
tcl.entry_current = tcl_entry_new();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
tclscannerYYrestart( tclscannerYYin );
|
|
Packit |
1c1d7e |
BEGIN( TOP );
|
|
Packit |
1c1d7e |
yylineno=1;
|
|
Packit |
1c1d7e |
myScan = new tcl_scan;
|
|
Packit |
1c1d7e |
myScan->type[0]=' ';myScan->type[1]='\n';
|
|
Packit |
1c1d7e |
myScan->after.clear();
|
|
Packit |
1c1d7e |
myScan->line0=yylineno;
|
|
Packit |
1c1d7e |
myScan->line1=yylineno;
|
|
Packit |
1c1d7e |
myScan->buffer_state=YY_CURRENT_BUFFER;
|
|
Packit |
1c1d7e |
myScan->ns=ns;
|
|
Packit |
1c1d7e |
myScan->entry_cl=tcl_entry_class(cls);
|
|
Packit |
1c1d7e |
myScan->entry_fn=NULL;
|
|
Packit |
1c1d7e |
tcl.entry_inside = tcl.entry_file;
|
|
Packit |
1c1d7e |
myScan->entry_scan = tcl.entry_inside;
|
|
Packit |
1c1d7e |
tcl.scan.insert(0,myScan);
|
|
Packit |
1c1d7e |
tclscannerYYlex();
|
|
Packit |
1c1d7e |
tcl.scan.clear();
|
|
Packit |
1c1d7e |
tcl.ns.clear();
|
|
Packit |
1c1d7e |
tcl.cl.clear();
|
|
Packit |
1c1d7e |
tcl.fn.clear();
|
|
Packit |
1c1d7e |
tcl.entry.clear();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Parse text file and build up entry tree.
|
|
Packit |
1c1d7e |
void TclLanguageScanner::parseInput(const char *fileName,
|
|
Packit |
1c1d7e |
const char *input,
|
|
Packit |
1c1d7e |
Entry *root,
|
|
Packit |
1c1d7e |
bool /*sameTranslationUnit*/,
|
|
Packit |
1c1d7e |
QStrList & /*filesInSameTranslationUnit*/)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QFile myFile;
|
|
Packit |
1c1d7e |
tcl_inf("%s\n",fileName);
|
|
Packit |
1c1d7e |
myFile.setName(fileName);
|
|
Packit |
1c1d7e |
if (!myFile.open(IO_ReadOnly)) return;
|
|
Packit |
1c1d7e |
if (strlen(input)<1) return;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
tcl.input_string = input;
|
|
Packit |
1c1d7e |
if (tcl.input_string.length()<1) return;
|
|
Packit |
1c1d7e |
printlex(yy_flex_debug, TRUE, __FILE__, fileName);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
msg("Parsing %s...\n",fileName);
|
|
Packit |
1c1d7e |
groupEnterFile(fileName,yylineno);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
tcl_init();
|
|
Packit |
1c1d7e |
tcl.code = NULL;
|
|
Packit |
1c1d7e |
tcl.file_name = fileName;
|
|
Packit |
1c1d7e |
tcl.this_parser = this;
|
|
Packit |
1c1d7e |
tcl.entry_main = root; /* toplevel entry */
|
|
Packit |
1c1d7e |
tcl_parse("","");
|
|
Packit |
1c1d7e |
groupLeaveFile(tcl.file_name,yylineno);
|
|
Packit |
1c1d7e |
root->program.resize(0);
|
|
Packit |
1c1d7e |
myFile.close();
|
|
Packit |
1c1d7e |
printlex(yy_flex_debug, FALSE, __FILE__, fileName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//! Parse file and codify.
|
|
Packit |
1c1d7e |
void TclLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf,
|
|
Packit |
1c1d7e |
const char * scopeName,
|
|
Packit |
1c1d7e |
const QCString & input,
|
|
Packit |
1c1d7e |
SrcLangExt lang,
|
|
Packit |
1c1d7e |
bool isExampleBlock,
|
|
Packit |
1c1d7e |
const char * exampleName,
|
|
Packit |
1c1d7e |
FileDef * fileDef,
|
|
Packit |
1c1d7e |
int startLine,
|
|
Packit |
1c1d7e |
int endLine,
|
|
Packit |
1c1d7e |
bool inlineFragment,
|
|
Packit |
1c1d7e |
MemberDef *memberDef,
|
|
Packit |
1c1d7e |
bool showLineNumbers,
|
|
Packit |
1c1d7e |
Definition *searchCtx,
|
|
Packit |
1c1d7e |
bool collectXRefs
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
(void)scopeName;
|
|
Packit |
1c1d7e |
(void)lang;
|
|
Packit |
1c1d7e |
(void)exampleName;
|
|
Packit |
1c1d7e |
(void)fileDef;
|
|
Packit |
1c1d7e |
(void)endLine;
|
|
Packit |
1c1d7e |
(void)inlineFragment;
|
|
Packit |
1c1d7e |
(void)searchCtx;
|
|
Packit |
1c1d7e |
(void)collectXRefs;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (input.length()<1) return;
|
|
Packit |
1c1d7e |
printlex(yy_flex_debug, TRUE, __FILE__, fileDef ? fileDef->fileName().data(): NULL);
|
|
Packit |
1c1d7e |
tcl.input_string = input;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString myNs="";
|
|
Packit |
1c1d7e |
QCString myCls="";
|
|
Packit |
1c1d7e |
if (memberDef)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (memberDef->getClassDef())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myCls = memberDef->getClassDef()->displayName();
|
|
Packit |
1c1d7e |
myNs = myCls;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (memberDef->getNamespaceDef())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myNs = memberDef->getNamespaceDef()->displayName();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QString myStr="Codifying..";
|
|
Packit |
1c1d7e |
if (scopeName)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myStr +=" scope=";
|
|
Packit |
1c1d7e |
myStr+=scopeName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (exampleName)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myStr+=" example=";
|
|
Packit |
1c1d7e |
myStr+=exampleName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (memberDef)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myStr+=" member=";
|
|
Packit |
1c1d7e |
myStr+=memberDef->memberTypeName();
|
|
Packit |
1c1d7e |
myStr+=" ";
|
|
Packit |
1c1d7e |
myStr+=memberDef->qualifiedName();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (fileDef)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
myStr+=" file=";
|
|
Packit |
1c1d7e |
myStr+=fileDef->fileName();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl_inf("%s (%d,%d) %d %d\n",myStr.ascii(),startLine,endLine,isExampleBlock,inlineFragment);
|
|
Packit |
1c1d7e |
//tcl_inf("%s\n"input.data());
|
|
Packit |
1c1d7e |
if (isExampleBlock)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl_codify(NULL,input);
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl_init();
|
|
Packit |
1c1d7e |
tcl.collectXRefs = collectXRefs;
|
|
Packit |
1c1d7e |
tcl.memberdef = memberDef;
|
|
Packit |
1c1d7e |
tcl.code = &codeOutIntf;
|
|
Packit |
1c1d7e |
if (startLine<0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
startLine=1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
yylineno=startLine;
|
|
Packit |
1c1d7e |
tcl.code_linenumbers = showLineNumbers;
|
|
Packit |
1c1d7e |
tcl.code_line=yylineno;
|
|
Packit |
1c1d7e |
tcl.code->startCodeLine(tcl.code_linenumbers);
|
|
Packit |
1c1d7e |
if (tcl.code_linenumbers)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tcl.code->writeLineNumber(0,0,0,tcl.code_line);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tcl.file_name = "";
|
|
Packit |
1c1d7e |
tcl.this_parser = NULL;
|
|
Packit |
1c1d7e |
tcl.entry_main = tcl_entry_new();
|
|
Packit |
1c1d7e |
tcl_parse(myNs,myCls);
|
|
Packit |
1c1d7e |
tcl.code->endCodeLine();
|
|
Packit |
1c1d7e |
tcl.scan.clear();
|
|
Packit |
1c1d7e |
tcl.ns.clear();
|
|
Packit |
1c1d7e |
tcl.cl.clear();
|
|
Packit |
1c1d7e |
tcl.fn.clear();
|
|
Packit |
1c1d7e |
tcl.entry.clear();
|
|
Packit |
1c1d7e |
printlex(yy_flex_debug, FALSE, __FILE__, fileDef ? fileDef->fileName().data(): NULL);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool TclLanguageScanner::needsPreprocessing(const QCString &extension)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
(void)extension;
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void TclLanguageScanner::resetCodeParserState()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void TclLanguageScanner::parsePrototype(const char *text)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
(void)text;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static int yyread(char *buf,int max_size)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int c=0;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
*buf = '\0';
|
|
Packit |
1c1d7e |
while ( c < max_size && tcl.input_string.at(tcl.input_position) )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
*buf = tcl.input_string.at(tcl.input_position++) ;
|
|
Packit |
1c1d7e |
c++; buf++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//printf("Read from=%d size=%d max=%d c=%d\n",tcl.input_position,strlen(&tcl.input_string[tcl.input_position]),max_size,c);
|
|
Packit |
1c1d7e |
return c;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//----------------------------------------------------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// to avoid a warning
|
|
Packit |
1c1d7e |
void tclDummy()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
yy_top_state();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#if !defined(YY_FLEX_SUBMINOR_VERSION)
|
|
Packit |
1c1d7e |
//----------------------------------------------------------------------------
|
|
Packit |
1c1d7e |
extern "C" { // some bogus code to keep the compiler happy
|
|
Packit |
1c1d7e |
void tclscannerYYdummy() { yy_flex_realloc(0,0); }
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
|