3
created with UNIX on "Thursday, September 24, 1998 at 16:12." \
4
COMMAND LINE: "Web/ftangle Web/macs -A -# --F -= 1.62/Web/macs.c"\
5
RUN TIME: "Friday, September 25, 1998 at 8:02."\
6
WEB FILE: "Web/macs.web"\
11
#define stringg (eight_bits)02 \
13
#define constant (eight_bits)03
14
#define begin_Xmeta or_or
15
#define end_Xmeta star_star
16
#define cdir (eight_bits)06
17
#define colon_colon (eight_bits)011 \
19
#define join (eight_bits)0177 \
22
#define TOKEN1(a)((a)<ID0) \
24
#define MACRO_ARGUMENT 0377 \
28
#define MODULE_NAME 10240
29
#define MODULE_NUM 20480
30
#define LINE_NUM 53248L \
32
#define IDENTIFIER(left,right) \
33
((sixteen_bits)(((left)-ID0)*BASE2+(sixteen_bits)(right))) \
36
#define LEFT(a,id)((eight_bits)(((a)/BASE2+(id)))) \
38
#define RIGHT(a)((eight_bits)(((a)%BASE2))) \
42
#define begin_comment0 (eight_bits)0376
43
#define begin_comment1 (eight_bits)0375 \
45
#define module_number (eight_bits)0201
46
#define identifier (eight_bits)0202
47
#define id_keyword (eight_bits)0203 \
49
#define L_switch (eight_bits)0257
50
#define begin_FORTRAN (eight_bits)0260
51
#define begin_RATFOR (eight_bits)0261
52
#define begin_C (eight_bits)0262
53
#define begin_LITERAL (eight_bits)0263 \
55
#define verbatim (eight_bits)0264 \
58
#define invisible_cmnt (eight_bits)0265
59
#define compiler_directive (eight_bits)0266
60
#define Compiler_Directive (eight_bits)0267 \
62
#define keyword_name (eight_bits)0270 \
64
#define no_index (eight_bits)0300
65
#define yes_index (eight_bits)0301 \
67
#define ascii_constant (eight_bits)0302
68
#define begin_vcmnt (eight_bits)0303
69
#define big_line_break (eight_bits)0304 \
71
#define begin_bp (eight_bits)0305
72
#define insert_bp (eight_bits)0306 \
74
#define begin_meta (eight_bits)017
75
#define end_meta (eight_bits)027 \
77
#define TeX_string (eight_bits)0307
78
#define xref_roman (eight_bits)0310
79
#define xref_typewriter (eight_bits)0311
80
#define xref_wildcard (eight_bits)0312 \
82
#define control_text (eight_bits)0313 \
84
#define begin_nuweb (eight_bits)0314
85
#define no_mac_expand (eight_bits)0315
86
#define set_line_info (eight_bits)0316
87
#define short_fcn (eight_bits)0317 \
89
#define formatt (eight_bits)0320 \
91
#define limbo_text (eight_bits)0323
92
#define op_def (eight_bits)0324
93
#define macro_def (eight_bits)0325 \
95
#define ignore_defn (eight_bits)0327 \
97
#define new_output_file (eight_bits)0331 \
99
#define definition (eight_bits)0332
100
#define undefinition (eight_bits)0333
101
#define WEB_definition (eight_bits)0334 \
103
#define m_ifdef (eight_bits)0335
104
#define m_ifndef (eight_bits)0336
105
#define m_if (eight_bits)0337
106
#define m_else (eight_bits)0340
107
#define m_elif (eight_bits)0341
108
#define m_endif (eight_bits)0342
109
#define m_for (eight_bits)0343
110
#define m_endfor (eight_bits)0344
111
#define m_line (eight_bits)0345
112
#define m_undef (eight_bits)0346 \
114
#define end_of_buffer (eight_bits)0347 \
116
#define begin_code (eight_bits)0350
117
#define module_name (eight_bits)0351 \
119
#define new_module (eight_bits)0352 \
121
#define cur_end cur_state.end_field
122
#define cur_byte cur_state.byte_field
123
#define cur_name cur_state.name_field
124
#define cur_repl cur_state.repl_field
125
#define cur_mod cur_state.mod_field \
127
#define cur_language cur_state.language
128
#define cur_global_language cur_state.global_params.Language \
132
#define cur_params cur_state.params
133
#define cur_global_params cur_state.global_params \
136
#define macrobuf cur_state.macro_buf
137
#define cur_mp cur_state.mp
138
#define macrobuf_end cur_state.macro_buf_end \
140
#define BP_MARKER 1 \
142
#define PROPER_END(end) \
143
end= (np+1)->byte_start; \
144
if(*end==BP_MARKER&&np!=npmax)end= ((BP*)end)->byte_start \
146
#define MAX_ID_LENGTH 32 \
150
#define SILENT (boolean)NO
151
#define COMPLAIN (boolean)YES \
153
#define OUTER_MACRO 0xFF
154
#define OUTER_UNMACRO 0xFE
155
#define UNDEFINED_MACRO 0xFD \
157
#define MAX_XLEVELS 200 \
159
#define equiv equiv_or_xref
160
#define EQUIV ASCII HUGE* \
164
#define MAC_LOOKUP(cur_val)(cur_val<MODULE_NAME? \
165
(text_pointer)(name_dir+(cur_val))->equiv:NULL) \
172
#define NOT_DEFINED 0
173
#define DEFERRED_MACRO 1 \
175
#define IMMEDIATE_MACRO 2
176
#define FILE_NAME 3 \
179
#define MCHECK(n,reason)if(mp+(n)>macrobuf_end) \
180
mbuf_full((unsigned long)(n),(outer_char*)reason) \
182
#define MAKE_16(start)(((sixteen_bits)(*start)<<8)+(sixteen_bits)(*(start+1))) \
184
#define TYPE_DESCR_LEN 20 \
187
#define save_name(a){if(xids->level>=MAX_XLEVELS) \
190
macro_err(OC("! Macro inner recursion depth exceeded"),YES); \
192
fatal(ERR_M,OC("!! BYE."),OC("")); \
194
xids->token[slevel= xids->level++]= a; \
197
#define unsave_name xids->level= slevel \
199
#define DEFINED_ERR(s){ \
200
macro_err(OC(s),YES);goto done_expanding;} \
202
#define ERR_IF_DEFINED_AT_END if(p>=end) \
203
DEFINED_ERR("! `defined' ends prematurely") \
205
#define CUR_QUOTE ((eight_bits)(single_quote||(!double_quote&&R77_or_F)? \
208
#define UNNAMED_MODULE 0
209
#define CPY_OP(token,trans)case token:cpy_op(OC(trans));break \
211
#define MUST_QUOTE(name,p,p1)must_quote(OC(name),p,p1) \
213
#define CHECK_QUOTE(var,n)if(*var++!=end_char) \
214
macro_err(OC("! Argument %d of \
215
$TRANSLIT doesn't begin with '%c'"),YES,n,end_char) \
217
#define N_ENVBUF 200 \
219
#define SAVE_ENV(aval)if(t<temp_end)*t++= XCHR(aval); \
220
else OVERFLW("Env_buf","") \
222
#define DOES_ARG_FOLLOW(c) \
223
if(*p0!=MACRO_ARGUMENT) \
226
macro_err(OC("! Macro token `#%c' must be followed by a parameter"),YES,c); \
231
#define INS_ARG_LIST pargs,m,n,&p0,&pasting,&xpn_argument,last_was_paste \
235
#define arg_must_be_constant(name) \
237
macro_err(OC("Argument of \"%s\" must be constant or string"),YES,name); \
239
#define MTEXT_SIZE 2500 \
241
#define SAVE_MTEXT(val)if(p<mtext_end)*p++= (eight_bits)(val); \
242
else OVERFLW("Mtext","") \
246
#include "typedefs.h"
260
eight_bits HUGE*tok_start;
262
sixteen_bits text_link;
275
typedef text HUGE*text_pointer;
280
eight_bits HUGE*end_field;
281
eight_bits HUGE*byte_field;
282
name_pointer name_field;
283
text_pointer repl_field;
284
sixteen_bits mod_field;
285
PARAMS global_params,params;
286
eight_bits HUGE*macro_buf,HUGE*mp,HUGE*macro_buf_end;
290
typedef output_state HUGE*stack_pointer;
295
typedef enum{BAD_TOKEN,OR_OR,AND_AND,BIT_OR,BIT_XOR,BIT_AND,LOG_EQ,LOG_LT,
296
BIT_SHIFT,PLUS_MINUS,TIMES,EXP,UNARY,HIGHEST_UNARY}PRECEDENCE;
302
PRECEDENCE precedence;
316
typedef enum{Int,Double,Id,Op}TYPE;
324
struct val HUGE*last,HUGE*next;
330
IN_COMMON boolean truncate_ids;
331
IN_COMMON unsigned short tr_max[];
332
IN_COMMON name_pointer npmax;
340
CONST ASCII HUGE*byte_start,HUGE*byte_end;
344
struct Trunc HUGE*Root;
351
size_t num[NUM_LANGUAGES];
353
ASCII HUGE*id,HUGE*id_end;
354
BP HUGE*first,HUGE*last;
355
struct Trunc HUGE*next;
363
sixteen_bits token[MAX_XLEVELS];
373
SRTN(*expnd)PROTO((int,unsigned char**));
396
#define N_MSGBUF 2000
398
#define N_MSGBUF 10000
405
EXTERN long max_texts;
406
EXTERN text HUGE*text_info;
407
EXTERN text_pointer text_end;
409
EXTERN long dtexts_max;
410
EXTERN text HUGE*txt_dinfo;
411
EXTERN text_pointer textd_end;
413
EXTERN text_pointer text_ptr,txt_dptr;
416
EXTERN long max_toks;
417
EXTERN eight_bits HUGE*tok_mem;
418
EXTERN eight_bits HUGE*tok_m_end;
420
EXTERN long max_dtoks;
421
EXTERN eight_bits HUGE*tok_dmem;
422
EXTERN eight_bits HUGE*tokd_end;
424
EXTERN eight_bits HUGE*tok_ptr,HUGE*tok_dptr;
426
EXTERN eight_bits HUGE*mx_tok_ptr,HUGE*mx_dtok_ptr;
429
EXTERN text_pointer macro_text;
433
EXTERN output_state cur_state;
436
EXTERN long stck_size;
437
EXTERN output_state HUGE*stack;
438
EXTERN stack_pointer stck_end;
439
EXTERN stack_pointer stck_ptr;
443
IN_COMMON STMT_LBL max_stmt;
445
EXTERN sixteen_bits outp_line[NUM_LANGUAGES]
447
#if(part == 0 || part == 1)
455
IN_COMMON sixteen_bits HUGE*args;
457
IN_COMMON BUF_SIZE max_margs;
461
INTERNAL_FCN internal_fcns[]= {
462
{"$$ASCII",0,i_ascii_,0xF,1,NO,NO},
463
{"$ASSERT",0,i_assert_,0xF,1,NO,NO},
464
{"$$CONST",0,i_const_,0xF,2,YES,NO},
465
{"$DEFINE",0,i_define_,0xF,1,NO,NO},
466
{"_DUMPDEF",0,i_dumpdef_,0xF,0,YES,NO},
467
{"$DUMPDEF",0,i_dumpdef_,0xF,0,YES,NO},
468
{"$$ERROR",0,i_error_,0xF,1,NO,NO},
469
{"$$EVAL",0,i_eval_,0xF,1,NO,NO},
470
{"$$GETENV",0,i_getenv_,0xF,1,NO,NO},
471
{"$IF",0,i_if_,0xF,3,NO,YES},
472
{"$IFCASE",0,i_ifcase_,0xF,1,YES,YES},
473
{"$IFDEF",0,i_ifdef_,0xF,3,NO,YES},
474
{"$IFNDEF",0,i_ifndef_,0xF,3,NO,YES},
475
{"$IFELSE",0,i_ifelse_,0xF,4,NO,YES},
476
{"_INPUT_LINE",0,i_inp_line_,0xF,0,NO,NO},
477
{"$INPUT_LINE",0,i_inp_line_,0xF,0,NO,NO},
478
{"$$KEYWORD",0,i_keyword_,0xF,1,NO,NO},
479
{"_LANGUAGE",0,i_lang_,0xF,0,NO,NO},
480
{"$LANGUAGE",0,i_lang_,0xF,0,NO,NO},
481
{"$$LC",0,i_lowercase_,0xF,1,NO,NO},
482
{"$$LEN",0,i_len_,0xF,1,NO,NO},
483
{"$$LOG",0,i_log_,0xF,2,NO,NO},
484
{"_LANGUAGE_NUM",0,i_lnum_,0xF,0,NO,NO},
485
{"$LANGUAGE_NUM",0,i_lnum_,0xF,0,NO,NO},
486
{"$M",0,i_define_,0xF,1,NO,NO},
487
{"$$META",0,i_meta_,0xF,1,NO,NO},
488
{"$$MIN_MAX",0,i_min_max_,0xF,2,YES,NO},
489
{"$$MODULE_NAME",0,i_mod_name_,0xF,0,NO,NO},
490
{"$$MODULES",0,i_modules_,0xF,1,NO,NO},
491
{"$$NARGS",0,i_nargs_,0xF,1,NO,NO},
492
{"_OUTPUT_LINE",0,i_outp_line_,0xF,0,NO,NO},
493
{"$OUTPUT_LINE",0,i_outp_line_,0xF,0,NO,NO},
494
{"$$ROUTINE",0,i_routine_,RATFOR,0,NO,NO},
495
{"_SECTION_NUM",0,i_sect_num_,0xF,0,NO,NO},
496
{"$SECTION_NUM",0,i_sect_num_,0xF,0,NO,NO},
497
{"$$SWITCH",0,i_switch_,0,0,NO,NO},
498
{"$$TM",0,i_tm_,0xF,1,NO,NO},
499
{"$$TRANSLIT",0,i_translit_,0xF,3,NO,NO},
500
{"$UNDEF",0,i_undef_,0xF,1,NO,NO},
501
{"$$UNSTRING",0,i_unstring_,0xF,1,NO,NO},
502
{"$$UC",0,i_uppercase_,0xF,1,NO,NO},
503
{"$$VERBATIM",0,i_verbatim_,0xF,1,NO,NO},
504
{"$$VERSION",0,i_version_,0xF,0,NO,NO},
505
{"_XX",0,i_xflag_,0xF,1,NO,NO},
506
{"$XX",0,i_xflag_,0xF,1,NO,NO},
512
ini_internal_fcns(VOID)
518
for(s= internal_fcns;(s->len= STRLEN(s->name))!=0;s++)
520
ASCII HUGE*p= x_to_ASCII(OC(s->name));
522
s->id= ID_NUM_ptr(np,p,p+s->len);
524
np->equiv= (ASCII HUGE*)(m= text_ptr++);
525
np->macro_type= IMMEDIATE_MACRO;
527
m->tok_start= (eight_bits HUGE*)s->expnd;
530
m->Language= s->Language;
532
m->recursive= s->recursive;
533
m->var_args= s->var_args;
541
text_ptr->tok_start= tok_mem;
546
IN_TANGLE text_pointer cur_text;
547
IN_TANGLE LINE_NUMBER nearest_line;
551
XIDS HUGE*pids[MAX_XLEVELS];
556
static boolean keep_intact;
557
IN_COMMON boolean single_quote,double_quote;
560
OUTPUT_STATE copy_state;
573
predefine_macros(VOID)
579
SAVE_MACRO("$DEFINED(macro)$EVAL(defined #!macro)");
583
SAVE_MACRO("$ABS(a)$IF((a) > 0,$EVAL(a),$EVAL(-(a)))");
587
SAVE_MACRO("$STRING(expr)$STRING0(`expr`)");
590
SAVE_MACRO("$STRING0(expr)#*expr");
594
SAVE_MACRO("$LEN(s)$$LEN(#*s)");
598
SAVE_MACRO("$VERBATIM(s)$$VERBATIM(s)");
600
SAVE_MACRO("$UNQUOTE(s)$$VERBATIM(s)");
602
SAVE_MACRO("$P $VERBATIM($IF($LANGUAGE_NUM==2 || $LANGUAGE_NUM==4, \
605
SAVE_MACRO("$PP $UNSTRING($P)");
609
SAVE_MACRO("$UNSTRING(s)$$UNSTRING(s)");
613
SAVE_MACRO("$TRANSLIT(s,from,to)$$TRANSLIT(#*s,#*from,#*to)");
618
SAVE_MACRO("$GETENV(var)$STRING($$GETENV(#*var))");
620
SAVE_MACRO("$HOME $GETENV(HOME)");
625
SAVE_MACRO("$COMMENT(cmnt)$$META(#*cmnt)");
629
SAVE_MACRO("$ERROR(text)$$ERROR(#*text)");
633
SAVE_MACRO("$ROUTINE $STRING($$ROUTINE)");
637
SAVE_MACRO("$L(name)$$LC(name)");
639
SAVE_MACRO("$U(name)$$UC(name)");
643
SAVE_MACRO("$NARGS(mname)$$NARGS(#!mname)");
647
SAVE_MACRO("$KEYWORD(s)$$KEYWORD(#*s)");
649
SAVE_MACRO("$AUTHOR $KEYWORD(Author)");
650
SAVE_MACRO("$DATE_TIME $KEYWORD(Date)");
651
SAVE_MACRO("$HEADER $KEYWORD(Header)");
652
SAVE_MACRO("$ID $KEYWORD(Id)");
653
SAVE_MACRO("$LOCKER $KEYWORD(Locker)");
654
SAVE_MACRO("$NAME $KEYWORD(Name)");
655
SAVE_MACRO("$RCSFILE $KEYWORD(RCSfile)");
656
SAVE_MACRO("$REVISION $KEYWORD(Revision)");
657
SAVE_MACRO("$SOURCE $KEYWORD(Source)");
658
SAVE_MACRO("$STATE $KEYWORD(State)");
670
mp= cur_mp= macrobuf= GET_MEM("macrobuf",mbuf_size,eight_bits);
671
macrobuf_end= macrobuf+mbuf_size;
676
argize FCN((start,end))
677
eight_bits HUGE*start C0("Beginning of the raw tokens.")
678
eight_bits HUGE*end C1("End.")
681
eight_bits HUGE*p,HUGE*last2,HUGE*start0;
689
err0_print(ERR_M,OC("! Macro must start with identifier"),0);
696
start= get_dargs(start,end,args,&k,&var_args);
697
cur_text->moffset= (unsigned char)(start-start0);
701
cur_text->var_args= var_args;
704
for(last2= p= start;p<end;p++)
713
eight_bits HUGE*q= p;
717
if(*(p+1)!=constant)continue;
721
for(i= 0;p[i]!=constant;i++)
724
tmp= GET_MEM("var arg buf",i+1,outer_char);
726
for(i= 0;p[i]!=constant;i++)
734
FREE_MEM(tmp,"var arg buf",i+1,outer_char);
737
macro_err(OC("! #%d may only be used with variable-argument \
740
while(*p!=constant)*p++= ignore;
743
macro_err(OC("! #%d is not allowed"),YES,n);
750
*(q+1)= (eight_bits)(k+(eight_bits)(n-1));
771
if(*p==0320&&*(p+1)==0)
777
if(args[l]>>8==*p&&(args[l]&0x00FF)==*(p+1))
792
for(last2++;p>last2;)
793
if(*(p-1)==012||*(p-1)==040)
804
get_dargs FCN((start,end,args,n,pvar_args))
805
eight_bits HUGE*start C0("Start of token string.")
806
eight_bits HUGE*end C0("End of token string.")
807
sixteen_bits HUGE*args C0("Array of argument tokens, to be returned.")
808
eight_bits*n C0("Number of arguments found.")
809
boolean*pvar_args C1("Return whether variable arguments")
812
sixteen_bits id_token;
816
id_token= IDENTIFIER(*start,*(start+1));
826
while(start!=end&&*start==040)
833
for(k= 0,++start;start!=end&&*start!=051;++k)
842
err0_print(ERR_M,OC("Expected ')' after ellipsis"),0);
851
err0_print(ERR_M,OC("Invalid macro parameter in definition of macro \
852
\"%s\". Token %s is invalid; \
853
can only have identifiers and commas between (...)"),2,name_of(id_token),type1(*start));
857
if(k>=(eight_bits)max_margs)
860
args[k]= MAKE_16(start);
875
err0_print(ERR_M,OC("Missing right paren in definition of macro \"%s\""),1,name_of(id_token));
881
if(*start==051&&k==0&&!*pvar_args)
889
mac_args FCN((id_token))
890
sixteen_bits id_token C1("")
894
sprintf(temp,"arguments to macro \"%s\"",(char*)name_of(id_token));
904
static outer_char type_descr[TYPE_DESCR_LEN];
909
nsprintf(type_descr,OC("'%c'"),1,XCHR(c))>=(int)(TYPE_DESCR_LEN))OVERFLW("type_descr","");}
916
p= OC("constant");break;
919
p= OC("string");break;
922
p= OC("newline");break;
928
nsprintf(type_descr,OC("'%s'"),1,p)>=(int)(TYPE_DESCR_LEN))OVERFLW("type_descr","");}
933
nsprintf(type_descr,OC("0x%x"),1,c)>=(int)(TYPE_DESCR_LEN))OVERFLW("type_descr","");}
942
get_margs0 FCN((start,end,pcur_byte,pthe_end,multilevels,
944
eight_bits HUGE*start C0("Beginning of the tokens for this \
946
eight_bits HUGE*end C0("Maximum possible end.")
947
eight_bits HUGE**pcur_byte C0("Pointer to |cur_byte|.")
948
eight_bits HUGE**pthe_end C0("End of the current buffer.")
949
boolean multilevels C0("")
950
boolean var_args C0("Does macro have variable arguments?")
951
PARGS pargs C0("Array of pointers to the actual arguments, \
953
eight_bits*n C1("Number of arguments found.")
957
boolean mac_protected;
958
sixteen_bits id_token;
960
id_token= IDENTIFIER(*start,*(start+1));
964
if(start==end&&pthe_end!=NULL)
965
end= args_to_macrobuf(end,pcur_byte,pthe_end,multilevels,var_args);
968
if(start==end||*start!=050)
970
return pargs[*n= 0]= start;
974
pargs[k= 0]= start++;
986
eight_bits c= *start;
993
if(start+1<end&&*(start+1)==054)
1003
for(start++;*start++!=c;);
1007
case begin_language:
1012
mac_protected= BOOLEAN(!mac_protected);
1026
macro_err(OC("Unexpected ')' in macro argument"),YES);
1027
else if(bal>0)bal--;
1037
macro_err(OC("Unexpected ']' in macro argument"),YES);
1038
else if(bbal>0)bbal--;
1042
if(!mac_protected&&((bal==1&&bbal==0&&(c==054))
1056
start+= (c<0250?2:4+4*1);
1066
mac_lookup FCN((cur_val))
1067
sixteen_bits cur_val C1("Current id token.")
1069
return(void*)MAC_LOOKUP(cur_val);
1075
i_ifdef_ FCN((n,pargs))
1081
eight_bits HUGE*p0= pargs[0]+1;
1084
CHK_ARGS("$IFDEF",3);
1089
macro_err(OC("! First argument of $IFDEF or $IFNDEF must be a macro"),YES);
1093
id= IDENTIFIER(p0[0],p0[1]);
1094
e= ((m= mac_lookup(id))!=NULL&&!(m->built_in));
1097
{MCHECK(pargs[2]-pargs[1]-1,"ifdef");
1098
for(p0= pargs[1]+1;p0<pargs[2];)*mp++= *p0++;}
1100
{MCHECK(pargs[3]-pargs[2]-1,"ifdef");
1101
for(p0= pargs[2]+1;p0<pargs[3];)*mp++= *p0++;}
1105
i_ifndef_ FCN((n,pargs))
1111
eight_bits HUGE*p0= pargs[0]+1;
1114
CHK_ARGS("$IFDEF",3);
1119
macro_err(OC("! First argument of $IFDEF or $IFNDEF must be a macro"),YES);
1123
id= IDENTIFIER(p0[0],p0[1]);
1124
e= ((m= mac_lookup(id))!=NULL&&!(m->built_in));
1127
{MCHECK(pargs[2]-pargs[1]-1,"ifndef");
1128
for(p0= pargs[1]+1;p0<pargs[2];)*mp++= *p0++;}
1130
{MCHECK(pargs[3]-pargs[2]-1,"ifndef");
1131
for(p0= pargs[2]+1;p0<pargs[3];)*mp++= *p0++;}
1136
i_ifelse_ FCN((n,pargs))
1141
eight_bits HUGE*pp0,HUGE*pp1,HUGE*mp0,HUGE*mp1;
1142
boolean args_identical= YES;
1144
CHK_ARGS("$IFELSE",4);
1146
pp0= xmac_text(mp0= mp,pargs[0]+1,pargs[1]);
1149
pp1= xmac_text(mp,pargs[1]+1,pargs[2]);
1164
{MCHECK(pargs[3]-pargs[2]-1,"_ifelse_");
1165
for(p0= pargs[2]+1;p0<pargs[3];)*mp++= *p0++;}
1167
{MCHECK(pargs[4]-pargs[3]-1,"_ifelse_");
1168
for(p0= pargs[3]+1;p0<pargs[4];)*mp++= *p0++;}
1173
i_if_ FCN((n,pargs))
1178
eight_bits HUGE*mp0;
1184
pp= xmac_text(mp0= mp,p0= pargs[0]+1,pargs[1]);
1189
{MCHECK(pargs[2]-pargs[1]-1,"_if_");
1190
for(p0= pargs[1]+1;p0<pargs[2];)*mp++= *p0++;}
1192
{MCHECK(pargs[3]-pargs[2]-1,"_if_");
1193
for(p0= pargs[2]+1;p0<pargs[3];)*mp++= *p0++;}
1198
i_ifcase_ FCN((n,pargs))
1199
int n C0("Total number of arguments")
1203
eight_bits HUGE*mp0;
1206
CHK_ARGS("$IFCASE",-1);
1207
pp= xmac_text(mp0= mp,pargs[0]+1,pargs[1]);
1208
ncase= neval(pp,mp);
1210
copy_nth_arg(ncase,n-3,pargs);
1215
copy_nth_arg FCN((n0,n,pargs))
1216
int n0 C0("Should be a non-negative integer")
1217
int n C0("Cases are numbered 0--n, default")
1222
if(n0<0||n0>n)n0= n+1;
1225
MCHECK(pargs[n0+1]-pargs[n0]-1,"copy_nth_arg");
1226
for(p0= pargs[n0]+1;p0<pargs[n0+1];)*mp++= *p0++;
1231
i_switch_ FCN((n,pargs))
1238
undef FCN((cur_val,warning))
1239
sixteen_bits cur_val C0("Token to be undefined.")
1240
boolean warning C1("Complain is there's an error?")
1242
name_pointer np= name_dir+cur_val;
1245
if(np->macro_type==NOT_DEFINED)
1249
macro_err(OC("WARNING: \"%s\" is already undefined"),YES,name_of(cur_val));
1257
if(np->macro_type==IMMEDIATE_MACRO)
1260
macro_err(OC("Attempting to @#undef deferred macro \"%s\" \
1261
during phase 1; consider using $UNDEF(%s)"),YES,name_of(cur_val),name_of(cur_val));
1266
macro_err(OC("Missing equivalence field while undefining \"%s\"; \
1267
this shouldn't happen!"),YES,name_of(cur_val));
1269
np->macro_type= NOT_DEFINED;
1275
np->macro_type= NOT_DEFINED;
1277
m= (text_pointer)np->equiv;
1278
m->nargs= UNDEFINED_MACRO;
1280
m->nbytes= m->moffset= 0;
1286
boolean recursive_name FCN((a,xids,last_level))
1287
sixteen_bits a C0("")
1288
XIDS HUGE*xids C0("")
1289
int last_level C1("")
1294
for(i= 0;i<last_level;i++)
1295
if(xids->token[i]==a)return YES;
1303
macro_err FCN(VA_ALIST((s,trail VA_ARGS)))
1305
CONST outer_char s[]C0("Error message about macro expansion.")
1306
int trail C2("Do we print out the expansion trail?"))
1309
outer_char HUGE*temp,HUGE*temp1,HUGE*t,HUGE*near_line;
1311
#if(NUM_VA_ARGS == 1)
1312
CONST outer_char s[];
1317
temp= GET_MEM("macro_err:temp",N_MSGBUF,outer_char);
1318
temp1= GET_MEM("macro_err:temp1",N_MSGBUF,outer_char);
1319
near_line= GET_MEM("macro_err:near_line",N_MSGBUF,outer_char);
1321
VA_START(arg_ptr,trail);
1325
char*fmt0= va_arg(arg_ptr,char*);
1327
va_arg(arg_ptr,int);
1328
vsprintf((char*)(char*)temp1,fmt0,arg_ptr);
1331
vsprintf((char*)temp1,(CONST char*)s,arg_ptr);
1338
nsprintf(near_line,OC("; near input l. %u"),1,nearest_line)>=(int)(N_MSGBUF))OVERFLW("near_line","");
1346
nsprintf(temp,OC("\"%s. (%s l. %u in %s%s.) %s"),6,temp1,phase==1?"Input":"Output",phase==1?cur_line:OUTPUT_LINE,phase==1?cur_file_name:params.OUTPUT_FILE_NAME,near_line,trail&&(xlevel>0)?"Expanding ":"")>=(int)(N_MSGBUF))OVERFLW("temp","");
1348
t= temp+STRLEN(temp);
1352
if(trail&&(xlevel>0))
1354
see_xlevel(&t,pids[i]);
1356
ntemp= STRLEN(temp);
1358
temp[ntemp+1]= '\0';
1361
OUT_MSG(to_ASCII(temp),NULL);
1365
printf("\n%s\n",(char*)to_outer((ASCII HUGE*)temp)+1);
1369
FREE_MEM(temp,"macro_err:temp",N_MSGBUF,outer_char);
1370
FREE_MEM(temp1,"macro_err:temp1",N_MSGBUF,outer_char);
1371
FREE_MEM(near_line,"macro_err:near_line",N_MSGBUF,outer_char);
1376
see_xlevel FCN((pt,p))
1377
outer_char HUGE**pt C0("")
1385
i++,sprintf((char*)(*pt),"%s",i==level?". ":", "),(*pt)+= 2)
1386
prn_mname(pt,p->token[i]);
1391
prn_mname FCN((pt,token))
1392
outer_char HUGE**pt C0("")
1393
sixteen_bits token C1("")
1397
CONST ASCII HUGE*end;
1403
for(p= np->byte_start;p<end;)
1404
*(*pt)++= XCHR(*p++);
1409
i_inp_line_ FCN((n,pargs))
1413
num_to_mbuf(n,pargs,"$INPUT_LINE",0,"nearest line",nearest_line);
1417
i_outp_line_ FCN((n,pargs))
1421
num_to_mbuf(n,pargs,"$OUTPUT_LINE",0,"output line",OUTPUT_LINE);
1426
num_to_mbuf FCN((n,pargs,built_in_name,num_args,num_descr,num))
1429
CONST char*built_in_name C0("")
1431
CONST char*num_descr C0("")
1434
CHK_ARGS(built_in_name,num_args);
1436
MCHECK0(20,num_descr);
1439
sprintf((char*)mp,"%d",num);
1440
to_ASCII((outer_char HUGE*)mp);
1448
x0macro FCN((p,end,xids,pcur_byte,pthe_end,multilevels))
1449
eight_bits HUGE*p C0("Present position in the input buffer.")
1450
eight_bits HUGE*end C0("Last filled position of the input \
1452
XIDS HUGE*xids C0("")
1453
eight_bits HUGE**pcur_byte C0("Pointer to |cur_byte|.")
1454
eight_bits HUGE**pthe_end C0("End of buffer.")
1455
boolean multilevels C1("")
1461
eight_bits HUGE*p0,HUGE*p1;
1462
eight_bits HUGE*HUGE*pargs= GET_MEM("pargs",max_margs,eight_bits HUGE*);
1463
boolean must_paste= NO,pasting= NO;
1464
int level0= xids->level;
1465
boolean mac_protected= NO;
1474
if(p==end&&a0==012)break;
1481
mac_protected= BOOLEAN(!mac_protected);
1492
if(!TOKEN1(*mp= *p++))
1494
MCHECK(1,"id prefix");
1497
MCHECK(1,"8-bit token");
1503
eight_bits HUGE*p00;
1506
for(p00= p;p<end;p++)
1507
if(*p!=040&&*p!=011)break;
1509
if(p<end&&*p==stringg)
1511
eight_bits mchar= *(mp-2);
1512
eight_bits pchar= *(p+1);
1514
if((mchar==047||mchar==042)&&
1515
(pchar==047||pchar==042))
1530
case begin_language:
1531
MCHECK(2,"dot_const");
1546
a= IDENTIFIER(a0,a1= *p++);
1552
MCHECK(6,"defined stuff");
1558
ERR_IF_DEFINED_AT_END;
1559
if(TOKEN1(a0= *p++))
1561
if(a0!=050)DEFINED_ERR("! Invalid token after `defined'")
1564
ERR_IF_DEFINED_AT_END;
1565
if(TOKEN1(a0= *p++))DEFINED_ERR("! Invalid argument of `defined'")
1572
ERR_IF_DEFINED_AT_END;
1573
if(TOKEN1(a0= *p++))
1574
if(a0!=051)DEFINED_ERR("! Missing ')' after `defined'")
1593
if((m= MAC_LOOKUP(a))!=NULL)
1596
MCHECK(2,"protected macro token");
1600
else if(recursive_name(a,xids,level0))
1604
CONST ASCII HUGE*end;
1609
copy_id(np->byte_start,end,"recursive macro name");
1631
eight_bits HUGE*mp0= NULL,HUGE*mp1,HUGE*m_start,HUGE*m_end;
1632
boolean xpn_argument= YES;
1633
boolean last_was_paste;
1638
if(m->nargs>0||m->var_args)
1639
p= get_margs0(p-2,end,pcur_byte,pthe_end,multilevels,
1640
(boolean)(m->var_args),pargs,&n);
1642
if((!m->var_args&&n!=m->nargs)||(m->var_args&&n<m->nargs))
1645
macro_err(OC("! Actual number of WEB macro arguments (%u) does not match \
1646
number of def'n (%u); %s"),YES,n,m->nargs,n<m->nargs?"missing ones assumed to be NULL":
1647
"extra ones discarded");
1654
pargs[n+1]= pargs[n]+1;
1665
(*(SRTN(*)(int,unsigned char**))(m->tok_start))(n,pargs);
1671
p0= m->tok_start+m->moffset;
1672
p1= m->tok_start+m->nbytes;
1676
if(TOKEN1(a= *p0++))
1679
if(!(a==043&&*p0==056))last_was_paste= NO;
1681
if(p0==p1&&a==012)break;
1699
macro_err(OC("! Missing internal function name after #&"),YES);
1702
if(TOKEN1(a= *p0++))
1703
macro_err(OC("! Identifier must follow #&"),YES);
1704
else if(!x_int_fcn(id= IDENTIFIER(a,*p0++),n,pargs))
1706
macro_err(OC("! Internal function name \"%s\" not defined"),YES,name_of(id));
1724
macro_err(OC("Expected constant after \"#:\""),YES);
1730
for(i= 0;p0[i]!=constant;i++)
1733
tmp= GET_MEM("stmt number",i+1,outer_char);
1736
for(i= 0;*p0!=constant;i++,p0++)
1743
FREE_MEM(tmp,"stmt number",i+1,outer_char);
1748
macro_err(OC("! Invalid statement number offset (%ld) after #:; 1 assumed"),YES,n);
1752
if(n>max_n)max_n= n;
1754
MCHECK(2,"|constant|");
1758
nsprintf((outer_char*)mp,OC("%lu"),1,max_stmt+n-1);
1759
MCHECK(m,"stmt label");
1760
to_ASCII((outer_char HUGE*)mp);
1770
if(*p0==MACRO_ARGUMENT)xpn_argument= NO;
1772
macro_err(OC("! Macro token '#!' must be followed by \
1778
DOES_ARG_FOLLOW('\'');
1783
DOES_ARG_FOLLOW('\"');
1787
DOES_ARG_FOLLOW('*');
1791
case MACRO_ARGUMENT:
1794
eight_bits HUGE*begin;
1799
for(begin= pargs[*p0]+1;*begin=='\0';begin++)
1804
MCHECK(1,"stringg");*mp++= stringg
1808
do_quote= BOOLEAN(!keep_intact||*begin!=stringg||begin[1]!=CUR_QUOTE);
1819
str_to_mb(begin,pargs[*p0+1],YES);
1833
MCHECK(1,"stringg");*mp++= stringg
1837
single_quote= double_quote= NO;
1845
eight_bits HUGE*mp0;
1849
MCHECK(4,"tokens for number of variable arguments");
1853
nsprintf((outer_char*)mp0,OC("%d"),1,n-m->nargs);
1854
to_ASCII((outer_char HUGE*)mp0);
1863
expanded|= ins_arg(0173,0175,INS_ARG_LIST);
1870
expanded|= ins_arg(0133,0135,INS_ARG_LIST);
1879
boolean next_is_paste= BOOLEAN(*p0==paste);
1881
for(k= m->nargs;k<n;k++)
1883
pasting= cp_macro_arg(pargs,k,n,&xpn_argument,
1884
(boolean)(last_was_paste&&k==m->nargs),
1885
(boolean)(next_is_paste&&k==(eight_bits)(n-1)));
1889
if(*(mp-1)==054)mp--;
1899
macro_err(OC(_Xx("! Invalid token 0x%x ('%c') after '#'")),YES,*p0,isprint(*p0)?*p0:'.');
1909
*mp++= (eight_bits)a;
1913
if(!TOKEN1(*mp= *p0++))
1915
MCHECK(1,"id prefix");
1918
MCHECK(1,"8-bit token");
1920
while(*mp++!=(eight_bits)a);
1925
case begin_language:
1926
MCHECK(2,"dot_const");
1927
*mp++= (eight_bits)a;
1933
MCHECK(1,"single-byte token");
1934
if((*mp++= (eight_bits)a)==paste)
1935
last_was_paste= must_paste= YES;
1944
eight_bits k= *p0++;
1946
if(a==MACRO_ARGUMENT)
1948
pasting= cp_macro_arg(pargs,k,n,&xpn_argument,
1949
last_was_paste,(boolean)(*p0==paste));
1955
MCHECK(2,"nonargument macro token");
1957
*mp++= (eight_bits)a;
1960
if(a==0320&&k=='\0')
1962
MCHECK(4,"line info");
1984
copy_and_paste(m_start,m_end);
1987
for(mp1= mp,mp= m_start,mp0= m_end;mp0<mp1;)
1996
xpn_before(m_start,xids,pcur_byte,pthe_end,multilevels);
2012
MCHECK(2,"ordinary id");
2022
MCHECK(n,"module defn");
2034
FREE_MEM(pargs,"pargs",max_margs,eight_bits HUGE*);
2041
dbg_macs FCN((n,start,end))
2042
sixteen_bits n C0("")
2043
eight_bits HUGE*start C0("")
2044
eight_bits HUGE*end C1("")
2046
printf("%lu = (0x%x->0x%x) <<%lu>>: ",
2047
end-start,start,end,start-macrobuf);
2054
CONST outer_char HUGE*s C1("String such as \.{++}.")
2061
copy_state= MISCELLANEOUS;
2066
str_to_mb FCN((begin_arg,end_arg,esc_chars))
2067
CONST eight_bits HUGE*begin_arg C0("Beginning of string.")
2068
CONST eight_bits HUGE*end_arg C0("End of string.")
2069
boolean esc_chars C1("Insert escape characters?")
2071
eight_bits HUGE*mp0= mp;
2074
copy_state= MISCELLANEOUS;
2076
while(begin_arg<end_arg)
2078
if(TOKEN1(c= *begin_arg++))
2089
CPY_OP(plus_plus,"++");
2090
CPY_OP(minus_minus,"--");
2091
CPY_OP(minus_gt,C_LIKE(language)?"->":".EQV.");
2097
CPY_OP(not_eq,"!=");
2098
CPY_OP(and_and,"&&");
2100
CPY_OP(star_star,"**");
2101
CPY_OP(slash_slash,"//");
2102
CPY_OP(ellipsis,C_LIKE(language)?"...":".XOR.");
2107
ASCII*symbol= dots[*begin_arg++].symbol;
2109
cpy_op(to_outer(symbol));
2110
to_ASCII((outer_char*)symbol);
2118
copy_state= UNBREAKABLE;
2122
if(copy_state==NUM_OR_ID)
2125
MCHECK(1,"' '");*mp++= 040;
2131
if(!keep_intact&&c==stringg)esc_certain_chars(*begin_arg++,YES);
2134
while(*begin_arg!=(eight_bits)c)
2136
MCHECK(1,"constant");
2137
*mp++= *begin_arg++;
2140
if(!keep_intact&&c==stringg)
2141
esc_certain_chars((sixteen_bits)*(--mp),YES);
2148
copy_state= NUM_OR_ID;
2154
if(!keep_intact&&c==stringg)esc_certain_chars(*begin_arg++,YES);
2157
while(*begin_arg!=(eight_bits)c)
2159
MCHECK(1,"constant");
2160
*mp++= *begin_arg++;
2163
if(!keep_intact&&c==stringg)
2164
esc_certain_chars((sixteen_bits)*(--mp),YES);
2171
copy_state= MISCELLANEOUS;
2190
esc_certain_chars(c,esc_chars);
2191
if(copy_state!=VERBATIM)copy_state= MISCELLANEOUS;
2201
if(copy_state==NUM_OR_ID)
2204
MCHECK(1,"' '");*mp++= 040;
2209
if(c==MACRO_ARGUMENT)
2212
outer_char temp[10];
2216
nsprintf(temp,OC("$%d"),1,*begin_arg++);
2227
c= IDENTIFIER(c,*begin_arg++);
2229
switch(c/MODULE_NAME)
2236
ASCII HUGE*pc= np->byte_start;
2240
CONST ASCII HUGE*end;
2243
copy_id((CONST ASCII HUGE*)pc,end,"copied id");
2247
s= ((BP HUGE*)pc)->Root;
2248
copy_id(s->id,s->id_end,"copied id");
2256
MCHECK(5,"macro name");
2265
if(np->equiv!=(EQUIV)text_info)
2269
ASCII HUGE*pc= np->byte_start;
2273
CONST ASCII HUGE*end;
2276
copy_id((CONST ASCII HUGE*)pc,end,"copied id");
2280
s= ((BP HUGE*)pc)->Root;
2281
copy_id(s->id,s->id_end,"copied id");
2286
else if(c!=UNNAMED_MODULE)
2304
copy_state= NUM_OR_ID;
2314
esc_certain_chars FCN((c,esc_chars))
2315
sixteen_bits c C0("Character to be maybe escaped.")
2316
boolean esc_chars C1("Do we escape them?")
2319
if(C_LIKE(language))
2331
MCHECK(1,"doubled quote");
2332
*mp++= (eight_bits)c;
2341
*mp++= (eight_bits)c;
2346
MCHECK(1,"escaped character");
2347
*mp++= (eight_bits)c;
2352
i_len_ FCN((n,pargs))
2360
m= (int)(pargs[1]-pargs[0]-5);
2365
nsprintf((outer_char HUGE*)mp,OC("%d"),1,m);
2366
MCHECK(num,"_len_");
2367
to_ASCII((outer_char HUGE*)mp);
2373
i_verbatim_ FCN((n,pargs))
2377
eight_bits HUGE*p,delim[2];
2378
eight_bits quote_char[3];
2380
CHK_ARGS("$VERBATIM",1);
2382
if(*(p= pargs[0]+1)!=stringg)
2384
MUST_QUOTE("$VERBATIM",p,pargs[1]);
2388
STRNCPY(delim,"\0\0",2);
2389
STRNCPY(quote_char,"\42\0\0",3);
2410
MCHECK(1,"string token");
2416
if(STRSPN(delim,quote_char))
2423
MCHECK(1,"verbatim token");
2428
if(STRSPN(delim,quote_char))
2434
i_unstring_ FCN((n,pargs))
2438
eight_bits HUGE*p,delim[2];
2439
eight_bits quote_char[3];
2441
CHK_ARGS("$UNSTRING",1);
2443
if(*(p= pargs[0]+1)!=stringg)
2445
MUST_QUOTE("$UNSTRING",p,pargs[1]);
2449
STRNCPY(delim,"\0\0",2);
2450
STRNCPY(quote_char,"\42\0\0",3);
2476
if(STRSPN(delim,quote_char))
2483
MCHECK(1,"verbatim token");
2488
if(STRSPN(delim,quote_char))
2494
must_quote FCN((name,p,p1))
2495
CONST outer_char*name C0("")
2496
eight_bits HUGE*p C0("")
2497
eight_bits HUGE*p1 C1("")
2500
macro_err(OC("! Argument of %s must be a quoted string"),YES,name);
2503
MCHECK(p1-p,"copy quotes");
2504
while(p<p1)*mp++= *p++;
2509
i_translit_ FCN((n,pargs))
2515
CHK_ARGS("$TRANSLIT",3);
2518
if(*(pargs[k]+1)!=stringg)
2519
macro_err(OC("! Argument %d of $TRANSLIT \
2520
must be a string"),YES,k);
2522
translit((ASCII HUGE*)(pargs[0]+2),
2523
(ASCII HUGE*)(pargs[1]+2),
2524
(ASCII HUGE*)(pargs[2]+2));
2529
translit FCN((s,from,to))
2530
CONST ASCII HUGE*s C0("String to be transliterated")
2531
CONST ASCII HUGE*from C0("Characters to replace")
2532
CONST ASCII HUGE*to C1("Replace by")
2534
short code[128],i,n;
2535
ASCII end_char= *s++;
2537
ASCII esc_achar PROTO((CONST ASCII HUGE*HUGE*));
2539
CHECK_QUOTE(from,1);
2543
MCHECK(1,"stringg");*mp++= stringg
2552
while(*(to+1)!=stringg)
2554
if(*(from+1)==stringg)break;
2557
if((cfrom= *from++)==0134)cfrom= esc_achar(&from);
2558
if((cto= *to++)==0134)cto= esc_achar(&to);
2565
if(*(from+1)!=stringg)
2566
while(*(from+1)!=stringg)
2568
if((cfrom= *from++)==0134)cfrom= esc_achar(&from);
2574
while(*(s+1)!=stringg)
2576
if((c= *s++)==0134)c= esc_achar(&s);
2578
if((n= code[c])==-1)continue;
2579
MCHECK(1,"_translit_");
2580
*mp++= (eight_bits)n;
2584
MCHECK(1,"stringg");*mp++= stringg
2591
i_getenv_ FCN((n,pargs))
2596
outer_char*pvar,HUGE*t;
2597
outer_char HUGE*temp,HUGE*temp_end;
2602
macro_err(OC("Sorry, this machine doesn't support getenv"),YES);
2605
CHK_ARGS("$GETENV",1);
2608
temp= GET_MEM("_getenv_:temp",N_ENVBUF,outer_char);
2609
temp_end= temp+N_ENVBUF;
2611
for(p= (ASCII HUGE*)(pargs[0]+3),t= temp;*(p+1)!=stringg;)
2616
if((pvar= GETENV((CONST char*)temp))!=NULL)mcopy(pvar);
2618
FREE_MEM(temp,"_getenv_:temp",N_ENVBUF,outer_char);
2624
boolean cp_macro_arg FCN((pargs,k,n,pxpn_argument,
2625
last_was_paste,next_is_paste))
2627
eight_bits k C0("Current argument to process")
2629
boolean HUGE*pxpn_argument C0("")
2630
boolean last_was_paste C0("")
2631
boolean next_is_paste C1("")
2634
eight_bits HUGE*begin_arg,HUGE*end_arg,HUGE*mp0= NULL;
2641
pargs[k+1]= pargs[n]+1;
2644
begin_arg= pargs[k]+1;
2648
while(*begin_arg==012)begin_arg++;
2650
end_arg= pargs[k+1];
2654
if(last_was_paste||next_is_paste)pasting= YES;
2664
if(begin_arg==end_arg)
2668
MCHECK(1,"null character");
2674
MCHECK(end_arg-begin_arg,"argument tokens");
2675
while(begin_arg<end_arg)*mp++= *begin_arg++;
2684
*pxpn_argument= YES;
2686
xpn_before(mp0,NULL,NULL,NULL,NO);
2692
boolean ins_arg FCN((cleft,cright,
2693
pargs,m,n,pp0,ppasting,pxpn_argument,last_was_paste))
2697
text_pointer m C0("")
2699
eight_bits HUGE*HUGE*pp0 C0("")
2700
boolean*ppasting C0("")
2701
boolean*pxpn_argument C0("")
2702
boolean last_was_paste C1("")
2705
boolean next_is_paste= BOOLEAN(*(*pp0)==paste);
2707
eight_bits HUGE*mp0= mp;
2708
eight_bits HUGE*p00= (*pp0);
2709
boolean fixed= BOOLEAN(cleft==0133);
2716
else if(TOKEN1(*(*pp0)))(*pp0)++;
2719
pp= xmac_text(mp0,p00,(*pp0)++);
2741
nsprintf(temp,OC("#%c0%c"),3,5,XCHR(cleft),XCHR(cright));
2746
nsprintf((outer_char*)mp0,OC("%d"),1,n-(fixed?0:m->nargs));
2747
to_ASCII((outer_char HUGE*)mp0);
2751
*ppasting= cp_macro_arg(pargs,(eight_bits)(k-1+(fixed?0:m->nargs)),
2752
n,pxpn_argument,last_was_paste,next_is_paste);
2759
xpn_before FCN((mp0,xids,pcur_byte,pthe_end,multilevels))
2760
eight_bits HUGE*mp0 C0("Remember this end of |macro_buf|.")
2761
XIDS HUGE*xids C0("")
2762
eight_bits HUGE**pcur_byte C0("Pointer to |cur_byte|.")
2763
eight_bits HUGE**pthe_end C0("End of buffer.")
2764
boolean multilevels C1("")
2766
eight_bits HUGE*mp1;
2768
mp1= xmac_buf(mp0,xids,pcur_byte,pthe_end,multilevels);
2780
x_int_fcn FCN((id,n,pargs))
2781
sixteen_bits id C0("Token for internal function.")
2782
int n C0("Number of arguments")
2783
PARGS pargs C1("Array of pointers to arguments.")
2785
INTERNAL_FCN HUGE*f;
2787
for(f= internal_fcns;f->len!=0;f++)
2790
(*f->expnd)(n,pargs);
2800
copy_and_paste FCN((m_start,m_end))
2801
eight_bits HUGE*m_start C0("Start of range.")
2802
eight_bits HUGE*m_end C1("End of range.")
2804
eight_bits HUGE*mp0;
2806
eight_bits HUGE*m_last= m_start;
2808
for(mp0= m_start;mp0<m_end;)
2810
if(TOKEN1(a0= *mp0))
2818
paste1(m_last,m_start);
2819
mp0= paste1(++mp0,m_end);
2822
divert((ASCII HUGE*)p,(ASCII HUGE*)mp,STOP);
2824
scan_repl(macro,STOP);
2828
m_last= copy_and_paste(cur_text->tok_start,tok_ptr);
2832
mx_tok_ptr= tok_ptr;
2833
tok_ptr= text_ptr->tok_start;
2851
MCHECK(1,"|constant| or |stringg|");
2858
|constant| or |stringg|");
2865
case begin_language:
2866
MCHECK(2,"dot_const");
2872
MCHECK(1,"ASCII token");
2881
MCHECK(2,"two-byte token");
2882
*mp++= *mp0++;*mp++= *mp0++;
2891
paste1 FCN((p0,begin_or_end))
2892
eight_bits HUGE*p0 C0("Beginning of tokens to be expanded.")
2893
eight_bits HUGE*begin_or_end C1("")
2898
if(p0==begin_or_end)
2901
macro_err(OC("! Missing argument to token-paste operation. Null assumed"),YES);
2905
if(TOKEN1(a0= *p0++))
2913
while((a1= *p0++)!=a0)
2915
MCHECK(1,"stuff between tokens");
2921
case begin_language:
2922
MCHECK(2,"dot_const");
2928
MCHECK(1,"default ASCII token");
2934
a= IDENTIFIER(a0,*p0++);
2944
ASCII HUGE*pc= np->byte_start;
2948
CONST ASCII HUGE*end;
2951
copy_id((CONST ASCII HUGE*)pc,end,"copied id");
2955
s= ((BP HUGE*)pc)->Root;
2956
copy_id(s->id,s->id_end,"copied id");
2970
copy_id FCN((start,end,descr))
2971
CONST ASCII HUGE*start C0("Beginning of identifier name.")
2972
CONST ASCII HUGE*end C0("End of identifier name.")
2973
CONST char*descr C1("")
2977
MCHECK(end-start,descr);
2979
for(j= start;j<end;)
2980
*mp++= (eight_bits)(*j++);
2985
mbuf_full FCN((n,reason))
2986
unsigned long n C0("Number of bytes requested.")
2987
CONST outer_char reason[]C1("Reason for request.")
2990
macro_err(OC("! Macro buffer full; %lu byte(s) requested for %s"),YES,n,reason);
2991
OVERFLW("macro buffer bytes","mb");
2996
mcheck0 FCN((n,reason))
2997
unsigned long n C0("Number of bytes requested.")
2998
CONST outer_char reason[]C1("Reason for request.")
3005
xmacro FCN((macro_text,pcur_byte,pthe_end,multilevels,mp0))
3006
text_pointer macro_text C0("")
3007
eight_bits HUGE**pcur_byte C0("Pointer to |cur_byte|.")
3008
eight_bits HUGE**pthe_end C0("End of buffer.")
3009
boolean multilevels C0("Read args through many levels?")
3010
eight_bits HUGE*mp0 C1("Build the expansion beginning here in \
3013
eight_bits HUGE*macro_start;
3014
extern long cur_val;
3019
MCHECK(2,"macro token");
3021
if(macro_text->built_in)
3023
*mp++= LEFT(cur_val,ID0);
3024
*mp++= RIGHT(cur_val);
3028
macro_start= macro_text->tok_start;
3029
*mp++= *macro_start++;*mp++= *macro_start++;
3034
if(macro_text->nargs>0||macro_text->var_args)
3035
mp= args_to_macrobuf(mp,pcur_byte,pthe_end,multilevels,
3036
(boolean)(macro_text->var_args));
3038
return xmac_buf(mp0,NULL,pcur_byte,pthe_end,multilevels);
3045
args_to_macrobuf FCN((mp,pcur_byte,pthe_end,
3046
multilevels,var_args))
3047
eight_bits HUGE*mp C0("Next available position in |macro_buf|.")
3048
eight_bits HUGE**pcur_byte C0("Pointer to |cur_byte|.")
3049
eight_bits HUGE**pthe_end C0("End of buffer.")
3050
boolean multilevels C0("Read through many levels?")
3051
boolean var_args C1("Does macro have variable args?")
3054
sixteen_bits id_token;
3057
id_token= IDENTIFIER(*(mp-2),*(mp-1));
3062
if(*pcur_byte==*pthe_end)
3064
if(!(multilevels&&pop_level()))
3067
macro_err(OC("! No ')' in call to macro \"%s\""),YES,name_of(id_token));
3072
MCHECK(1,"arg to macrobuf");
3073
c= *mp++= *(*pcur_byte)++;
3083
MCHECK(1,"string arg");
3084
*mp= *(*pcur_byte)++;
3086
while(*mp++!=stringg);
3090
case begin_language:
3091
MCHECK(1,"dot const");
3092
*mp++= *(*pcur_byte)++;
3100
if(bal==0&&!var_args)
3103
macro_err(OC("! Missing '(' in call to macro \"%s\""),YES,name_of(id_token));
3118
n= (c<0250?1:3+4*1);
3119
MCHECK(n,"second id token");
3120
while(n-->0)*mp++= *(*pcur_byte)++;
3132
xmac_buf FCN((mp0,old_xids,pcur_byte,pthe_end,multilevels))
3133
eight_bits HUGE*mp0 C0("Text to be expanded begins here.")
3134
XIDS HUGE*old_xids C0("")
3135
eight_bits HUGE**pcur_byte C0("Pointer to |cur_byte|.")
3136
eight_bits HUGE**pthe_end C0("End of buffer.")
3137
boolean multilevels C1("")
3139
eight_bits HUGE*p,HUGE*p1;
3145
if(xlevel>=MAX_XLEVELS)
3148
macro_err(OC("! Macro outer recursion depth exceeded"),YES);
3150
fatal(ERR_M,OC("!! BYE."),OC(""));
3153
pid= pids[xlevel++]= old_xids?old_xids:&xids;
3157
x0macro(p,p1,pid,pcur_byte,pthe_end,multilevels);
3167
xmac_text FCN((mp0,start,end))
3168
eight_bits HUGE*mp0 C0("")
3169
eight_bits HUGE*start C0("")
3170
eight_bits HUGE*end C1("")
3173
for(mp= mp0;start<end;)
3177
return xmac_buf(mp0,NULL,NULL,NULL,NO);
3182
i_meta_ FCN((n,pargs))
3188
CHK_ARGS("$COMMENT",1);
3192
if(!(*p==constant||*p==stringg))
3194
arg_must_be_constant("$COMMENT");
3200
static eight_bits begin_C_meta[]= {constant,057,052,constant,'\0'};
3204
if(C_LIKE(language))
3206
MCHECK0(4,"begin_C_meta");
3207
for(p= begin_C_meta;*p;)*mp++= *p++;
3211
MCHECK0(2,"begin_meta");
3219
*(p+1)= *(pargs[1]-2)= 040;
3223
MCHECK0(1,"_meta_");
3230
static eight_bits end_C_meta[]= "\52\57";
3234
if(C_LIKE(language))
3236
MCHECK0(2,"end_C_meta");
3237
for(p= end_C_meta;*p;)*mp++= *p++;
3241
MCHECK0(1,"end_meta");
3251
i_assert_ FCN((n,pargs))
3257
eight_bits HUGE*mp0;
3260
CHK_ARGS("$ASSERT",1);
3262
pp= xmac_text(mp0= mp,p= pargs[0]+1,pargs[1]);
3269
mp= str_to_mb(p,pargs[1],YES);
3272
macro_err(OC("! $ASSERT(%s) failed"),NO,to_outer((ASCII HUGE*)mp));
3274
fatal(ERR_M,OC(""),OC("Processing ABORTED!"));
3279
i_error_ FCN((n,pargs))
3284
eight_bits HUGE*t,HUGE*p,HUGE*temp;
3286
CHK_ARGS("$ERROR",1);
3290
if(!(*p==constant||*p==stringg))
3292
arg_must_be_constant("$ERROR");
3296
temp= GET_MEM("_error_:temp",N_MSGBUF,eight_bits);
3298
for(c= *p++,t= temp;*p!=c;)*t++= *p++;
3302
macro_err(OC("%cUSER ERROR: %s"),NO,beep(1),to_outer((ASCII HUGE*)temp));
3303
FREE_MEM(temp,"_error_:temp",N_MSGBUF,eight_bits);
3308
i_routine_ FCN((n,pargs))
3313
CONST ASCII HUGE*f,HUGE*end;
3315
CHK_ARGS("$ROUTINE",0);
3317
if(!(is_RATFOR_(language)))return;
3319
confusion(OC("_routine_"),OC("Language shouldn't be Ratfor here"));
3328
np= name_dir+cur_fcn;
3329
end= proper_end(np);
3331
MCHECK0(end-np->byte_start,"_routine_");
3332
for(f= np->byte_start;f<end;)
3339
i_lowercase_ FCN((n,pargs))
3343
eight_bits HUGE*p= pargs[0]+1,HUGE*p1= pargs[1];
3349
MUST_QUOTE("$L",p,p1);
3353
MCHECK(p1-p,"lowercase");
3356
*mp++= A_TO_LOWER(*p);
3360
i_uppercase_ FCN((n,pargs))
3364
eight_bits HUGE*p= pargs[0]+1,HUGE*p1= pargs[1];
3370
MUST_QUOTE("$U",p,p1);
3374
MCHECK(p1-p,"uppercase");
3377
*mp++= A_TO_UPPER(*p);
3382
i_nargs_ FCN((n,pargs))
3387
eight_bits*pa= pargs[0]+1;
3389
if((m= MAC_LOOKUP(IDENTIFIER(pa[0],pa[1])))==NULL)
3392
macro_err(OC("! Argument of $NARGS is not a WEB macro"),YES);
3395
else put_long((long)m->nargs);
3403
outer_char temp[100];
3407
nsprintf(temp,OC("%ld"),1,l);
3418
chk_args FCN((name,proper_num,actual_num,pargs))
3419
outer_char*name C0("")
3420
int proper_num C0("")
3421
int actual_num C0("")
3426
if(actual_num!=proper_num)
3428
macro_err(OC("Built-in macro %s should be called with %d \
3429
argument(s), not %d"),NO,name,proper_num,actual_num);
3435
see_macro FCN((p0,p1))
3436
CONST eight_bits HUGE*p0 C0("Beginning of token list.")
3437
CONST eight_bits HUGE*p1 C1("End of token list.")
3441
sixteen_bits HUGE*tokens;
3444
num_tokens= PTR_DIFF(int,p1,p0);
3446
tokens= GET_MEM("see_macro:tokens",num_tokens,sixteen_bits);
3447
mtext= GET_MEM("see_macro:mtext",MTEXT_SIZE,ASCII);
3449
k= rcvr_macro(mtext,tokens,p0,p1);
3453
printf(_Xx("%x "),tokens[l]);
3455
printf("\"\n== \"");
3456
for(q0= mtext;q0<mtext+k;++q0)
3460
FREE_MEM(mtext,"see_macro:mtext",MTEXT_SIZE,ASCII);
3461
if(num_tokens)FREE_MEM(tokens,"see_macro:tokens",num_tokens,sixteen_bits);
3466
rcvr_macro FCN((mtext,tokens,p0,p1))
3467
ASCII HUGE*mtext C0("Holds readable translation of the text.")
3468
sixteen_bits HUGE*tokens C0("Slightly translated tokens.")
3469
CONST eight_bits HUGE*p0 C0("")
3470
CONST eight_bits HUGE*p1 C1("")
3472
ASCII HUGE*mtext_end= mtext+MTEXT_SIZE;
3478
for(k= 0,p= mtext;p0<p1;k++)
3480
if(TOKEN1(a= *p0++))
3484
SAVE_MTEXT(043);SAVE_MTEXT(043);
3491
else if(a==MACRO_ARGUMENT)
3494
a= (sixteen_bits)(-(*p0));
3495
SAVE_MTEXT(*p0+++060);
3499
a= IDENTIFIER(a,*p0++);
3503
CONST ASCII HUGE*end;
3504
name_pointer np= name_dir+a;
3508
for(j= np->byte_start;j<end;++j)
3517
if(tokens)tokens[k]= a;
3525
i_xflag_ FCN((n,pargs))
3529
eight_bits HUGE*p= pargs[0]+1;
3530
outer_char temp[100],*t= temp;
3537
macro_err(OC("Argument of $XX is not a numerical constant"),NO);
3551
i_dumpdef_ FCN((n,pargs))
3556
eight_bits HUGE*p,HUGE*mp0,HUGE*mp1,HUGE*mp2;
3558
extern long cur_val;
3559
eight_bits HUGE*q0,HUGE*q1;
3560
ASCII HUGE*mtext= GET_MEM("rcvr_macro:mtext",MTEXT_SIZE,ASCII);
3561
ASCII HUGE*mx,HUGE*mx0;
3564
CHK_ARGS("$DUMPDEF",INT_MIN);
3577
while(IS_WHITE(*p)||*p==012)p++;
3579
a= IDENTIFIER(*p,*(p+1));
3581
if((m= MAC_LOOKUP(a))==NULL)
3583
str_to_mb(p,pargs[k+1],NO);
3584
printf("NOT WEB MACRO: %s\n",(char*)to_outer((ASCII*)mp0));
3594
for(mx= mtext,mx0= np->byte_start;mx0<(np+1)->byte_start;)
3604
STRCPY(mp0,"<built-in>");
3605
mp= mp0+STRLEN(mp0)+1;
3609
q0= m->tok_start+m->moffset;
3610
q1= m->tok_start+m->nbytes;
3612
str_to_mb(q0,q1,NO);
3614
to_outer((ASCII*)mp0);
3618
printf("%s",(char*)mtext);
3620
if(m->nargs||m->var_args)
3625
for(n= 0;n<m->nargs;n++)
3626
printf("$%d%s",(int)n,
3627
CHOICE(n==(eight_bits)(m->nargs-1),"",","));
3628
if(m->var_args)printf("%s...",
3629
CHOICE(m->nargs,",",""));
3633
printf(" = %s\n",(char*)(mp= mp0));
3639
str_to_mb(p,pargs[k+1],NO);
3641
to_outer((ASCII*)mp0);
3644
mp1= xmacro(m,&p,&pargs[k+1],NO,mp);
3647
str_to_mb(mp1,mp,NO);
3649
to_outer((ASCII*)mp2);
3651
printf("%s%s = %s\n",(char*)mtext,(char*)mp0,(char*)(mp= mp2));
3655
err0_print(ERR_M,OC("Extra text after macro call"),0);
3665
FREE_MEM(mtext,"_dumpdef_:mtext",MTEXT_SIZE,ASCII);
3670
i_keyword_ FCN((n,pargs))
3674
eight_bits HUGE*p= pargs[0]+1,HUGE*p1= pargs[1];
3676
CHK_ARGS("$KEYWORD",1);
3680
MUST_QUOTE("$KEYWORD",p,p1);
3684
MCHECK(1,"stringg0");
3687
x_keyword(&mp,macrobuf_end,p,p1-1,YES,YES,WEB_FILE);
3689
MCHECK(1,"stringg1");