SBSPSS/Utils/Scripter/prepro.cpp
2001-01-02 16:02:35 +00:00

359 lines
6.7 KiB
C++

/*=========================================================================
prepro.cpp
Author: PKG
Created:
Project: Spongebob
Purpose:
Copyright (c) 2000 Climax Development Ltd
===========================================================================*/
/*----------------------------------------------------------------------
Includes
-------- */
#include "prepro.h"
#ifndef __PFILE_H__
#include "pfile.h"
#endif
/* Std Lib
------- */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/* Data
---- */
/*----------------------------------------------------------------------
Tyepdefs && Defines
------------------- */
/*----------------------------------------------------------------------
Structure defintions
-------------------- */
typedef struct
{
char *m_cmd;
int (*m_func)(char *_cmd);
} PreproCmd;
typedef struct _macro
{
char *m_name;
char *m_replacement;
_macro *m_next;
} Macro;
/*----------------------------------------------------------------------
Function Prototypes
------------------- */
static int ppf_define(char *_cmd);
static int ppf_include(char *_cmd);
static int ppf_print(char *_cmd);
static int ppf_undefine(char *_cmd);
static int ppf_ignore(char *_cmd);
static int addMacro(char *_name,char *_replacement);
static int removeMacro(char *_name);
/*----------------------------------------------------------------------
Vars
---- */
static PreproCmd s_preproCmds[]=
{
{ "define", ppf_define },
{ "include", ppf_include },
{ "print", ppf_print },
{ "undef", ppf_undefine },
// This is bad but it means we can use the include files generated by parkgrab
// ( might have to fix this one day.. )
{ "ifdef", ppf_ignore },
{ "ifndef", ppf_ignore },
{ "endif", ppf_ignore },
};
static int s_numPreproCmds=sizeof(s_preproCmds)/sizeof(PreproCmd);
// Macro list ( alphabetically sorted from lowest to highest )
static Macro *s_macros;
static char s_seps[]=" \t";
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns: true on success, false on failure
---------------------------------------------------------------------- */
extern int preprocessorCmd(char *_cmd)
{
int i;
PreproCmd *pp;
pp=s_preproCmds;
for(i=0;i<s_numPreproCmds;i++)
{
if(strncmp(_cmd,pp->m_cmd,strlen(pp->m_cmd))==0)
{
return pp->m_func(_cmd);
}
pp++;
}
printf("UNKNOWN PREPROCESSOR CMD '%s'\n",_cmd);
return false;
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
static int ppf_define(char *_cmd)
{
char *macroName;
char *macroReplacement;
macroName=strtok(_cmd,s_seps);
macroName=strtok(NULL,s_seps);
macroReplacement=strtok(NULL,s_seps);
return addMacro(macroName,macroReplacement);
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
static int ppf_include(char *_cmd)
{
char *includeFile;
includeFile=strtok(_cmd,s_seps);
includeFile=strtok(NULL,s_seps);
return openPFile(includeFile);
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
static int ppf_print(char *_cmd)
{
char *printMessage;
printMessage=strtok(_cmd,s_seps);
printMessage=strtok(NULL,s_seps);
printf("#print %s\n",printMessage);
return true;
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
static int ppf_undefine(char *_cmd)
{
char *macroName;
macroName=strtok(_cmd,s_seps);
macroName=strtok(NULL,s_seps);
return removeMacro(macroName);
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
static int ppf_ignore(char *_cmd)
{
printf("PRE-PROCESSOR COMMAND IGNORED..\n");
return true;
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
static int addMacro(char *_name,char *_replacement)
{
Macro *mac,*newMac,*prev;
// Is the macro already there?
mac=s_macros;
while(mac)
{
if(strcmp(_name,mac->m_name)==0) // pkg
{
printf("MACRO '%s' ALREADY DEFINED\n",_name);
return false;
}
mac=mac->m_next;
}
// Create new macro
newMac=(Macro*)malloc(sizeof(Macro));
newMac->m_name=(char*)malloc(strlen(_name)+1);
strcpy(newMac->m_name,_name);
if(_replacement)
{
newMac->m_replacement=(char*)malloc(strlen(_replacement)+1);
strcpy(newMac->m_replacement,_replacement);
}
else
{
newMac->m_replacement=NULL;
}
// Insert it into the list
mac=s_macros;
prev=NULL;
while(mac&&strcmp(_name,mac->m_name)>0)
{
prev=mac;
mac=mac->m_next;
};
if(prev)
{
prev->m_next=newMac;
newMac->m_next=mac;
}
else
{
newMac->m_next=s_macros;
s_macros=newMac;
}
return true;
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
static int removeMacro(char *_name)
{
Macro *mac,*prev;
int cmpResult;
mac=s_macros;
prev=NULL;
while(mac)
{
cmpResult=strcmp(_name,mac->m_name);
if(cmpResult==0)
{
if(prev)
{
prev->m_next=mac->m_next;
}
else
{
s_macros=mac->m_next;
}
free(mac->m_name);
if(mac->m_replacement)
{
free(mac->m_replacement);
}
free(mac);
return true;
}
else if(cmpResult<0)
{
break;
}
prev=mac;
mac=mac->m_next;
}
printf("MACRO '%s' NOT DEFINED, CANNOT UNDEF IT\n",_name);
return false;
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
extern char *lookupMacro(char *_name,int *_result)
{
Macro *mac;
size_t nameLength;
int cmpResult;
mac=s_macros;
nameLength=strlen(_name);
while(mac)
{
cmpResult=strncmp(_name,mac->m_name,nameLength);
if(cmpResult==0)
{
if(nameLength==strlen(mac->m_name))
{
*_result=KNOWN_MACRO;
return mac->m_replacement;
}
else
{
*_result=POSSIBLE_KNOWN_MACRO;
return NULL;
}
}
else if(cmpResult<0)
{
break;
}
mac=mac->m_next;
}
*_result=UNKNOWN_MACRO;
return NULL;
}
/*===========================================================================
end */