Blame tests/Performance/DND/lex.c

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