Blame tools/wml/wmluiltok.l

Packit b099d7
%{
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
#if defined(__STDC__)
Packit b099d7
#include <string.h>
Packit b099d7
#include <stdlib.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#ifndef XmConst
Packit b099d7
#if defined(__STDC__) || !defined( NO_CONST )
Packit b099d7
#define XmConst const
Packit b099d7
#else
Packit b099d7
#define XmConst
Packit b099d7
#endif /* __STDC__ */
Packit b099d7
#endif /* XmConst */
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * lex program to construct token data for WML to generate token
Packit b099d7
	 * table data.
Packit b099d7
 	 *
Packit b099d7
	 * stdin is the file Uil.y
Packit b099d7
	 *
Packit b099d7
	 * it is searched for each occurance of a line starting with '%token'
Packit b099d7
	 * when found various fields are extracted.
Packit b099d7
	 *
Packit b099d7
	 * when Uil.y has been scanned the collected data is written
Packit b099d7
	 * to stdout.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
%}
Packit b099d7
Packit b099d7
%a 9999						/* transitions */
Packit b099d7
Packit b099d7
%{
Packit b099d7
Packit b099d7
#include <stdio.h>
Packit b099d7
Packit b099d7
#define TRUE  1
Packit b099d7
#define FALSE 0
Packit b099d7
Packit b099d7
#define MAX_SYN 10
Packit b099d7
Packit b099d7
#ifdef yywrap
Packit b099d7
#undef yywrap
Packit b099d7
#endif
Packit b099d7
Packit b099d7
typedef struct _token
Packit b099d7
{
Packit b099d7
    char * name;
Packit b099d7
    char * id;
Packit b099d7
    char * class;
Packit b099d7
    int    num_syn;
Packit b099d7
    char * syn[MAX_SYN];
Packit b099d7
}
Packit b099d7
    TokenRec, *Token;
Packit b099d7
Packit b099d7
TokenRec token[1000];
Packit b099d7
TokenRec temp;
Packit b099d7
Packit b099d7
void add_token ();
Packit b099d7
Packit b099d7
int phase		= 0;
Packit b099d7
int keyword_count;
Packit b099d7
int line_num		= 0;
Packit b099d7
int in_comment		= 0;
Packit b099d7
int in_include		= 0;
Packit b099d7
int in_token		= 0;
Packit b099d7
int state		= 0;
Packit b099d7
int used		= 0;
Packit b099d7
Packit b099d7
%}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
%%
Packit b099d7
Packit b099d7
Packit b099d7
[\n]		{
Packit b099d7
		    if (in_token == TRUE)
Packit b099d7
		    {
Packit b099d7
			add_token (&temp);
Packit b099d7
		    }
Packit b099d7
Packit b099d7
		    in_token = FALSE;
Packit b099d7
		    line_num++;
Packit b099d7
		}
Packit b099d7
Packit b099d7
[ \t]		{				/* swallow */
Packit b099d7
		} 
Packit b099d7
Packit b099d7
Packit b099d7
"/\*"		{				/* swallow */
Packit b099d7
		}
Packit b099d7
Packit b099d7
Packit b099d7
^%token		{
Packit b099d7
		    in_token = TRUE;
Packit b099d7
		    state = 0;
Packit b099d7
		}
Packit b099d7
Packit b099d7
[a-zA-Z0-9_]+	{
Packit b099d7
		    if (in_token == TRUE)
Packit b099d7
		    {
Packit b099d7
			switch (state)
Packit b099d7
			{
Packit b099d7
			    case 0:
Packit b099d7
				temp.name = (char *)
Packit b099d7
				    strcpy ((char *)
Packit b099d7
					malloc (strlen ((XmConst char *)yytext) + 1), (XmConst char *)yytext);
Packit b099d7
Packit b099d7
				temp.num_syn = 0; 
Packit b099d7
				break;
Packit b099d7
Packit b099d7
			    case 1:
Packit b099d7
				temp.id = (char *)
Packit b099d7
				    strcpy ((char *)
Packit b099d7
					malloc (strlen ((XmConst char *)yytext) + 1), (XmConst char *)yytext);
Packit b099d7
				break;
Packit b099d7
Packit b099d7
			    case 2:
Packit b099d7
				temp.class = (char *)
Packit b099d7
				    strcpy ((char *)
Packit b099d7
					malloc (strlen ((XmConst char *)yytext) + 1), (XmConst char *)yytext);
Packit b099d7
				break;
Packit b099d7
Packit b099d7
			    case 3:
Packit b099d7
				temp.syn[temp.num_syn] = (char *)
Packit b099d7
				    strcpy ((char *)
Packit b099d7
					malloc (strlen ((XmConst char *)yytext) + 1), (XmConst char *)yytext);
Packit b099d7
				temp.num_syn++;
Packit b099d7
Packit b099d7
				if (temp.num_syn > MAX_SYN)
Packit b099d7
				    printf (
Packit b099d7
					"ERROR, too many synonyms, line %d\n",
Packit b099d7
					line_num);
Packit b099d7
				break;
Packit b099d7
			}
Packit b099d7
Packit b099d7
			state++;
Packit b099d7
		    }
Packit b099d7
		}
Packit b099d7
Packit b099d7
.		{				/* swallow */
Packit b099d7
		}
Packit b099d7
Packit b099d7
%%
Packit b099d7
Packit b099d7
Packit b099d7
void
Packit b099d7
add_token (t)					/* keep sorted by name */
Packit b099d7
    Token t;
Packit b099d7
{
Packit b099d7
    int i, j;
Packit b099d7
Packit b099d7
    for (j=0; j
Packit b099d7
    {
Packit b099d7
	if (strcmp (token[j].name, t->name) > 0)	/* goes here */
Packit b099d7
  	{
Packit b099d7
	    for (i=used++; i>j; i--)		/* make hole */
Packit b099d7
		token[i] = token[i-1];
Packit b099d7
Packit b099d7
	    token[j] = *t;			/* insert it */
Packit b099d7
Packit b099d7
	    return;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * if we get there then it goes at the end of the list 
Packit b099d7
     */
Packit b099d7
Packit b099d7
    token[used++] = *t;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
int yywrap ()
Packit b099d7
{
Packit b099d7
    int i;
Packit b099d7
Packit b099d7
    for (i=0; i
Packit b099d7
	 { 
Packit b099d7
	 printf ("%s %s %s\n", token[i].name, token[i].id, token[i].class);
Packit b099d7
	 }
Packit b099d7
    return (1);
Packit b099d7
}