annotate sbr/fmtcompile.c @ 17:76d91e545ea8 default tip

addrsbr and dtimep fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 24 Nov 2014 14:49:25 +0900
parents 441a2190cfae
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* fmtcompile.c - "compile" format strings for fmtscan */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 #ifndef lint
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3 static char ident[] = "@(#)$Id: fmtcompile.c,v 1.1.1.1 2005/04/18 14:46:06 kono Exp $";
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 #endif /* lint */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 #include "../h/mh.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 #include "../h/addrsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 #include "../h/formatsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 #include "../zotnet/tws.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 #include "../h/fmtcompile.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 #include <ctype.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13 #include <sys/types.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 #include <sys/stat.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 static struct format *formatvec; /* array to hold formats */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 static struct format *next_fp; /* next free format slot */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 static struct format *fp; /* current format slot */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 static struct comp *cm; /* most recent comp ref */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 static struct ftable *ftbl; /* most recent func ref */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 static int ncomp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 static int infunction; /* function nesting cnt */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 extern char *getusr();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 extern struct mailname fmt_mnull;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 struct ftable {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 char *name; /* function name */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 char type; /* argument type */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 #define TF_COMP 0 /* component expected */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 #define TF_NUM 1 /* number expected */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32 #define TF_STR 2 /* string expected */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 #define TF_EXPR 3 /* component or func. expected */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 #define TF_NONE 4 /* no argument */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 #define TF_MYBOX 5 /* special - get current user's mbox */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 #define TF_NOW 6 /* special - get current unix time */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 #define TF_EXPR_SV 7 /* like expr but save current str reg */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 #define TF_NOP 8 /* like expr but no result */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 char f_type; /* fmt type */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 char extra; /* arg. type dependent extra info */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 char flags;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 #define TFL_PUTS 1 /* implicit putstr if top level */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 #define TFL_PUTN 2 /* implicit putnum if top level */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 static struct ftable functable[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47 "nonzero", TF_EXPR, FT_V_NE, FT_IF_V_NE, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 "zero", TF_EXPR, FT_V_EQ, FT_IF_V_EQ, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 "eq", TF_NUM, FT_V_EQ, FT_IF_V_EQ, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 "ne", TF_NUM, FT_V_NE, FT_IF_V_NE, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 "gt", TF_NUM, FT_V_GT, FT_IF_V_GT, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 "null", TF_EXPR, FT_S_NULL, FT_IF_S_NULL, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 "nonnull", TF_EXPR, FT_S_NONNULL, FT_IF_S, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 "match", TF_STR, FT_V_MATCH, FT_IF_MATCH, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 "amatch", TF_STR, FT_V_AMATCH, FT_IF_AMATCH, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 "putstr", TF_EXPR, FT_STR, 0, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 "putstrf", TF_EXPR, FT_STRF, 0, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 "putnum", TF_EXPR, FT_NUM, 0, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 "putnumf", TF_EXPR, FT_NUMF, 0, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 "putaddr", TF_STR, FT_PUTADDR, 0, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 "void", TF_NOP, 0, 0, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 "comp", TF_COMP, FT_LS_COMP, 0, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65 "lit", TF_STR, FT_LS_LIT, 0, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 "getenv", TF_STR, FT_LS_GETENV, 0, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 "profile", TF_STR, FT_LS_MFIND, 0, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 "trim", TF_EXPR, FT_LS_TRIM, 0, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 "compval", TF_COMP, FT_LV_COMP, 0, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 "compflag", TF_COMP, FT_LV_COMPFLAG, 0, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 "num", TF_NUM, FT_LV_LIT, 0, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 "msg", TF_NONE, FT_LV_DAT, 0, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73 "cur", TF_NONE, FT_LV_DAT, 1, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 "size", TF_NONE, FT_LV_DAT, 2, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 "width", TF_NONE, FT_LV_DAT, 3, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 "unseen", TF_NONE, FT_LV_DAT, 4, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77 "dat", TF_NUM, FT_LV_DAT, 0, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 "strlen", TF_NONE, FT_LV_STRLEN, 0, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 "me", TF_MYBOX, FT_LS_LIT, 0, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 "plus", TF_NUM, FT_LV_PLUS_L, 0, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 "minus", TF_NUM, FT_LV_MINUS_L, 0, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 "divide", TF_NUM, FT_LV_DIVIDE_L, 0, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 "modulo", TF_NUM, FT_LV_MODULO_L, 0, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 "charleft", TF_NONE, FT_LV_CHAR_LEFT, 0, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 "timenow", TF_NOW, FT_LV_LIT, 0, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 "month", TF_COMP, FT_LS_MONTH, FT_PARSEDATE, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 "lmonth", TF_COMP, FT_LS_LMONTH, FT_PARSEDATE, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 "tzone", TF_COMP, FT_LS_ZONE, FT_PARSEDATE, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 "day", TF_COMP, FT_LS_DAY, FT_PARSEDATE, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 "weekday", TF_COMP, FT_LS_WEEKDAY, FT_PARSEDATE, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 "tws", TF_COMP, FT_LS_822DATE, FT_PARSEDATE, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 "sec", TF_COMP, FT_LV_SEC, FT_PARSEDATE, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 "min", TF_COMP, FT_LV_MIN, FT_PARSEDATE, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 "hour", TF_COMP, FT_LV_HOUR, FT_PARSEDATE, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 "mday", TF_COMP, FT_LV_MDAY, FT_PARSEDATE, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 "mon", TF_COMP, FT_LV_MON, FT_PARSEDATE, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 "year", TF_COMP, FT_LV_YEAR, FT_PARSEDATE, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 "yday", TF_COMP, FT_LV_YDAY, FT_PARSEDATE, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 "wday", TF_COMP, FT_LV_WDAY, FT_PARSEDATE, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 "zone", TF_COMP, FT_LV_ZONE, FT_PARSEDATE, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 "clock", TF_COMP, FT_LV_CLOCK, FT_PARSEDATE, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 "rclock", TF_COMP, FT_LV_RCLOCK, FT_PARSEDATE, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 "sday", TF_COMP, FT_LV_DAYF, FT_PARSEDATE, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105 "szone", TF_COMP, FT_LV_ZONEF, FT_PARSEDATE, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 "dst", TF_COMP, FT_LV_DST, FT_PARSEDATE, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 "pretty", TF_COMP, FT_LS_PRETTY, FT_PARSEDATE, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 "nodate", TF_COMP, FT_LV_COMPFLAG, FT_PARSEDATE, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 "date2local", TF_COMP, FT_LOCALDATE, FT_PARSEDATE, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 "date2gmt", TF_COMP, FT_GMTDATE, FT_PARSEDATE, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 "pers", TF_COMP, FT_LS_PERS, FT_PARSEADDR, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 "mbox", TF_COMP, FT_LS_MBOX, FT_PARSEADDR, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 "host", TF_COMP, FT_LS_HOST, FT_PARSEADDR, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 "path", TF_COMP, FT_LS_PATH, FT_PARSEADDR, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 "gname", TF_COMP, FT_LS_GNAME, FT_PARSEADDR, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 "note", TF_COMP, FT_LS_NOTE, FT_PARSEADDR, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 "addr", TF_COMP, FT_LS_ADDR, FT_PARSEADDR, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 "proper", TF_COMP, FT_LS_822ADDR, FT_PARSEADDR, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120 "type", TF_COMP, FT_LV_HOSTTYPE, FT_PARSEADDR, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 "ingrp", TF_COMP, FT_LV_INGRPF, FT_PARSEADDR, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 "nohost", TF_COMP, FT_LV_NOHOSTF, FT_PARSEADDR, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 "formataddr", TF_EXPR_SV, FT_FORMATADDR, FT_FORMATADDR, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 "friendly", TF_COMP, FT_LS_FRIENDLY, FT_PARSEADDR, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 "mymbox", TF_COMP, FT_LV_COMPFLAG, FT_MYMBOX, TFL_PUTN,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 "addtoseq", TF_STR, FT_ADDTOSEQ, 0, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 #ifdef MIME_HEADERS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 "hencode", TF_EXPR, FT_LS_HENCODE, 0, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 "hdecode", TF_EXPR, FT_LS_HDECODE, 0, TFL_PUTS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 #endif /* MIME_HEADERS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 (char *)0, 0, 0, 0, 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 time_t time ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139 static struct ftable *lookup(name)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 register char *name;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142 register struct ftable *t = functable;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 register char *nm;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 register char c = *name;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 while (nm = t->name) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147 if (*nm == c && strcmp (nm, name) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 return (ftbl = t);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 t++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 return (struct ftable *)0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 #define NEWCOMP(cm,name)\
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 cm = ((struct comp *)calloc(1, sizeof (struct comp)));\
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158 cm->c_name = name; ncomp++;\
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 i = CHASH(name); cm->c_next = wantcomp[i]; wantcomp[i] = cm;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 #define NEWFMT (next_fp++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162 #define NEW(type,fill,wid)\
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 fp=NEWFMT; fp->f_type=(type); fp->f_fill=(fill); fp->f_width=(wid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 #define ADDC(name)\
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166 FINDCOMP( cm, name );\
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 if ( ! cm ) {\
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 NEWCOMP(cm,name);\
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 }\
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 fp->f_comp = cm;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172 #define LV( type, value ) NEW(type,0,0); fp->f_value = (value);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 #define LS( type, str ) NEW(type,0,0); fp->f_text = (str);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 #define PUTCOMP( comp ) NEW(FT_COMP,0,0); ADDC(comp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 #define PUTLIT( str ) NEW(FT_LIT,0,0); fp->f_text = (str);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 #define PUTC( c ) NEW(FT_CHAR,0,0); fp->f_char = (c);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 static char *compile();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 static char *do_spec();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180 static char *do_name();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181 static char *do_func();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 static char *do_expr();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 static char *do_if();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184 static char *do_loop();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 static char *format_string;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187 static char *usr_fstring; /* for CERROR */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 #define CERROR(str) compile_error (str, cp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 static void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 compile_error(str, cp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 char *str;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 int errpos = cp - format_string;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197 int errctx = errpos > 20 ? 20 : errpos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201 errpos = cp - format_string + (*cp ? 1 : 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202 errctx = errpos > 20 ? 20 : errpos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203 usr_fstring[errpos] = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204 while ((errctx < errpos) && ml_ismlchar(usr_fstring[errpos-errctx]))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205 errctx++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206 for (i = errpos-errctx; i < errpos; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 if (iscntrl((usr_fstring[i] & 0x7f)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208 usr_fstring[i] = '_';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 advise(NULLCP, "\"%s\": format compile error - %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210 &usr_fstring[errpos-errctx], str);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211 adios (NULLCP, "%*s", errctx + 1 - (*cp ? 1 : 0), "^");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212 #else /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213 usr_fstring[errpos] = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 for (i = errpos-errctx; i < errpos; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215 #ifdef LOCALE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 if (iscntrl(usr_fstring[i] & 0x7f))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 if (usr_fstring[i] < 32)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220 usr_fstring[i] = '_';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221 advise(NULLCP, "\"%s\": format compile error - %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 &usr_fstring[errpos-errctx], str);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223 adios (NULLCP, "%*s", errctx+1, "^");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228 * Compile format string "fstring" into format list "fmt".
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 * Return the number of header components found in the format
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230 * string.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232 fmt_compile( fstring, fmt )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233 register char *fstring;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234 struct format **fmt;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236 register char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239 if (format_string)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240 (void) free (format_string);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
241 format_string = getcpy (fstring);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
242 usr_fstring = fstring;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
243
bce86c4163a3 Initial revision
kono
parents:
diff changeset
244 /* init the component hash table. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
245 for (i = 0; i < sizeof(wantcomp)/sizeof(wantcomp[0]); i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
246 wantcomp[i] = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
247
bce86c4163a3 Initial revision
kono
parents:
diff changeset
248 bzero ((char *) &fmt_mnull, sizeof fmt_mnull);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
249
bce86c4163a3 Initial revision
kono
parents:
diff changeset
250 /* it takes at least 4 char to generate one format so we
bce86c4163a3 Initial revision
kono
parents:
diff changeset
251 * allocate a worst-case format array using 1/4 the length
bce86c4163a3 Initial revision
kono
parents:
diff changeset
252 * of the format string. We actually need twice this much
bce86c4163a3 Initial revision
kono
parents:
diff changeset
253 * to handle both pre-processing (e.g., address parsing) and
bce86c4163a3 Initial revision
kono
parents:
diff changeset
254 * normal processing.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
255 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
256 i = strlen(fstring)/2 + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
257 next_fp = formatvec = (struct format *)calloc ((unsigned) i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
258 sizeof(struct format));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
259 if (next_fp == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
260 adios (NULLCP, "unable to allocate format storage");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
261
bce86c4163a3 Initial revision
kono
parents:
diff changeset
262 ncomp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
263 infunction = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
264
bce86c4163a3 Initial revision
kono
parents:
diff changeset
265 cp = compile(format_string);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
266 if (*cp) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
267 CERROR("extra '%>', '%|' or '%?'");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
268 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
269 LV(FT_DONE,0); /* really done */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
270 *fmt = formatvec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
271
bce86c4163a3 Initial revision
kono
parents:
diff changeset
272 return (ncomp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
273 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
274
bce86c4163a3 Initial revision
kono
parents:
diff changeset
275 static char *compile (sp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
276 register char *sp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
277 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
278 register char *cp = sp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
279 register int c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
280
bce86c4163a3 Initial revision
kono
parents:
diff changeset
281 for (;;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
282 sp = cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
283 while ((c = *cp) && c != '%')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
284 cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
285 *cp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
286 switch (cp-sp) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
287 case 0:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
288 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
289 case 1:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
290 PUTC(*sp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
291 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
292 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
293 PUTLIT(sp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
294 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
295 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
296 if (c == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
297 return (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
298
bce86c4163a3 Initial revision
kono
parents:
diff changeset
299 switch (c = *++cp) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
300 case '%':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
301 PUTC (*cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
302 cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
303 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
304
bce86c4163a3 Initial revision
kono
parents:
diff changeset
305 case '|':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
306 case '>':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
307 case '?':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
308 case ']':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
309 return (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
310
bce86c4163a3 Initial revision
kono
parents:
diff changeset
311 case '<':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
312 cp = do_if(++cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
313 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
314
bce86c4163a3 Initial revision
kono
parents:
diff changeset
315 case '[': /* ] */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
316 cp = do_loop(++cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
317 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
318
bce86c4163a3 Initial revision
kono
parents:
diff changeset
319 case ';': /* comment line */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
320 cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
321 while ((c = *cp++) && c != '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
322 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
323 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
324
bce86c4163a3 Initial revision
kono
parents:
diff changeset
325 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
326 cp = do_spec(cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
327 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
328 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
329 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
330 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
331
bce86c4163a3 Initial revision
kono
parents:
diff changeset
332
bce86c4163a3 Initial revision
kono
parents:
diff changeset
333 static char *do_spec(sp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
334 register char *sp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
335 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
336 register char *cp = sp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
337 register int c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
338 #ifndef lint
bce86c4163a3 Initial revision
kono
parents:
diff changeset
339 register int ljust = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
340 #endif /* not lint */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
341 register int wid = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
342 register char fill = ' ';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
343
bce86c4163a3 Initial revision
kono
parents:
diff changeset
344 c = *cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
345 if (c == '-') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
346 ljust++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
347 c = *cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
348 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
349 if (c == '0') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
350 fill = c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
351 c = *cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
352 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
353 while (isdigit(c)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
354 wid = wid*10 + (c - '0');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
355 c = *cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
356 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
357 if (c == '{') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
358 cp = do_name(cp, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
359 if (! infunction)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
360 fp->f_type = wid? FT_COMPF : FT_COMP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
361 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
362 else if (c == '(') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
363 cp = do_func(cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
364 if (! infunction) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
365 if (ftbl->flags & TFL_PUTS) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
366 LV( wid? FT_STRF : FT_STR, ftbl->extra);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
367 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
368 else if (ftbl->flags & TFL_PUTN) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
369 LV( wid? FT_NUMF : FT_NUM, ftbl->extra);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
370 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
371 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
372 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
373 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
374 CERROR("component or function name expected");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
375 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
376 if (ljust)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
377 wid = -wid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
378 fp->f_width = wid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
379 fp->f_fill = fill;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
380
bce86c4163a3 Initial revision
kono
parents:
diff changeset
381 return (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
382 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
383
bce86c4163a3 Initial revision
kono
parents:
diff changeset
384 static char *do_name(sp, preprocess)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
385 char *sp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
386 int preprocess;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
387 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
388 register char *cp = sp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
389 register int c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
390 register int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
391 static int primed = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
392
bce86c4163a3 Initial revision
kono
parents:
diff changeset
393 while (isalnum(c = *cp++) || c == '-' || c == '_')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
394 ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
395 if (c != '}') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
396 CERROR("'}' expected");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
397 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
398 cp[-1] = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
399 PUTCOMP(sp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
400 switch (preprocess) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
401
bce86c4163a3 Initial revision
kono
parents:
diff changeset
402 case FT_PARSEDATE:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
403 if (cm->c_type & CT_ADDR) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
404 CERROR("component used as both date and address");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
405 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
406 if (! (cm->c_type & CT_DATE)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
407 cm->c_tws = (struct tws *)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
408 calloc((unsigned) 1, sizeof *cm -> c_tws);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
409 fp->f_type = preprocess;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
410 PUTCOMP(sp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
411 cm->c_type |= CT_DATE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
412 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
413 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
414
bce86c4163a3 Initial revision
kono
parents:
diff changeset
415 case FT_MYMBOX:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
416 if (!primed) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
417 (void) ismymbox ((struct mailname *) 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
418 primed++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
419 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
420 cm->c_type |= CT_MYMBOX;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
421 /* fall through */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
422 case FT_PARSEADDR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
423 if (cm->c_type & CT_DATE) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
424 CERROR("component used as both date and address");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
425 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
426 if (! (cm->c_type & CT_ADDRPARSE)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
427 cm->c_mn = &fmt_mnull;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
428 fp->f_type = preprocess;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
429 PUTCOMP(sp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
430 cm->c_type |= (CT_ADDR | CT_ADDRPARSE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
431 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
432 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
433
bce86c4163a3 Initial revision
kono
parents:
diff changeset
434 case FT_FORMATADDR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
435 if (cm->c_type & CT_DATE) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
436 CERROR("component used as both date and address");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
437 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
438 cm->c_type |= CT_ADDR;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
439 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
440 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
441 return (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
442 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
443
bce86c4163a3 Initial revision
kono
parents:
diff changeset
444 static char *do_func(sp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
445 char *sp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
446 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
447 register char *cp = sp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
448 register int c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
449 register struct ftable *t;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
450 register int n;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
451 int mflag; /* minus sign in NUM */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
452
bce86c4163a3 Initial revision
kono
parents:
diff changeset
453 infunction++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
454
bce86c4163a3 Initial revision
kono
parents:
diff changeset
455 while (isalnum(c = *cp++))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
456 ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
457 if (c != '(' && c != '{' && c != ' ' && c != ')') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
458 CERROR("'(', '{', ' ' or ')' expected");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
459 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
460 cp[-1] = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
461 if ((t = lookup (sp)) == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
462 CERROR("unknown function");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
463 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
464 if (isspace(c))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
465 c = *cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
466
bce86c4163a3 Initial revision
kono
parents:
diff changeset
467 switch (t->type) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
468
bce86c4163a3 Initial revision
kono
parents:
diff changeset
469 case TF_COMP:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
470 if (c != '{') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
471 CERROR("component name expected");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
472 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
473 cp = do_name(cp, t->extra);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
474 fp->f_type = t->f_type;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
475 c = *cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
476 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
477
bce86c4163a3 Initial revision
kono
parents:
diff changeset
478 case TF_NUM:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
479 if (mflag = (c == '-'))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
480 c = *cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
481 n = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
482 while (isdigit(c)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
483 n = n*10 + (c - '0');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
484 c = *cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
485 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
486 if (mflag)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
487 n = (-n);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
488 LV(t->f_type,n);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
489 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
490
bce86c4163a3 Initial revision
kono
parents:
diff changeset
491 case TF_STR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
492 sp = cp - 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
493 while (c && c != ')')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
494 c = *cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
495 cp[-1] = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
496 LS(t->f_type,sp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
497 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
498
bce86c4163a3 Initial revision
kono
parents:
diff changeset
499 case TF_NONE:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
500 LV(t->f_type,t->extra);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
501 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
502
bce86c4163a3 Initial revision
kono
parents:
diff changeset
503 case TF_MYBOX:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
504 LS(t->f_type, getusr());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
505 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
506
bce86c4163a3 Initial revision
kono
parents:
diff changeset
507 case TF_NOW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
508 LV(t->f_type, time((time_t *) 0));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
509 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
510
bce86c4163a3 Initial revision
kono
parents:
diff changeset
511 case TF_EXPR_SV:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
512 LV(FT_SAVESTR, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
513 /* fall through */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
514 case TF_EXPR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
515 *--cp = c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
516 cp = do_expr(cp, t->extra);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
517 LV(t->f_type, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
518 c = *cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
519 ftbl = t;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
520 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
521
bce86c4163a3 Initial revision
kono
parents:
diff changeset
522 case TF_NOP:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
523 *--cp = c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
524 cp = do_expr(cp, t->extra);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
525 c = *cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
526 ftbl = t;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
527 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
528 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
529 if (c != ')') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
530 CERROR("')' expected");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
531 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
532 --infunction;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
533 return (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
534 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
535
bce86c4163a3 Initial revision
kono
parents:
diff changeset
536 static char *do_expr (sp, preprocess)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
537 char *sp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
538 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
539 register char *cp = sp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
540 register int c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
541
bce86c4163a3 Initial revision
kono
parents:
diff changeset
542 if ((c = *cp++) == '{') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
543 cp = do_name (cp, preprocess);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
544 fp->f_type = FT_LS_COMP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
545 } else if (c == '(') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
546 cp = do_func (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
547 } else if (c == ')') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
548 return (--cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
549 } else if (c == '%' && *cp == '<') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
550 cp = do_if (cp+1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
551 } else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
552 CERROR ("'(', '{', '%<' or ')' expected");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
553 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
554 return (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
555 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
556
bce86c4163a3 Initial revision
kono
parents:
diff changeset
557 static char *do_loop(sp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
558 register char *sp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
559 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
560 register char *cp = sp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
561 struct format *floop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
562
bce86c4163a3 Initial revision
kono
parents:
diff changeset
563 floop = next_fp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
564 cp = compile (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
565 if (*cp++ != ']')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
566 CERROR ("']' expected");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
567
bce86c4163a3 Initial revision
kono
parents:
diff changeset
568 LV(FT_DONE, 1); /* not yet done */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
569 LV(FT_GOTO, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
570 fp->f_skip = floop - fp; /* skip backwards */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
571
bce86c4163a3 Initial revision
kono
parents:
diff changeset
572 return cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
573 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
574
bce86c4163a3 Initial revision
kono
parents:
diff changeset
575 static char *do_if(sp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
576 register char *sp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
577 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
578 register char *cp = sp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
579 register struct format *fexpr,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
580 *fif = (struct format *)NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
581 register int c = '<';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
582
bce86c4163a3 Initial revision
kono
parents:
diff changeset
583 for (;;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
584 if (c == '<') { /* doing an IF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
585 if ((c = *cp++) == '{') /*}*/{
bce86c4163a3 Initial revision
kono
parents:
diff changeset
586 cp = do_name(cp, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
587 fp->f_type = FT_LS_COMP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
588 LV (FT_IF_S, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
589 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
590 else if (c == '(') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
591 cp = do_func(cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
592 /* see if we can merge the load and the "if" */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
593 if (ftbl->f_type >= IF_FUNCS)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
594 fp->f_type = ftbl->extra;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
595 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
596 LV (FT_IF_V_NE, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
597 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
598 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
599 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
600 CERROR("'(' or '{' expected"); /*}*/
bce86c4163a3 Initial revision
kono
parents:
diff changeset
601 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
602 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
603
bce86c4163a3 Initial revision
kono
parents:
diff changeset
604 fexpr = fp; /* loc of [ELS]IF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
605 cp = compile (cp); /* compile IF TRUE stmts */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
606 if (fif)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
607 fif->f_skip = next_fp - fif;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
608
bce86c4163a3 Initial revision
kono
parents:
diff changeset
609 if ((c = *cp++) == '|') { /* the last ELSE */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
610 LV(FT_GOTO, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
611 fif = fp; /* loc of GOTO */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
612 fexpr->f_skip = next_fp - fexpr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
613
bce86c4163a3 Initial revision
kono
parents:
diff changeset
614 fexpr = (struct format *)NULL;/* no extra ENDIF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
615
bce86c4163a3 Initial revision
kono
parents:
diff changeset
616 cp = compile (cp); /* compile ELSE stmts */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
617 fif->f_skip = next_fp - fif;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
618 c = *cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
619 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
620 else if (c == '?') { /* another ELSIF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
621 LV(FT_GOTO, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
622 fif = fp; /* loc of GOTO */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
623 fexpr->f_skip = next_fp - fexpr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
624
bce86c4163a3 Initial revision
kono
parents:
diff changeset
625 c = '<'; /* impersonate an IF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
626 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
627 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
628 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
629 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
630
bce86c4163a3 Initial revision
kono
parents:
diff changeset
631 if (c != '>') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
632 CERROR("'>' expected.");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
633 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
634
bce86c4163a3 Initial revision
kono
parents:
diff changeset
635 if (fexpr) /* IF ... [ELSIF ...] ENDIF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
636 fexpr->f_skip = next_fp - fexpr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
637
bce86c4163a3 Initial revision
kono
parents:
diff changeset
638 return (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
639 }