home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 1
/
GoldFishApril1994_CD1.img
/
d2xx
/
d225
/
mymenu
/
parse.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-06-24
|
3KB
|
166 lines
/* Copyright ) Darin Johnson, 1989 */
#include <exec/types.h>
#include <intuition/intuition.h>
#include <stdio.h>
#include <ctype.h>
#include "mymenu.h"
#define STR 1
#define SYNTAX(msg) { fprintf(stderr, "Error parsing MyMenu.conf: %s\n"); \
return FALSE; }
#ifdef AZTEC_C
#define strcmp _BUILTIN_strcmp
#define strcpy _BUILTIN_strcpy
#define strlen _BUILTIN_strlen
#endif
FILE *conf;
char tok[256], menustr[256], itemstr[256], substr[256];
extern UBYTE menu_pen;
make_action(mi, typ, action)
struct ext_MenuItem *mi;
char typ, *action;
{
register char *p, *index(), *rindex(), *copystr();
mi->args = mi->cmd = NULL;
if (typ=='c') { /* CLI */
if (*action == '"') {
action++;
p = index(action, '"');
} else {
p = index(action, ' ');
}
if (p) { /* if arguments */
*p++ = NULL;
mi->args = copystr(p);
}
mi->cmd = copystr(action);
mi->type = 'C';
} else if (typ=='w') {
if (*action=='"') {
action++;
p = rindex(action, '"');
*p = NULL;
}
mi->cmd = copystr(action);
mi->type = 'W';
}
}
char get_token()
{
char quote;
register char c, *p;
retry:
c = fgetc(conf);
while(isspace(c)) c=fgetc(conf); /* skip extra spaces */
if (c=='#') { /* comment */
while((c=fgetc(conf))!='\n' && c!=EOF);
goto retry;
}
if (!isalnum(c) && c!='"')
return c;
/* scan string */
if (c=='"') {
c = fgetc(conf);
quote = TRUE;
} else
quote = FALSE;
p = tok;
do {
if ((quote && c=='"') || (!quote && isspace(c)))
break;
if (c=='\\')
c = fgetc(conf);
if (isspace(c))
c = ' ';
*p++ = c;
} while ((c=fgetc(conf))!=EOF);
*p = NULL;
return STR;
}
int parse_conf() {
register char t;
char *p, c, flag, cmd;
struct ext_MenuItem *mi;
while ((t=get_token()) != EOF) {
if (t==STR) {
if (stricmp(tok, "MENU")==0) {
cmd = NULL;
if ((t=get_token())=='<') { /* command char */
cmd = fgetc(conf);
if (get_token() != '>')
SYNTAX("Missing closing'>'");
t=get_token();
}
if (t==STR)
strcpy(menustr, tok);
else
SYNTAX("Missing menu name");
if (get_token()==STR)
strcpy(itemstr, tok);
else
SYNTAX("Missing menu item name");
if ((t=get_token())==STR) {
strcpy(substr, tok);
t=get_token();
} else {
substr[0] = NULL;
}
if (t != '|')
SYNTAX("Missing '|' separator");
mi = add_menu(menustr, itemstr, substr, cmd);
if (get_token() != STR)
SYNTAX("Syntax error after '|'");
/* find out type */
if (stricmp(tok, "CLI")==0)
flag = 'c';
else if (stricmp(tok, "WB")==0)
flag = 'w';
else
flag = NULL;
/* read in command (rest of line */
p = tok;
while ((c=fgetc(conf)) != '\n' && c!=EOF)
*p++ = c;
*p = NULL;
make_action(mi, flag, tok);
} else if (stricmp(tok, "COLOR")==0) {
if ((t=get_token())!=STR)
SYNTAX("Expected number after COLOR keyword");
menu_pen = (UBYTE)atoi(tok);
} else
SYNTAX("Didn't find keyword");
} else
SYNTAX("Didn't find keyword");
}
return TRUE;
}
int parse_menus() {
int stat;
conf = fopen("S:MyMenu.conf", "r");
if (conf==NULL) {
conf = fopen("MyMenu.conf", "r");
if (conf==NULL) {
fprintf(stderr, "Can't open MyMenu.conf!\n");
return FALSE;
}
}
start_menu();
menu_pen = 2;
stat = parse_conf();
end_menu();
if (conf)
fclose(conf);
return stat;
}