defargs.l 14.1 KB
Newer Older
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1 2
/******************************************************************************
 *
3
 * 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
4
 *
5
 * Copyright (C) 1997-2010 by Dimitri van Heesch.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
6 7 8 9 10 11 12
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation under the terms of the GNU General Public License is hereby 
 * granted. No representations are made about the suitability of this software 
 * for any purpose. It is provided "as is" without express or implied warranty.
 * See the GNU General Public License for more details.
 *
Dimitri van Heesch's avatar
Dimitri van Heesch committed
13 14
 * Documents produced by Doxygen are derivative works derived from the
 * input used in their production; they are not affected by this license.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
15 16 17
 *
 */

Dimitri van Heesch's avatar
Dimitri van Heesch committed
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
/*! \file
 *  This scanner is used to convert a string into a list of function or 
 *  template arguments. Each parsed argument results in a Argument struct,
 *  that is put into an ArgumentList in declaration order.
 *  Comment blocks for arguments can also be included in the string.
 *  The argument string does not contain new-lines (except inside any
 *  comment blocks).
 *  An Argument consists of the string fields: 
 *                 type,name,default value, and documentation
 *  The Argument list as a whole can be pure, constant or volatile.
 *
 *  Examples of input strings are:
 *  \code
 *    "(int a,int b) const"
 *    "(const char *s="hello world",int=5) = 0"
 *    "<class T,class N>"
 *    "(char c,const char)"
 *  \endcode
 *
 *  Note: It is not always possible to distinguish between the name and 
 *        type of an argument. In case of doubt the name is added to the
 *        type, and the matchArgumentList in util.cpp is be used to
 *        further determine the correct separation.
 */

Dimitri van Heesch's avatar
Dimitri van Heesch committed
43 44 45 46 47
%{

/*
 *	includes
 */
48
#include "qtbc.h"
Dimitri van Heesch's avatar
Dimitri van Heesch committed
49
#include <stdio.h>
50
//#include <iostream.h>
Dimitri van Heesch's avatar
Dimitri van Heesch committed
51 52 53 54 55 56 57 58 59 60 61
#include <assert.h>
#include <ctype.h>
#include <qregexp.h>

#include "defargs.h"
#include "entry.h"
#include "util.h"
  
#define YY_NEVER_INTERACTIVE 1
  
/* -----------------------------------------------------------------
Dimitri van Heesch's avatar
Dimitri van Heesch committed
62
 *	state variables
Dimitri van Heesch's avatar
Dimitri van Heesch committed
63
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
64 65 66 67 68 69 70 71 72 73
static const char      *g_inputString;
static int	        g_inputPosition;
static ArgumentList    *g_argList;
static QCString        *g_copyArgValue;
static QCString         g_curArgTypeName;
static QCString         g_curArgDefValue;
static QCString		g_curArgName;
static QCString		g_curArgDocs;
static QCString		g_curArgAttrib;
static QCString		g_curArgArray;
74
static QCString		g_extraTypeChars;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
75 76 77 78 79 80
static int              g_argRoundCount;
static int              g_argSharpCount;
static int              g_argCurlyCount;
static int              g_readArgContext;
static int              g_lastDocContext;
static int              g_lastDocChar;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
81 82 83 84 85 86 87 88 89

/* -----------------------------------------------------------------
 */
#undef	YY_INPUT
#define	YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);

static int yyread(char *buf,int max_size)
{
    int c=0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
90
    while( c < max_size && g_inputString[g_inputPosition] )
Dimitri van Heesch's avatar
Dimitri van Heesch committed
91
    {
Dimitri van Heesch's avatar
Dimitri van Heesch committed
92
	*buf = g_inputString[g_inputPosition++] ;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
93 94 95 96 97 98 99 100
	c++; buf++;
    }
    return c;
}

%}

B       [ \t]
101
ID	[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
Dimitri van Heesch's avatar
Dimitri van Heesch committed
102

103 104
%option noyywrap

Dimitri van Heesch's avatar
Dimitri van Heesch committed
105 106 107 108 109 110 111 112 113 114
%x      Start
%x      CopyArgString
%x	CopyArgRound
%x	CopyArgRound2
%x	CopyArgSharp
%x	CopyArgCurly
%x	ReadFuncArgType
%x	ReadFuncArgDef
%x	ReadFuncArgPtr
%x	FuncQual
Dimitri van Heesch's avatar
Dimitri van Heesch committed
115 116
%x	ReadDocBlock
%x	ReadDocLine
Dimitri van Heesch's avatar
Dimitri van Heesch committed
117 118 119 120 121 122 123


%%

<Start>[<(]				{ BEGIN(ReadFuncArgType); }

<ReadFuncArgType>{B}*			{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
124
  					  g_curArgTypeName+=" ";
Dimitri van Heesch's avatar
Dimitri van Heesch committed
125
  					}
126
<ReadFuncArgType>"["[^\]]*"]"		{ 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
127 128 129 130 131 132 133 134
					  if (g_curArgTypeName.stripWhiteSpace().isEmpty())
					  {
					    g_curArgAttrib=yytext; // for M$-IDL
					  }
					  else // array type
					  {
					    g_curArgArray+=yytext;
					  }
135
					}
Dimitri van Heesch's avatar
Dimitri van Heesch committed
136 137 138
<ReadFuncArgDef>"'"\\[0-7]{1,3}"'"	{ g_curArgDefValue+=yytext; }
<ReadFuncArgDef>"'"\\."'"		{ g_curArgDefValue+=yytext; }
<ReadFuncArgDef>"'"."'"			{ g_curArgDefValue+=yytext; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
139
<ReadFuncArgDef>\"			{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
140
  					  g_curArgDefValue+=*yytext;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
141 142 143 144
  					  BEGIN( CopyArgString );
  					}
<ReadFuncArgType>"("([^:)]+{B}*"::")*{B}*[&*]+{B}*/{ID} { 
  					  // function pointer as argument
Dimitri van Heesch's avatar
Dimitri van Heesch committed
145 146
					  g_curArgTypeName+=yytext;
					  //g_curArgTypeName=g_curArgTypeName.simplifyWhiteSpace();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
147 148 149
					  BEGIN( ReadFuncArgPtr );
  					}
<ReadFuncArgPtr>{ID}			{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
150
					  g_curArgName=yytext;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
151
  					}
152
<ReadFuncArgPtr>")"{B}*"("		{ // function pointer
Dimitri van Heesch's avatar
Dimitri van Heesch committed
153 154 155 156 157
					  g_curArgTypeName+=yytext;
					  //g_curArgTypeName=g_curArgTypeName.simplifyWhiteSpace();
					  g_readArgContext = ReadFuncArgType;
					  g_copyArgValue=&g_curArgTypeName;
					  g_argRoundCount=0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
158 159
					  BEGIN( CopyArgRound2 );
					}
160 161
<ReadFuncArgPtr>")"/{B}*"["		{ // pointer to fixed size array
					  g_curArgTypeName+=yytext;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
162
					  g_curArgTypeName+=g_curArgName;
163 164 165
					  //g_curArgTypeName=g_curArgTypeName.simplifyWhiteSpace();
					  BEGIN( ReadFuncArgType );
					}
Dimitri van Heesch's avatar
Dimitri van Heesch committed
166
<ReadFuncArgPtr>")"			{ // redundant braces detected / remove them
Dimitri van Heesch's avatar
Dimitri van Heesch committed
167
					  int i=g_curArgTypeName.findRev('('),l=g_curArgTypeName.length();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
168
					  if (i!=-1)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
169 170 171
					    g_curArgTypeName=g_curArgTypeName.left(i)+
					                   g_curArgTypeName.right(l-i-1);
					  g_curArgTypeName+=g_curArgName;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
172 173
					  BEGIN( ReadFuncArgType );
					}
174 175 176
<ReadFuncArgType>"<="|">="|"->"|">>"|"<<" { // handle operators in defargs
  					  g_curArgTypeName+=yytext;
  					}
Dimitri van Heesch's avatar
Dimitri van Heesch committed
177 178 179
<ReadFuncArgType,ReadFuncArgDef>[({<]	{	 
					  if (YY_START==ReadFuncArgType)
					  {
Dimitri van Heesch's avatar
Dimitri van Heesch committed
180 181
					    g_curArgTypeName+=*yytext;
					    g_copyArgValue=&g_curArgTypeName;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
182 183 184
					  }
					  else // YY_START==ReadFuncArgDef
					  {
Dimitri van Heesch's avatar
Dimitri van Heesch committed
185 186
					    g_curArgDefValue+=*yytext;
					    g_copyArgValue=&g_curArgDefValue;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
187
					  }
188
					  g_readArgContext = YY_START; 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
189 190
					  if (*yytext=='(')
					  {
191
					    g_argRoundCount=0; 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
192 193 194 195
					    BEGIN( CopyArgRound ); 
					  }
					  else if (*yytext=='{')
					  {
Dimitri van Heesch's avatar
Dimitri van Heesch committed
196
					    g_argCurlyCount=0; 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
197 198 199 200
					    BEGIN( CopyArgCurly ); 
					  }
					  else // yytext=='<'
					  {
Dimitri van Heesch's avatar
Dimitri van Heesch committed
201
					    g_argSharpCount=0; 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
202 203 204 205
					    BEGIN( CopyArgSharp ); 
					  }
					}
<CopyArgRound,CopyArgRound2>"("		{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
206 207
  					  g_argRoundCount++;
					  *g_copyArgValue += *yytext;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
208
  					}
Dimitri van Heesch's avatar
Dimitri van Heesch committed
209 210
<CopyArgRound,CopyArgRound2>")"({B}*{ID})* {
					  *g_copyArgValue += yytext;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
211
					  if (g_argRoundCount>0) 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
212
					  {
Dimitri van Heesch's avatar
Dimitri van Heesch committed
213
					    g_argRoundCount--;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
214 215 216 217 218
					  }
					  else 
					  {
					    if (YY_START==CopyArgRound2)
					    {
Dimitri van Heesch's avatar
Dimitri van Heesch committed
219
					      *g_copyArgValue+=" "+g_curArgName;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
220
					    }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
221
					    BEGIN( g_readArgContext );
Dimitri van Heesch's avatar
Dimitri van Heesch committed
222 223 224
					  }
  					}
<CopyArgSharp>"<"			{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
225 226
  					  g_argSharpCount++;
					  *g_copyArgValue += *yytext;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
227 228
  					}
<CopyArgSharp>">"			{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
229 230 231
					  *g_copyArgValue += *yytext;
					  if (g_argSharpCount>0) g_argSharpCount--;
					  else BEGIN( g_readArgContext );
Dimitri van Heesch's avatar
Dimitri van Heesch committed
232 233
  					}
<CopyArgCurly>"{"			{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
234 235
  					  g_argCurlyCount++;
					  *g_copyArgValue += *yytext;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
236 237
  					}
<CopyArgSharp>"}"			{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
238 239 240
					  *g_copyArgValue += *yytext;
					  if (g_argCurlyCount>0) g_argCurlyCount--;
					  else BEGIN( g_readArgContext );
Dimitri van Heesch's avatar
Dimitri van Heesch committed
241 242
  					}
<CopyArgString>\\.			{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
243
					  g_curArgDefValue+=yytext;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
244 245
  					}
<CopyArgString>\"			{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
246
					  g_curArgDefValue+=*yytext;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
247 248 249 250 251
					  BEGIN( ReadFuncArgDef );
  					}
<ReadFuncArgType>"="			{
					  BEGIN( ReadFuncArgDef );
  					}
Dimitri van Heesch's avatar
Dimitri van Heesch committed
252 253 254 255 256 257 258 259 260
<ReadFuncArgType,ReadFuncArgDef>[,)>]{B}*("/*"[*!]|"//"[/!])"<" {
					  g_lastDocContext=YY_START;
					  g_lastDocChar=*yytext;  
					  QCString text=yytext;
					  if (text.find("//")!=-1)
					    BEGIN( ReadDocLine );
					  else
					    BEGIN( ReadDocBlock );
  					}
Dimitri van Heesch's avatar
Dimitri van Heesch committed
261
<ReadFuncArgType,ReadFuncArgDef>[,)>]	{
262 263 264
  					  if (*yytext==')' && g_curArgTypeName.stripWhiteSpace().isEmpty())
					  {
					    g_curArgTypeName+=*yytext;
265
					    BEGIN(FuncQual);
266 267
					  }
					  else
Dimitri van Heesch's avatar
Dimitri van Heesch committed
268
					  {
269 270 271 272 273
					    g_curArgTypeName=removeRedundantWhiteSpace(g_curArgTypeName);
					    g_curArgDefValue=g_curArgDefValue.stripWhiteSpace();
					    //printf("curArgType=`%s' curArgDefVal=`%s'\n",g_curArgTypeName.data(),g_curArgDefValue.data());
					    int l=g_curArgTypeName.length();
					    if (l>0)
274
					    {
275
					      int i=l-1;
276
					      while (i>=0 && (isspace((uchar)g_curArgTypeName.at(i)) || g_curArgTypeName.at(i)=='.')) i--;
277 278 279 280 281 282 283 284
					      while (i>=0 && isId(g_curArgTypeName.at(i))) i--;
					      //printf("g_curArgTypeName=`%s' i=%d\n",g_curArgTypeName.data(),i);
					      Argument *a = new Argument; 
					      a->attrib = g_curArgAttrib.copy();
					      //printf("a->type=%s a->name=%s i=%d l=%d\n",
					      //	a->type.data(),a->name.data(),i,l);
					      a->array.resize(0);
					      if (i==l-1 && g_curArgTypeName.at(i)==')') // function argument
285
					      {
286 287 288 289 290 291 292
						int bi=g_curArgTypeName.find('(');
						int fi=bi-1;
						//printf("func arg fi=%d\n",fi);
						while (fi>=0 && isId(g_curArgTypeName.at(fi))) fi--;
						if (fi>=0)
						{
						  a->type  = g_curArgTypeName.left(fi+1);
293
						  a->name  = g_curArgTypeName.mid(fi+1,bi-fi-1).stripWhiteSpace();
294 295 296 297 298 299 300 301 302 303
						  a->array = g_curArgTypeName.right(l-bi);
						}
						else
						{
						  a->type = g_curArgTypeName;
						}
					      }
					      else if (i>=0 && g_curArgTypeName.at(i)!=':')
					      { // type contains a name
						a->type = removeRedundantWhiteSpace(g_curArgTypeName.left(i+1));
304
						a->name = g_curArgTypeName.right(l-i-1).stripWhiteSpace();
305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320

						// if the type becomes a type specifier only then we make a mistake
						// and need to correct it to avoid seeing a nameless parameter
						// "struct A" as a parameter with type "struct" and name "A".
						int sv=0;
						if (a->type.left(6)=="const ") sv=6;
						else if (a->type.left(8)=="volatile ") sv=9;
						if (a->type.mid(sv)=="struct"    || 
						    a->type.mid(sv)=="union"     || 
						    a->type.mid(sv)=="class"     || 
						    a->type.mid(sv)=="typename"  || 
						    a->type=="const" || a->type=="volatile")
						{ 
						  a->type = a->type + " " + a->name;
						  a->name.resize(0);
						}
321
					      }
322
					      else // assume only the type was specified, try to determine name later 
323
					      {
324
						a->type = removeRedundantWhiteSpace(g_curArgTypeName);  
325
					      }
326
					      a->array  += removeRedundantWhiteSpace(g_curArgArray);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
327 328 329 330 331 332 333 334 335
					      //printf("array=%s\n",a->array.data());
					      int alen = a->array.length();
					      if (alen>2 && a->array.at(0)=='(' && 
						            a->array.at(alen-1)==')') // fix-up for int *(a[10])
					      {
						int i=a->array.find('[')-1;
						a->array = a->array.mid(1,alen-2);
						if (i>0 && a->name.isEmpty())
						{
336
						  a->name  = a->array.left(i).stripWhiteSpace();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
337 338 339
						  a->array = a->array.mid(i);
						}
					      }
340
					      a->defval = g_curArgDefValue.copy();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
341
					      //printf("a->type=%s a->name=%s a->defval=\"%s\"\n",a->type.data(),a->name.data(),a->defval.data());
342 343 344
					      a->docs   = g_curArgDocs.stripWhiteSpace();
					      //printf("Argument `%s' `%s' adding docs=`%s'\n",a->type.data(),a->name.data(),a->docs.data());
					      g_argList->append(a);
345
					    }
346 347 348 349 350 351 352 353 354
					    g_curArgAttrib.resize(0);
					    g_curArgTypeName.resize(0);
					    g_curArgDefValue.resize(0);
					    g_curArgArray.resize(0);
					    g_curArgDocs.resize(0);
					    if (*yytext==')')
					    {
					      BEGIN(FuncQual);
					      //printf(">>> end of argument list\n");
Dimitri van Heesch's avatar
Dimitri van Heesch committed
355
					    }
356
					    else
Dimitri van Heesch's avatar
Dimitri van Heesch committed
357
					    {
358
					      BEGIN( ReadFuncArgType );
Dimitri van Heesch's avatar
Dimitri van Heesch committed
359 360 361 362
					    }
					  }
  					}
<ReadFuncArgType,ReadFuncArgPtr>{ID}	{ 
363
  					  QCString name=yytext; //resolveDefines(yytext);
364 365 366 367 368
					  if (YY_START==ReadFuncArgType && g_curArgArray=="[]") // Java style array
					  {
					    g_curArgTypeName+=" []";
					    g_curArgArray.resize(0);
					  }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
369
					  //printf("resolveName `%s'->`%s'\n",yytext,name.data());
Dimitri van Heesch's avatar
Dimitri van Heesch committed
370
  					  g_curArgTypeName+=name;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
371 372
					}
<ReadFuncArgType,ReadFuncArgPtr>.	{ 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
373
  					  g_curArgTypeName+=*yytext;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
374
					}
Dimitri van Heesch's avatar
Dimitri van Heesch committed
375 376 377 378

<ReadFuncArgDef,CopyArgString>"->"|">="|">>"	{
  					  g_curArgDefValue+=yytext;
  					}
Dimitri van Heesch's avatar
Dimitri van Heesch committed
379
<ReadFuncArgDef,CopyArgString>.		{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
380
					  g_curArgDefValue+=*yytext;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
381 382
  					}
<CopyArgRound,CopyArgRound2,CopyArgSharp,CopyArgCurly>{ID}  {
383
  					  QCString name=yytext; //resolveDefines(yytext);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
384
					  *g_copyArgValue+=name;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
385 386
					}
<CopyArgRound,CopyArgRound2,CopyArgSharp,CopyArgCurly>.  {
Dimitri van Heesch's avatar
Dimitri van Heesch committed
387
					  *g_copyArgValue += *yytext;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
388 389
					}
<FuncQual>"const"		       	{ 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
390
					  g_argList->constSpecifier=TRUE;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
391 392
					}
<FuncQual>"volatile"		    	{ 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
393
					  g_argList->volatileSpecifier=TRUE;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
394 395
					}
<FuncQual>"="{B}*"0"		  	{ 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
396 397
					  g_argList->pureSpecifier=TRUE;
					}
398 399 400 401
<FuncQual>")"{B}*"["[^]]*"]"		{ // for functions returning a pointer to an array, 
                                          // i.e. ")[]" in "int (*f(int))[4]" with argsString="(int))[4]"
  					  g_extraTypeChars=yytext;
  					}
Dimitri van Heesch's avatar
Dimitri van Heesch committed
402 403 404 405 406 407 408 409 410 411
<ReadDocBlock>[^\*\n]+			{
  					  g_curArgDocs+=yytext;
  					}
<ReadDocLine>[^\n]+			{
  					  g_curArgDocs+=yytext;
  					}
<ReadDocBlock>"*/"			{ 
  					  if (g_lastDocChar!=0)
					    unput(g_lastDocChar);
  					  BEGIN(g_lastDocContext); 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
412
					}
Dimitri van Heesch's avatar
Dimitri van Heesch committed
413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431
<ReadDocLine>\n				{
  					  if (g_lastDocChar!=0)
					    unput(g_lastDocChar);
					  BEGIN(g_lastDocContext);
  					}
<ReadDocBlock>\n			{
  					  g_curArgDocs+=*yytext;
  					}
<ReadDocBlock>.				{
  					  g_curArgDocs+=*yytext;
  					}
<*>("/*"[*!]|"//"[/!])("<"?)		{
  					  g_lastDocContext=YY_START;
					  g_lastDocChar=0;  
					  if (yytext[1]=='/')
					    BEGIN( ReadDocLine );
					  else
  					    BEGIN( ReadDocBlock );
  					}
432
<*>\n
Dimitri van Heesch's avatar
Dimitri van Heesch committed
433 434 435 436 437 438 439
<*>.

%%

/* ----------------------------------------------------------------------------
 */

Dimitri van Heesch's avatar
Dimitri van Heesch committed
440 441 442 443 444
/*! Converts an argument string into an ArgumentList.
 *  \param argsString the list of Arguments.
 *  \param al a reference to resulting argument list pointer.
 */
 
445
void stringToArgumentList(const char *argsString,ArgumentList* al,QCString *extraTypeChars)
Dimitri van Heesch's avatar
Dimitri van Heesch committed
446 447
{
  if (al==0) return; 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
448
  if (argsString==0) return;
449 450 451 452 453

  g_copyArgValue=0;
  g_curArgDocs.resize(0);
  g_curArgAttrib.resize(0);
  g_curArgArray.resize(0);
454
  g_extraTypeChars.resize(0);
455 456 457 458 459
  g_argRoundCount = 0;
  g_argSharpCount = 0;
  g_argCurlyCount = 0;
  g_lastDocChar = 0;

Dimitri van Heesch's avatar
Dimitri van Heesch committed
460 461 462 463 464 465
  g_inputString   = argsString;
  g_inputPosition = 0;
  g_curArgTypeName.resize(0);
  g_curArgDefValue.resize(0);
  g_curArgName.resize(0);
  g_argList = al;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
466 467 468
  defargsYYrestart( defargsYYin );
  BEGIN( Start );
  defargsYYlex();
469
  if (extraTypeChars) *extraTypeChars=g_extraTypeChars;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
470
  //printf("stringToArgumentList(%s) result=%s\n",argsString,argListToString(al).data());
Dimitri van Heesch's avatar
Dimitri van Heesch committed
471 472
}

473
#if !defined(YY_FLEX_SUBMINOR_VERSION) 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
474 475 476
extern "C" { // some bogus code to keep the compiler happy
  void defargsYYdummy() { yy_flex_realloc(0,0); } 
}
477 478
#endif