|
Packit |
b099d7 |
/* $XConsortium: lex.c /main/5 1995/07/15 21:01:33 drk $ */
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Motif
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Copyright (c) 1987-2012, The Open Group. All rights reserved.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are free software; you can
|
|
Packit |
b099d7 |
* redistribute them and/or modify them under the terms of the GNU
|
|
Packit |
b099d7 |
* Lesser General Public License as published by the Free Software
|
|
Packit |
b099d7 |
* Foundation; either version 2 of the License, or (at your option)
|
|
Packit |
b099d7 |
* any later version.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are distributed in the hope that
|
|
Packit |
b099d7 |
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
Packit |
b099d7 |
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
Packit |
b099d7 |
* PURPOSE. See the GNU Lesser General Public License for more
|
|
Packit |
b099d7 |
* details.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
b099d7 |
* License along with these librararies and programs; if not, write
|
|
Packit |
b099d7 |
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
Packit |
b099d7 |
* Floor, Boston, MA 02110-1301 USA
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* HISTORY
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include <stdio.h>
|
|
Packit |
b099d7 |
#include <string.h>
|
|
Packit |
b099d7 |
#include <X11/Intrinsic.h>
|
|
Packit |
b099d7 |
#include <Xm/Xm.h>
|
|
Packit |
b099d7 |
#include "y.tab.h"
|
|
Packit |
b099d7 |
#include "toolchest.h"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
extern YYSTYPE yylval;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
getstring()
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Boolean inquote = FALSE;
|
|
Packit |
b099d7 |
static Boolean firstLineChar = TRUE;
|
|
Packit |
b099d7 |
static Boolean firstTokChar;
|
|
Packit |
b099d7 |
static char newline[] = "\n";
|
|
Packit |
b099d7 |
extern char * SaveChar();
|
|
Packit |
b099d7 |
char c;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* skip white space and comments */
|
|
Packit |
b099d7 |
while ((c = NextChar()) == ' ' || c == '\t' || c == '\n' || c == '#' ||
|
|
Packit |
b099d7 |
(c == '!' && firstLineChar))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (c == '\n')
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
firstLineChar = TRUE;
|
|
Packit |
b099d7 |
yylval.string = newline;
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (c == '#' || firstLineChar && c == '!')
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
while ((c = NextChar()) != '\n' && c != EOF)
|
|
Packit |
b099d7 |
;
|
|
Packit |
b099d7 |
firstLineChar = TRUE;
|
|
Packit |
b099d7 |
yylval.string = newline;
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
firstLineChar = FALSE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
PrevChar();
|
|
Packit |
b099d7 |
firstTokChar = TRUE;
|
|
Packit |
b099d7 |
yylval.string = SaveChar();
|
|
Packit |
b099d7 |
while ((c = NextChar()) != '\0' && c != '\n' && (inquote || (c != ' ' && c != '\t')))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (c == '!' && firstTokChar)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
yylval.string = "!";
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
firstTokChar = FALSE;
|
|
Packit |
b099d7 |
if (c == '"')
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
inquote = !inquote;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (c == '\\')
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
c = NextChar();
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
NullChar();
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
int
|
|
Packit |
b099d7 |
yylex()
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
getstring();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (yylval.string[0] == '\n')
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return ('\n');
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (yylval.string[0] == '\0')
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return (0);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (yylval.string[0] == '!')
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return (F_EXEC);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if ((yylval.string[0] == 'f' || yylval.string[0] == 'F') &&
|
|
Packit |
b099d7 |
yylval.string[1] == '.')
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (strcasecmp(yylval.string+2, "exec") == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return (F_EXEC);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (strcasecmp(yylval.string+2, "checkexec") == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return (F_CHECKEXEC);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (strcasecmp(yylval.string+2, "checkexpr") == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return (F_CHECKEXPR);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (strcasecmp(yylval.string+2, "separator") == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return (F_SEPARATOR);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (strcasecmp(yylval.string+2, "menu") == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return (F_MENU);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (strcasecmp(yylval.string+2, "label") == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return (F_LABEL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (strcasecmp(yylval.string+2, "title") == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return (F_TITLE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
FileError ("unknown f function %s\n", yylval.string+2);
|
|
Packit |
b099d7 |
return (STRING);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (strcasecmp(yylval.string, "menu") == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return (MENU);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (strcasecmp(yylval.string, "sinclude") == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return (SINCLUDE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (strcasecmp(yylval.string, "include") == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return (INCLUDE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (strcasecmp(yylval.string, "remove") == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return (REMOVE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (strcasecmp(yylval.string, "from") == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return (FROM);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if ((yylval.string[0] == '{' || yylval.string[0] == '}') &&
|
|
Packit |
b099d7 |
yylval.string[1] == '\0')
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return (yylval.string[0]);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return (STRING);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* internal routine to remove quotes from string */
|
|
Packit |
b099d7 |
static char *
|
|
Packit |
b099d7 |
realUnquoteString(char *string)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register char *p, *q;
|
|
Packit |
b099d7 |
char *ret;
|
|
Packit |
b099d7 |
Boolean quoted=FALSE;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ret = (char *)tcMalloc(strlen(string)+1);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
p = string;
|
|
Packit |
b099d7 |
q = ret;
|
|
Packit |
b099d7 |
do
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (*p == '\\')
|
|
Packit |
b099d7 |
/* skip it */;
|
|
Packit |
b099d7 |
else if (*p == '"')
|
|
Packit |
b099d7 |
quoted = !quoted;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
*q++ = *p;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
while (*p++ != '\0');
|
|
Packit |
b099d7 |
return (ret);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* if the string has no quotes, just return the string itself.
|
|
Packit |
b099d7 |
* if it is a simple string with beginning and ending quotes, Null out
|
|
Packit |
b099d7 |
* the beginning and ending quotes and return it.
|
|
Packit |
b099d7 |
* if it is complexly quoted, tcMalloc a new string and return it.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
char *
|
|
Packit |
b099d7 |
UnquoteString(char *string)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* check for embedded backslash */
|
|
Packit |
b099d7 |
if (strchr(string, '\\'))
|
|
Packit |
b099d7 |
return (realUnquoteString(string));
|
|
Packit |
b099d7 |
/* check for simply quoted string */
|
|
Packit |
b099d7 |
if (string[0] == '"' && string[strlen(string)-1] == '"')
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* remove the quotes */
|
|
Packit |
b099d7 |
string++;
|
|
Packit |
b099d7 |
string[strlen(string)-1] = '\0';
|
|
Packit |
b099d7 |
if (strchr(string, '"'))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* it has an embeeded quote. undo damage and dequote the string */
|
|
Packit |
b099d7 |
string[strlen(string)-1] = '"';
|
|
Packit |
b099d7 |
string--;
|
|
Packit |
b099d7 |
return (realUnquoteString(string));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
/* no embedded quotes; return the string with quotes removed */
|
|
Packit |
b099d7 |
return (string);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (strchr(string, '"'))
|
|
Packit |
b099d7 |
return (realUnquoteString(string));
|
|
Packit |
b099d7 |
/* unquoted string, return it */
|
|
Packit |
b099d7 |
return (string);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|