2004-11-02 09:49:47 -06:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
|
|
|
* $RCSfile: hidclex.l,v $
|
|
|
|
*
|
2005-06-20 09:02:09 -05:00
|
|
|
* $Revision: 1.4 $
|
2004-11-02 09:49:47 -06:00
|
|
|
*
|
2005-06-20 09:02:09 -05:00
|
|
|
* last change: $Author: rt $ $Date: 2005-06-20 15:02:09 $
|
2004-11-02 09:49:47 -06:00
|
|
|
*
|
|
|
|
* The Contents of this file are made available subject to the terms of
|
|
|
|
* either of the following licenses
|
|
|
|
*
|
|
|
|
* - GNU Lesser General Public License Version 2.1
|
|
|
|
* - Sun Industry Standards Source License Version 1.1
|
|
|
|
*
|
|
|
|
* Sun Microsystems Inc., October, 2000
|
|
|
|
*
|
|
|
|
* GNU Lesser General Public License Version 2.1
|
|
|
|
* =============================================
|
|
|
|
* Copyright 2000 by Sun Microsystems, Inc.
|
|
|
|
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License version 2.1, as published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
|
|
* MA 02111-1307 USA
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* Sun Industry Standards Source License Version 1.1
|
|
|
|
* =================================================
|
|
|
|
* The contents of this file are subject to the Sun Industry Standards
|
|
|
|
* Source License Version 1.1 (the "License"); You may not use this file
|
|
|
|
* except in compliance with the License. You may obtain a copy of the
|
|
|
|
* License at http://www.openoffice.org/license.html.
|
|
|
|
*
|
|
|
|
* Software provided under this License is provided on an "AS IS" basis,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
|
|
|
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
|
|
|
|
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
|
|
|
|
* See the License for the specific provisions governing your rights and
|
|
|
|
* obligations concerning the Software.
|
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
|
|
|
|
*
|
|
|
|
* Copyright: 2000 by Sun Microsystems, Inc.
|
|
|
|
*
|
|
|
|
* All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s): _______________________________________
|
|
|
|
*
|
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
%{
|
|
|
|
|
2005-06-20 09:02:09 -05:00
|
|
|
static char *Revision = "$Revision: 1.4 $" ;
|
2004-11-02 09:49:47 -06:00
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
XX XX XXXX XXXXXX
|
|
|
|
XX XX XX XX XX
|
|
|
|
XX XX XX XX XX
|
|
|
|
XXXXXX XX XX XX
|
|
|
|
XX XX XX XX XX
|
|
|
|
XX XX XX XX XX
|
|
|
|
XX XX XXXX XXXXXX
|
|
|
|
|
|
|
|
|
|
|
|
XXXX XX XXX
|
|
|
|
XX XX XX
|
|
|
|
XX XXXX XXX XX XX XXX XXX XX XXXXX XX XXX
|
|
|
|
XX XX XX XX X XX XX XX XX XX XX X XXX XX
|
|
|
|
XX X XX XX XX X XX XX XX XX XX XXXXXXX XX
|
|
|
|
XX XX XX XX XX XX XXXXX XX XX XX XX
|
|
|
|
XXXX XXXX XXX XXX XX XXXX XXXX XXXXX XXXX
|
|
|
|
XXXX
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/* length of buffer for reading with lex */
|
|
|
|
/**/
|
|
|
|
/* enlarge token buffer to tokenize whole strings */
|
|
|
|
#undef YYLMAX
|
|
|
|
#define YYLMAX 64000
|
|
|
|
|
|
|
|
int exclude_bracelevel=0; /* count braces in that start state */
|
|
|
|
static YY_BUFFER_STATE InputFiles[127]; // for recursive parse
|
|
|
|
static int nInputFileDepth = 0;
|
|
|
|
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include <ctype.h>
|
|
|
|
|
|
|
|
char* lower(char* str)
|
|
|
|
{
|
|
|
|
size_t s= strlen(str);
|
|
|
|
size_t i=0;
|
|
|
|
while( i < s ){
|
|
|
|
str[i] = tolower( str[i] );
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
|
|
|
int alloc_cnt = 0;
|
|
|
|
void freestring( char* ); //forward
|
|
|
|
|
|
|
|
char* dot2underline( char* str )
|
|
|
|
{
|
|
|
|
size_t len=strlen(str);
|
|
|
|
for( size_t i=0; i<len; i++ )
|
|
|
|
if( str[i]=='.' ) str[i]='_';
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
|
|
|
void dotappend( char*& base, char* suffix )
|
|
|
|
{
|
|
|
|
// append like "str.suffix" if suffix else "str"
|
|
|
|
|
|
|
|
if( suffix == NULL )
|
|
|
|
return ;
|
|
|
|
|
|
|
|
size_t siz;
|
|
|
|
if( (siz=strlen(suffix)) == 0 )
|
|
|
|
return ;
|
|
|
|
|
|
|
|
size_t siz2 = base==NULL ? 0 : strlen(base);
|
|
|
|
|
|
|
|
char* newstr;
|
|
|
|
|
|
|
|
{//do never forget to increment/decrement alloc_cnt
|
|
|
|
newstr = (char*) malloc( (siz2+siz+1) +1 /*for "." */ );
|
|
|
|
alloc_cnt++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( newstr == NULL )
|
|
|
|
fprintf( stderr,"error: dotappend() could not malloc() \n"), exit(1);
|
|
|
|
|
|
|
|
if( base ) {
|
|
|
|
strcpy( newstr, base );
|
|
|
|
freestring( base );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
newstr[0] = '\0';
|
|
|
|
|
|
|
|
strcat( newstr, "." );
|
|
|
|
strcat( newstr, suffix );
|
|
|
|
base = newstr;
|
|
|
|
}
|
|
|
|
|
|
|
|
void dotsubtract( char*& base, char* suffix )
|
|
|
|
{
|
|
|
|
// remove dotted suffix from base.suffix --> base
|
|
|
|
|
|
|
|
if( base == NULL || suffix == NULL )
|
|
|
|
return;
|
|
|
|
if( strlen(suffix) == 0 )
|
|
|
|
return;
|
|
|
|
if( (strlen(suffix)+1) > strlen(base) )
|
|
|
|
return;
|
|
|
|
char* pos=strstr( base, suffix);
|
|
|
|
if( pos && (pos-1 >= base) && ( *(pos-1) == '.') )
|
|
|
|
if( *(pos+strlen(suffix)) == '\0' ) //only if at end of base
|
|
|
|
*(pos-1)= '\0';
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
int level = 0;
|
|
|
|
char levelbuffer[512];
|
|
|
|
|
|
|
|
void adjust_levelbuffer()
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i=0; i<level;i++) {
|
|
|
|
levelbuffer[i] = '\t';
|
|
|
|
}
|
|
|
|
levelbuffer[i] = '\0';
|
|
|
|
}
|
|
|
|
|
|
|
|
void freestring( char* ptr )
|
|
|
|
{
|
|
|
|
alloc_cnt--;
|
|
|
|
adjust_levelbuffer();
|
|
|
|
//fprintf(stderr,"%sinfo: freestring line %d\n",levelbuffer, __LINE__);
|
|
|
|
free(ptr), ptr = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void makestring(char** newstr, char* oldstr)
|
|
|
|
{
|
|
|
|
alloc_cnt++;
|
|
|
|
adjust_levelbuffer();
|
|
|
|
/*
|
|
|
|
fprintf(stderr,"%sinfo: makestring on line %d\n",levelbuffer,__LINE__);
|
|
|
|
*/
|
|
|
|
strcpy( (*newstr=(char*)malloc(strlen(oldstr)+1)), oldstr);
|
|
|
|
if( *newstr==NULL ) {
|
|
|
|
fprintf( stderr,
|
|
|
|
"error: cannot malloc for makestring() alloc_cnt==%d \n", alloc_cnt);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int strncmpi(char* stra, char* strb, size_t cnt)
|
|
|
|
{
|
|
|
|
// like strncmp() but case insensitive
|
|
|
|
size_t i;
|
|
|
|
char a,b;
|
|
|
|
for(i=0;i<cnt;i++){
|
|
|
|
a = tolower(stra[i]);
|
|
|
|
b = tolower(strb[i]);
|
|
|
|
if( a < b )
|
|
|
|
return -1;
|
|
|
|
if( a > b )
|
|
|
|
return 1;
|
|
|
|
if( a == '\0' && b == '\0' )
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifndef WNT
|
|
|
|
int strcmpi(char* stra, char* strb)
|
|
|
|
{
|
|
|
|
// like strcmp() but case insensitive
|
|
|
|
size_t i;
|
|
|
|
char a,b;
|
|
|
|
for(i=0; ;i++){
|
|
|
|
a = tolower(stra[i]);
|
|
|
|
b = tolower(strb[i]);
|
|
|
|
if( a < b )
|
|
|
|
return -1;
|
|
|
|
if( a > b )
|
|
|
|
return 1;
|
|
|
|
if( a == '\0' && b == '\0' )
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* variables for listfile ( with project + pathname of src file ) */
|
|
|
|
char* listfilename;
|
|
|
|
#define MAXSRCFILES 2048
|
|
|
|
char* filename_tab[MAXSRCFILES];
|
|
|
|
char* project_tab[MAXSRCFILES];
|
|
|
|
int tab_entries = 0;
|
|
|
|
//int fileno = 0; /* currently used filenumber */
|
|
|
|
|
|
|
|
/* globale variablen */
|
|
|
|
FILE* outfile;
|
|
|
|
char *filename = ""; //incl. path
|
|
|
|
//char *basename = "";
|
|
|
|
char *project = "";
|
|
|
|
char *subpath = ""; //from project name downwards like source\ui\xxx.src
|
|
|
|
|
|
|
|
int firstprint = 1;
|
|
|
|
|
|
|
|
int in_define = 0;
|
|
|
|
|
|
|
|
/*char* get_basename(char* dospath)
|
|
|
|
{
|
|
|
|
|
|
|
|
char* pos = strrchr( dospath, '\\' );
|
|
|
|
return pos==NULL ? dospath : (pos+1); // drive letter remains(sorry)
|
|
|
|
} */
|
|
|
|
|
|
|
|
char* get_subpath(char* project, char* dospath)
|
|
|
|
{
|
|
|
|
char* start;
|
|
|
|
if( (start=strstr(dospath,project)) == NULL )
|
|
|
|
return dospath;
|
|
|
|
else
|
|
|
|
return start+strlen(project)+1;
|
|
|
|
//in ausnahmefalle zu ungenau, rechts weiter suchen
|
|
|
|
}
|
|
|
|
|
|
|
|
class ident_ring
|
|
|
|
{
|
|
|
|
#define MAXRING 2
|
|
|
|
//nicht aendern wg externer Abfrage ->size() == 2
|
|
|
|
|
|
|
|
char* ring[MAXRING];
|
|
|
|
int ringpos;
|
|
|
|
int last;
|
|
|
|
int broken;
|
|
|
|
public:
|
|
|
|
ident_ring() {
|
|
|
|
last = ringpos = -1;
|
|
|
|
for(int i=0; i<MAXRING;i++)
|
|
|
|
ring[i]=NULL;
|
|
|
|
broken = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void set_zero() {
|
|
|
|
last = ringpos = -1;
|
|
|
|
for(int i=0; i<MAXRING;i++) {
|
|
|
|
if( ring[i] != NULL )
|
|
|
|
freestring( ring[i] );
|
|
|
|
ring[i]=NULL;
|
|
|
|
}
|
|
|
|
broken = 0;
|
|
|
|
}
|
|
|
|
void set_broken() { broken = 1; }
|
|
|
|
int size() {
|
|
|
|
if( ringpos == -1 )
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
if( broken) {
|
|
|
|
if( ringpos==0 )
|
|
|
|
return 0;
|
|
|
|
else
|
|
|
|
return 1;
|
|
|
|
} else {
|
|
|
|
if( ringpos==0 )
|
|
|
|
return 1;
|
|
|
|
else
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
char* extract_last(){
|
|
|
|
if( last == -1 ) {
|
|
|
|
return NULL;
|
|
|
|
} else {
|
|
|
|
char* ttt=ring[last];
|
|
|
|
ring[last]=NULL;
|
|
|
|
return ttt;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
char* extract_actual() {
|
|
|
|
if(ringpos == -1) {
|
|
|
|
return NULL;
|
|
|
|
} else {
|
|
|
|
char *ttt=ring[ringpos];
|
|
|
|
ring[ringpos]=NULL;
|
|
|
|
return ttt;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void set(char* id) {
|
|
|
|
ringpos= (++ringpos) % MAXRING;
|
|
|
|
if( ring[ringpos] != NULL )
|
|
|
|
freestring( ring[ringpos] ); /*otherwise: memory lost*/
|
|
|
|
ring[ ringpos ] = id;
|
|
|
|
//fprintf(stderr,
|
|
|
|
// "info: ring[%d] == %s broken==%d \n"
|
|
|
|
// ,ringpos,ring[ringpos],broken
|
|
|
|
// );
|
|
|
|
|
|
|
|
if( !(ringpos==0 && last==-1) )
|
|
|
|
last = (++last) % MAXRING;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/* Notnagel: die letzten identifier/number merken, fuer klasse & globalID */
|
|
|
|
ident_ring *ring;
|
|
|
|
|
|
|
|
//
|
|
|
|
typedef int token;
|
|
|
|
//
|
|
|
|
#define TOK_SEMICOLON ';'
|
|
|
|
#define TOK_EQUAL '='
|
|
|
|
#define TOK_OPENBRACKET '['
|
|
|
|
#define TOK_CLOSEBRACKET ']'
|
|
|
|
#define TOK_OPENBRACE '{'
|
|
|
|
#define TOK_CLOSEBRACE '}'
|
|
|
|
#define TOK_KOMMA ','
|
|
|
|
#define TOK_LESS '<'
|
|
|
|
#define TOK_GREATER '>'
|
|
|
|
#define TOK_OPENPAREN '('
|
|
|
|
#define TOK_CLOSEPAREN ')'
|
|
|
|
#define TOK_PLUS '+'
|
|
|
|
#define TOK_MINUS '-'
|
|
|
|
#define TOK_STAR '*'
|
|
|
|
#define TOK_SLASH '/'
|
|
|
|
//
|
|
|
|
#define TOK_POSorSIZE 146
|
|
|
|
#define TOK_POSSIZE 147
|
|
|
|
#define TOK_TEXTTAG 148
|
|
|
|
#define TOK_IDNUM 149
|
|
|
|
//
|
|
|
|
#define TOK_EXTRADATA 151
|
|
|
|
#define TOK_TEXT 152
|
|
|
|
#define TOK_MESSAGE 153
|
|
|
|
#define TOK_HELPTEXT 154
|
|
|
|
#define TOK_TRUE 155
|
|
|
|
#define TOK_FALSE 156
|
|
|
|
//
|
|
|
|
#define TOK_RESID 180
|
|
|
|
//
|
|
|
|
#define TOK_STRING 190
|
|
|
|
//
|
|
|
|
#define TOK_INVALID (-1)
|
|
|
|
|
|
|
|
token lasttoken = TOK_INVALID;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define UNDEF (-1)
|
|
|
|
|
|
|
|
char *globalID = "";
|
|
|
|
char *globalKLASSE = NULL;
|
|
|
|
|
|
|
|
void reset_globalID() {
|
|
|
|
//
|
|
|
|
if( globalID && (strlen(globalID) > 0 ) ) {
|
|
|
|
freestring( globalID );
|
|
|
|
globalID = "";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
class resource
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
resource ( const resource& ); //copy-ctor soll keiner benutzen
|
|
|
|
void operator=( const resource& ); // zuweisung auch nicht
|
|
|
|
public:
|
|
|
|
resource();
|
|
|
|
~resource();
|
|
|
|
public:
|
|
|
|
int lineno;
|
|
|
|
token lasttoken; //before opening {
|
|
|
|
char *klasse ;
|
|
|
|
char *localID;
|
|
|
|
char *helpID;
|
|
|
|
int residfound;
|
|
|
|
};
|
|
|
|
|
|
|
|
resource *ares ; /* aktuell bearbeitete resource */
|
|
|
|
|
|
|
|
resource::~resource()
|
|
|
|
{
|
|
|
|
if( klasse != NULL ) freestring(klasse);
|
|
|
|
if( localID != NULL ) freestring(localID);
|
|
|
|
if( helpID != NULL ) freestring(helpID);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
resource::resource()
|
|
|
|
{
|
|
|
|
lineno = UNDEF;
|
|
|
|
lasttoken= TOK_INVALID;
|
|
|
|
klasse = NULL ;
|
|
|
|
localID = NULL ;
|
|
|
|
helpID = NULL ;
|
|
|
|
residfound= 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int residfound = 0; // "Identifier = " auf momentanem level gefunden
|
|
|
|
|
|
|
|
#define MAXSTACK 32
|
|
|
|
resource* stack[MAXSTACK]; /* resource stack */
|
|
|
|
#define EMPTYSTACK (-1)
|
|
|
|
int stackptr = EMPTYSTACK;
|
|
|
|
|
|
|
|
void push_resource( resource* r )
|
|
|
|
{
|
|
|
|
stackptr++;
|
|
|
|
if( stackptr >= MAXSTACK ) {
|
|
|
|
fprintf( stderr, "error: resource stack is full %d \n", stackptr);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
stack[ stackptr ] = r;
|
|
|
|
}
|
|
|
|
|
|
|
|
resource* pop_resource()
|
|
|
|
{
|
|
|
|
if( stackptr < 0 ) {
|
|
|
|
fprintf( stderr, "error: pop resource from empty stack \n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
return stack[ stackptr-- ];
|
|
|
|
}
|
|
|
|
|
|
|
|
void delete_stack()
|
|
|
|
{
|
|
|
|
while( stackptr > EMPTYSTACK )
|
|
|
|
delete pop_resource();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* forward */
|
|
|
|
int eat_comment();
|
|
|
|
int eat_cpp_comment();
|
|
|
|
int eat_preprocessor_lines();
|
|
|
|
int readlistfile();
|
|
|
|
|
|
|
|
/*===================================================*/
|
|
|
|
//
|
|
|
|
// '+' im identifier wg basic\source\classes\sb.src
|
|
|
|
//
|
|
|
|
// '<' im identifier wg sc subtdlg.src
|
|
|
|
//
|
|
|
|
// '&' im identifier wg scerror.src so2..nocode.src svxerr.src scwarngs.src
|
|
|
|
|
|
|
|
|
|
|
|
//string (\"[^"]*\") alter einfacher string ohne "
|
|
|
|
|
|
|
|
%}
|
|
|
|
|
|
|
|
simple ([^\n\"]*)
|
|
|
|
%p 7000
|
|
|
|
string \"{simple}((((\\\\)*(\\\"))?){simple})*\"
|
|
|
|
|
|
|
|
%x MACRO_STATE
|
|
|
|
|
|
|
|
%x EXCLUDE_STATE
|
|
|
|
resfilelist ([Ff][Ii][Ll][Ee][Ll][Ii][Ss][Tt])
|
|
|
|
resstringlist ([Ss][Tt][Rr][Ii][Nn][Gg][Ll][Ii][Ss][Tt])
|
|
|
|
resstring ([Ss][Tt][Rr][Ii][Nn][Gg])
|
|
|
|
|
|
|
|
identifier ([a-z_A-Z]+[a-z_A-Z<+&0-9]*)
|
|
|
|
number (([0-9]+)|(0x[0-9a-fA-F]+))
|
|
|
|
residentifier ([Ii][Dd][Ee][Nn][Tt][Ii][Ff][Ii][Ee][Rr])
|
|
|
|
w ([ \t\n]*)
|
|
|
|
wspecial ([\\ \t\n]*)
|
|
|
|
texttag (([Tt][Ii][Tt][Ll][Ee])|([Tt][Ee][Xx][Tt])|([Mm][Ee][Ss][Ss][Aa][Gg][Ee]))
|
|
|
|
qhelptag (([Qq][Uu][Ii][Cc][Kk])?([Hh][Ee][Ll][Pp][Tt][Ee][Xx][Tt]))
|
|
|
|
langtag ([a-zA-Z_]+)
|
|
|
|
helptag ([Hh][Ee][Ll][Pp][Ii][Dd])
|
|
|
|
helpid ([a-zA-Z_0-9]+)
|
|
|
|
num2tag (([Pp][Oo][Ss])|([Ss][Ii][Zz][Ee]))
|
|
|
|
num4tag (([Pp][Oo][Ss][Ss][Ii][Zz][Ee]))
|
|
|
|
|
|
|
|
%%
|
|
|
|
[ \t] {
|
|
|
|
/* forget whitespace */;
|
|
|
|
}
|
|
|
|
|
|
|
|
^[ \t]*#include.*\.src[">].* {
|
|
|
|
char NewFile[255]; //long names???
|
|
|
|
int i, j, GetIt;
|
|
|
|
|
|
|
|
GetIt = 0;
|
|
|
|
j = 0;
|
|
|
|
nInputFileDepth++;
|
|
|
|
// nicht schoen aber geht...
|
|
|
|
for (i = 0; yytext[i+1] != 0; i++)
|
|
|
|
{
|
|
|
|
if ( GetIt == 1 )
|
|
|
|
{
|
|
|
|
if ( yytext[i] == '"' || yytext[i] == '>' )
|
|
|
|
GetIt = 0;
|
|
|
|
else
|
|
|
|
NewFile[j++] = yytext[i];
|
|
|
|
}
|
|
|
|
if ( yytext[i] == '"' || yytext[i] == '<' )
|
|
|
|
GetIt = 1;
|
|
|
|
}
|
|
|
|
NewFile[j] = '\0';
|
|
|
|
FILE* pFile = NULL;
|
|
|
|
pFile = fopen( NewFile, "r" );
|
|
|
|
if( pFile == NULL ) {
|
|
|
|
fprintf( stderr, "warning: could not open inputfile %s \n", NewFile );
|
|
|
|
// try the new *_tmpl.src version instead
|
|
|
|
// this hack was introduced to allow localisation of included src files
|
|
|
|
const char* sStrTmpl = "_tmpl";
|
|
|
|
j -= 4;
|
|
|
|
for ( i = 0 ; i <5 ; i++,j++ )
|
|
|
|
{
|
|
|
|
NewFile[j+5] = NewFile[j];
|
|
|
|
NewFile[j] = sStrTmpl[i];
|
|
|
|
}
|
|
|
|
NewFile[j+4] = '\0';
|
|
|
|
fprintf( stderr, "trying inputfile %s \n", NewFile );
|
|
|
|
pFile = fopen( NewFile, "r" );
|
|
|
|
if( pFile == NULL ) {
|
|
|
|
fprintf( stderr, "error: could not open inputfile %s \n", NewFile );
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
InputFiles[ nInputFileDepth ] = yy_create_buffer( pFile, YY_BUF_SIZE );
|
|
|
|
yy_switch_to_buffer( InputFiles[ nInputFileDepth ] );
|
|
|
|
|
|
|
|
printf( "%s //ATTENTION!! %s gets included here\n", yytext, NewFile );
|
|
|
|
fprintf( outfile, "// %s //ATTENTION!! %s gets included here\n\n", yytext, NewFile );
|
|
|
|
}
|
|
|
|
|
|
|
|
^[ \t]*#include.* {
|
|
|
|
fprintf( outfile, "%s\n\n", yytext );
|
|
|
|
}
|
|
|
|
|
|
|
|
^[ \t]*#(if|ifdef|ifndef|elif).* {
|
|
|
|
;
|
|
|
|
}
|
|
|
|
|
|
|
|
^[ \t]*#else {
|
|
|
|
;
|
|
|
|
}
|
|
|
|
^[ \t]*#endif {
|
|
|
|
;
|
|
|
|
}
|
|
|
|
|
|
|
|
^[ \t]*#(undef|error|pragma).* {
|
|
|
|
;
|
|
|
|
}
|
|
|
|
|
|
|
|
^[ \t]*#define {
|
|
|
|
fprintf( outfile, "%s", yytext );
|
|
|
|
BEGIN MACRO_STATE;
|
|
|
|
}
|
|
|
|
|
|
|
|
<INITIAL,MACRO_STATE>"/*" {
|
|
|
|
eat_comment();
|
|
|
|
}
|
|
|
|
|
|
|
|
<INITIAL,MACRO_STATE>"//" {
|
|
|
|
eat_cpp_comment();
|
|
|
|
}
|
|
|
|
|
|
|
|
<MACRO_STATE>\n {
|
|
|
|
fprintf( outfile, "%s\n", yytext );
|
|
|
|
BEGIN INITIAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
<MACRO_STATE>\\\n {
|
|
|
|
fprintf( outfile, "\\\n" );
|
|
|
|
;/* macro schadet nicht, koennte gebraucht werden */
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
<MACRO_STATE>. {
|
|
|
|
fprintf( outfile, "%s", yytext );
|
|
|
|
;/* ignore all this unused input */
|
|
|
|
}
|
|
|
|
|
|
|
|
";" {ring->set_zero(); lasttoken = TOK_SEMICOLON; }
|
|
|
|
"=" {ring->set_zero(); lasttoken = TOK_EQUAL; }
|
|
|
|
"[" {ring->set_broken(); lasttoken = TOK_OPENBRACKET; }
|
|
|
|
"]" {ring->set_broken(); lasttoken = TOK_CLOSEBRACKET; }
|
|
|
|
|
|
|
|
|
|
|
|
<EXCLUDE_STATE>"{" {
|
|
|
|
exclude_bracelevel += 1;
|
|
|
|
//fprintf( stderr,"info: lev %d : found {\n", exclude_bracelevel );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
\\\n |
|
|
|
|
"{" {
|
|
|
|
// define continues
|
|
|
|
// or a brace opens a block
|
|
|
|
|
|
|
|
if( in_define && !strcmp(yytext,"\\\n") ) {
|
|
|
|
|
|
|
|
if( in_define++ == 1 )
|
|
|
|
;// keep on working
|
|
|
|
else
|
|
|
|
goto blockend;
|
|
|
|
}
|
|
|
|
|
|
|
|
level++;
|
|
|
|
if( ares != NULL ){
|
|
|
|
if( level > 1 )
|
|
|
|
dotappend( globalID, ares->localID );
|
|
|
|
ares->residfound = residfound;
|
|
|
|
push_resource( ares );
|
|
|
|
}
|
|
|
|
ares = new resource;
|
|
|
|
|
|
|
|
residfound = 0;
|
|
|
|
ares->residfound = 0;
|
|
|
|
|
|
|
|
ares->lineno = yylineno;
|
|
|
|
ares->lasttoken = lasttoken;
|
|
|
|
if( ring->size() == 2 ) {
|
|
|
|
ares->klasse = ring->extract_last();
|
|
|
|
ares->localID = ring->extract_actual();
|
|
|
|
} else if(ring->size() == 1) {
|
|
|
|
ares->klasse = ring->extract_actual();
|
|
|
|
}
|
|
|
|
if( level==1 ){ //Ausnahme: Resource auf Ebene 1
|
|
|
|
globalID= ares->localID;
|
|
|
|
ares->localID = NULL;
|
|
|
|
globalKLASSE= ares->klasse;
|
|
|
|
}
|
|
|
|
|
|
|
|
//fprintf(stderr,"info: { level: %d\n", level);
|
|
|
|
//
|
|
|
|
|
|
|
|
lasttoken = TOK_OPENBRACE;
|
|
|
|
ring->set_zero();
|
|
|
|
}
|
|
|
|
|
|
|
|
<EXCLUDE_STATE>"}" {
|
|
|
|
//-----------------------------
|
|
|
|
exclude_bracelevel -= 1;
|
|
|
|
//fprintf( stderr,"info: lev %d : found }\n", exclude_bracelevel );
|
|
|
|
if( exclude_bracelevel==1 ) {
|
|
|
|
BEGIN INITIAL;
|
|
|
|
exclude_bracelevel=0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
\n |
|
|
|
|
"}" {
|
|
|
|
//fprintf(stderr,"info: } level: %d\n",level);
|
|
|
|
|
|
|
|
if( !strcmp(yytext,"}") )
|
|
|
|
;
|
|
|
|
else if( in_define && (!strcmp(yytext,"\n") )) {
|
|
|
|
if( in_define==1 ) {
|
|
|
|
//no continuation line for #define
|
|
|
|
in_define=0;
|
|
|
|
goto blockend;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
//there was a continuation line for #define
|
|
|
|
in_define=0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
goto blockend;
|
|
|
|
|
|
|
|
// ares ausgeben
|
|
|
|
if( ares != NULL ) {
|
|
|
|
|
|
|
|
#define LEER (char*)"leer"
|
|
|
|
char* globklasse = globalKLASSE==NULL ? LEER:globalKLASSE;
|
|
|
|
char* local = ares->localID==NULL ? LEER:ares->localID;
|
|
|
|
char* klasse= ares->klasse==NULL ? LEER:ares->klasse;
|
|
|
|
char* glob = globalID==NULL ? LEER:globalID;
|
|
|
|
|
|
|
|
|
|
|
|
//wg. Starview-Klasse String in ehdl.c und doc.c
|
|
|
|
// wenn generierte C++-Quellen compiliert werden
|
|
|
|
//
|
|
|
|
//if( !strcmp(globklasse,"String" )) globklasse = "string";
|
|
|
|
//if( !strcmp(klasse,"String" )) klasse = "string";
|
|
|
|
|
|
|
|
|
|
|
|
//---------------------------------------------------
|
|
|
|
// generate the body of a new C main program,
|
|
|
|
// which is filled with printf statements
|
|
|
|
// to compute (via preproseccor & compiler)
|
|
|
|
// the codenumbers for resource names like menu$RID_SVX$xyz
|
|
|
|
|
|
|
|
if( firstprint ) {
|
|
|
|
firstprint=0;
|
|
|
|
fprintf(outfile, "#include \"starview.hid\" \n\n");
|
2005-06-20 09:02:09 -05:00
|
|
|
fprintf(outfile, " int main() { \n\n\n");
|
2004-11-02 09:49:47 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
char globunder[256];
|
|
|
|
strcpy(globunder,glob);
|
|
|
|
dot2underline( globunder );
|
|
|
|
char* globsuffix = strrchr(glob,'.');
|
|
|
|
globsuffix = globsuffix==NULL ? glob:globsuffix+1;
|
|
|
|
|
|
|
|
if( ares->helpID ) {
|
|
|
|
fprintf( outfile,"\n\t printf(\"%s \\t %cs %cu \\n\",\n",
|
|
|
|
ares->helpID,'%','%');
|
|
|
|
fprintf(outfile,"\t\"HelpID\", (%s) ); \n", ares->helpID);
|
|
|
|
}
|
|
|
|
else if( ares->localID ) {
|
|
|
|
fprintf( outfile,"\n\t printf(\"%s:%s:%s:%s \\t %cs %cu %cs %cu \\n\",\n",
|
|
|
|
project,klasse,globunder,local,'%','%','%','%');
|
|
|
|
fprintf( outfile,"\t\"Norm %s\", (%s), \"%s\", (%s) );\n",
|
|
|
|
globklasse,globsuffix, klasse,local);
|
|
|
|
}
|
|
|
|
else if( (strcmpi("MenuItem",klasse)==0) ||
|
|
|
|
(strcmpi("ToolBoxItem",klasse)==0) ) {
|
|
|
|
; //no output (99% is a separator)
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
fprintf( outfile,"\n\t printf(\"%s:%s:%s \\t %cs %cu %cs \\n\",\n",
|
|
|
|
project,klasse,globunder,'%','%','%');
|
|
|
|
fprintf( outfile,"\t\"Norm %s\", (%s), \"%s\" );\n",
|
|
|
|
globklasse,globsuffix, klasse);
|
|
|
|
}
|
|
|
|
|
|
|
|
delete ares;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ein level zurueck
|
|
|
|
if( level == 1) {
|
|
|
|
reset_globalID();
|
|
|
|
globalKLASSE = NULL;
|
|
|
|
}
|
|
|
|
level--;
|
|
|
|
ares = pop_resource();
|
|
|
|
residfound = ares->residfound;
|
|
|
|
dotsubtract( globalID, ares->localID );
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
lasttoken = TOK_CLOSEBRACE;
|
|
|
|
ring->set_zero();
|
|
|
|
blockend: ;
|
|
|
|
}
|
|
|
|
|
|
|
|
"," {ring->set_broken(); lasttoken = TOK_KOMMA; }
|
|
|
|
|
|
|
|
"<" {ring->set_broken(); lasttoken = TOK_LESS; }
|
|
|
|
">" {ring->set_broken(); lasttoken = TOK_GREATER; }
|
|
|
|
|
|
|
|
"(" {ring->set_broken(); lasttoken = TOK_OPENPAREN; }
|
|
|
|
")" {ring->set_broken(); lasttoken = TOK_CLOSEPAREN; }
|
|
|
|
"+" {ring->set_broken(); lasttoken = TOK_PLUS; }
|
|
|
|
"-" {ring->set_broken(); lasttoken = TOK_MINUS; }
|
|
|
|
"*" {ring->set_broken(); lasttoken = TOK_STAR; }
|
|
|
|
"/" {ring->set_broken(); lasttoken = TOK_SLASH; }
|
|
|
|
|
|
|
|
|
|
|
|
{helptag}{w}"="{w}{helpid}{w}";" {
|
|
|
|
|
|
|
|
// extract text for helpid and put to ares
|
|
|
|
char* pos = strchr(yytext,'=');
|
|
|
|
size_t offset = strspn(pos+1," \t\n");
|
|
|
|
char* start = pos+1+offset;
|
|
|
|
size_t offset2= strcspn( start, "; \t\n");
|
|
|
|
char* end = start+offset2;
|
|
|
|
*end = '\0';
|
|
|
|
char *helpid;
|
|
|
|
makestring( &helpid, start );
|
|
|
|
ares->helpID = helpid;
|
|
|
|
}
|
|
|
|
|
|
|
|
{residentifier}{w}"="[ \t\n]*({identifier}|{number}) {
|
|
|
|
ring->set_zero();
|
|
|
|
lasttoken = TOK_RESID;
|
|
|
|
residfound=1;
|
|
|
|
|
|
|
|
//extract resource id and store as localID
|
|
|
|
char *after = strrchr(yytext,'=');
|
|
|
|
char *resid = after + strspn(after,"= \t\n");
|
|
|
|
char *localID;
|
|
|
|
makestring( &localID, resid );
|
|
|
|
ares->localID = localID;
|
|
|
|
}
|
|
|
|
|
|
|
|
{resfilelist} |
|
|
|
|
{resstring} |
|
|
|
|
{resstringlist} {
|
|
|
|
BEGIN EXCLUDE_STATE;
|
|
|
|
exclude_bracelevel = 1;
|
|
|
|
//fprintf( stderr,"info: lev %d : found exclusion\n", exclude_bracelevel );
|
|
|
|
}
|
|
|
|
|
|
|
|
^[ \t]*#define |
|
|
|
|
{number} |
|
|
|
|
{identifier} {
|
|
|
|
/* identifier/number in einem ring ablegen */
|
|
|
|
char *identifier;
|
|
|
|
char *def=strstr(yytext,"#define");
|
|
|
|
if( def ) {
|
|
|
|
in_define = 1;
|
|
|
|
makestring( &identifier, def+1 );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
makestring( &identifier, yytext );
|
|
|
|
ring->set( identifier );
|
|
|
|
lasttoken = TOK_IDNUM;
|
|
|
|
|
|
|
|
}
|
2005-03-23 08:46:21 -06:00
|
|
|
<INITIAL,EXCLUDE_STATE>{string} {
|
2004-11-02 09:49:47 -06:00
|
|
|
ring->set_broken();
|
|
|
|
lasttoken = TOK_STRING;
|
|
|
|
//printf("%6s %11s %8d %s \n",project,filename,yylineno, yytext);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
<INITIAL,EXCLUDE_STATE>. { //fprintf( stderr,"warning: unused input on line %d of %s \n%s\n",
|
|
|
|
//yylineno, filename, yytext);
|
|
|
|
}
|
|
|
|
|
|
|
|
<EXCLUDE_STATE>\n {
|
|
|
|
; //do nothing, ignore
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
%%
|
|
|
|
|
|
|
|
|
|
|
|
void makeversion( char* version )
|
|
|
|
{
|
|
|
|
char *pos = strpbrk( Revision, "0123456789." );
|
|
|
|
size_t siz = strspn( pos, "0123456789." );
|
|
|
|
if( pos && siz ) {
|
|
|
|
strncpy(version, pos, siz);
|
|
|
|
strcat( version, " ");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
strcpy( version," unknown " );
|
|
|
|
}
|
|
|
|
|
|
|
|
int main( int argc, char* argv[] )
|
|
|
|
{
|
|
|
|
static char *Compiler = "HID-Compiler ";
|
|
|
|
static char *Author = "OG ";
|
|
|
|
static char HIDCompiler[100];
|
|
|
|
static char Version[100];
|
|
|
|
|
|
|
|
|
|
|
|
makeversion( Version );
|
|
|
|
strcpy( HIDCompiler, Compiler );
|
|
|
|
strcat( HIDCompiler, Version );
|
|
|
|
strcat( HIDCompiler, Author );
|
|
|
|
fprintf( stderr, "\n %s \n\n", HIDCompiler);
|
|
|
|
if(argc < 4) {
|
|
|
|
fprintf(
|
|
|
|
stderr,
|
|
|
|
"usage: hidc file.src file.c project \n"
|
|
|
|
"\n"
|
|
|
|
"You must give exactly 3 arguments.\n"
|
|
|
|
"1 - an existing SRC file.\n"
|
|
|
|
"2 - C file to be generated (which generates the HID file when run).\n"
|
|
|
|
"3 - the project name (an arbitrary name).\n\n"
|
|
|
|
);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
project = argv[3];
|
|
|
|
|
|
|
|
char *outfilename = argv[2];
|
|
|
|
if( (outfile=fopen( outfilename , "w" )) ==NULL ) {
|
|
|
|
fprintf(stderr,"error: could not open outputfile '%s' \n", outfilename);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
filename = argv[1];
|
|
|
|
nInputFileDepth = 0;
|
|
|
|
FILE* pFile;
|
|
|
|
pFile = fopen( filename, "r" );
|
|
|
|
if( pFile == NULL ) {
|
|
|
|
fprintf( stderr, "error: could not open inputfile %s \n", filename );
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
InputFiles[ nInputFileDepth ] = yy_create_buffer( pFile, YY_BUF_SIZE );
|
|
|
|
yy_switch_to_buffer( InputFiles[ nInputFileDepth ] );
|
|
|
|
ring = new ident_ring;
|
|
|
|
ares = new resource;
|
|
|
|
|
|
|
|
fprintf(outfile, "/* Generated from %s */\n\n", HIDCompiler );
|
|
|
|
fprintf(outfile, "/* Source was: %s */\n", filename );
|
|
|
|
|
|
|
|
yylineno = 1;
|
|
|
|
yylex(); /* do the real work here */
|
|
|
|
|
|
|
|
if( firstprint ) {
|
|
|
|
fprintf(outfile, "#include \"starview.hid\" \n\n");
|
2005-06-20 09:02:09 -05:00
|
|
|
fprintf(outfile, " int main() { \n\n\n");
|
2004-11-02 09:49:47 -06:00
|
|
|
}
|
|
|
|
fprintf(outfile, "\nreturn 0;");
|
|
|
|
fprintf(outfile, "\n} /*main*/\n");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int yywrap()
|
|
|
|
{
|
|
|
|
yy_delete_buffer( InputFiles[ nInputFileDepth ] );
|
|
|
|
if ( nInputFileDepth == 0 )
|
|
|
|
return 1;/* keine src files mehr */
|
|
|
|
else
|
|
|
|
{
|
|
|
|
nInputFileDepth--;
|
|
|
|
fprintf(outfile, "// Done reading file\n\n");
|
|
|
|
yy_switch_to_buffer( InputFiles[ nInputFileDepth ] );
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int eat_comment()
|
|
|
|
{
|
|
|
|
int c;
|
|
|
|
int lastc = ' ';
|
|
|
|
while( (c=yyinput()) != EOF ) {
|
|
|
|
if( c=='\n')
|
|
|
|
;
|
|
|
|
else if( c=='/' && lastc=='*' )
|
|
|
|
break; /* end of comment found */
|
|
|
|
lastc=c;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int eat_cpp_comment()
|
|
|
|
{
|
|
|
|
int c;
|
|
|
|
while( (c=yyinput()) != EOF ) {
|
|
|
|
if( c=='\n') {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if( c != EOF )
|
|
|
|
unput(c); /* because next #.... line was not found */
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int eat_preprocessor_lines()
|
|
|
|
{
|
|
|
|
int c;
|
|
|
|
int lastc = ' ';
|
|
|
|
while( (c=yyinput()) != EOF ) {
|
|
|
|
if( c=='\n') {
|
|
|
|
if( lastc == '\\')
|
|
|
|
; /* ok, next line is preproc line again */
|
|
|
|
else
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
lastc=c;
|
|
|
|
}
|
|
|
|
if( c != EOF )
|
|
|
|
unput(c); /* because second #.... line was not found */
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int readlistfile()
|
|
|
|
{
|
|
|
|
char buffer[1024];
|
|
|
|
char* tmp;
|
|
|
|
char* project;
|
|
|
|
char* path;
|
|
|
|
int pos;
|
|
|
|
|
|
|
|
tab_entries = 0;
|
|
|
|
while( fgets(buffer, 1024-1, stdin) != NULL ) {
|
|
|
|
pos = strcspn(buffer,"\n");
|
|
|
|
buffer[pos] = '\0';
|
|
|
|
|
|
|
|
makestring( &tmp, buffer );
|
|
|
|
|
|
|
|
/* isolate project */
|
|
|
|
pos = strcspn(tmp," \t");
|
|
|
|
tmp[pos] = '\0';
|
|
|
|
project = tmp;
|
|
|
|
|
|
|
|
/* isolate pathname */
|
|
|
|
path = &tmp[pos+1];
|
|
|
|
|
|
|
|
/* eintragen in filename_tab & project_tab */
|
|
|
|
if( tab_entries >= MAXSRCFILES ) {
|
|
|
|
fprintf( stderr, "error: more than %d entries in '%s' \n", tab_entries, listfilename );
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
filename_tab[tab_entries] = path;
|
|
|
|
project_tab[tab_entries] = project;
|
|
|
|
tab_entries++;
|
|
|
|
}
|
|
|
|
if( tab_entries == 0) {
|
|
|
|
fprintf( stderr, "info: no work to be done \n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int even( int x )
|
|
|
|
{
|
|
|
|
return ! (x & (!0));// !0 for portability 16bit AND 32bit
|
|
|
|
}
|