3
created with UNIX on "Thursday, September 24, 1998 at 16:12." \
4
COMMAND LINE: "Web/ftangle Web/ratfor -A -# --F -= 1.62/Web/ratfor.c"\
5
RUN TIME: "Friday, September 25, 1998 at 8:02."\
6
WEB FILE: "Web/ratfor.web"\
12
#define stringg (eight_bits)02 \
14
#define constant (eight_bits)03
15
#define begin_Xmeta or_or
16
#define end_Xmeta star_star
17
#define cdir (eight_bits)06
18
#define colon_colon (eight_bits)011 \
20
#define join (eight_bits)0177 \
23
#define TOKEN1(a)((a)<ID0) \
25
#define MACRO_ARGUMENT 0377 \
29
#define MODULE_NAME 10240
30
#define MODULE_NUM 20480
31
#define LINE_NUM 53248L \
33
#define IDENTIFIER(left,right) \
34
((sixteen_bits)(((left)-ID0)*BASE2+(sixteen_bits)(right))) \
37
#define LEFT(a,id)((eight_bits)(((a)/BASE2+(id)))) \
39
#define RIGHT(a)((eight_bits)(((a)%BASE2))) \
43
#define begin_comment0 (eight_bits)0376
44
#define begin_comment1 (eight_bits)0375 \
46
#define module_number (eight_bits)0201
47
#define identifier (eight_bits)0202
48
#define id_keyword (eight_bits)0203 \
50
#define L_switch (eight_bits)0257
51
#define begin_FORTRAN (eight_bits)0260
52
#define begin_RATFOR (eight_bits)0261
53
#define begin_C (eight_bits)0262
54
#define begin_LITERAL (eight_bits)0263 \
56
#define verbatim (eight_bits)0264 \
59
#define invisible_cmnt (eight_bits)0265
60
#define compiler_directive (eight_bits)0266
61
#define Compiler_Directive (eight_bits)0267 \
63
#define keyword_name (eight_bits)0270 \
65
#define no_index (eight_bits)0300
66
#define yes_index (eight_bits)0301 \
68
#define ascii_constant (eight_bits)0302
69
#define begin_vcmnt (eight_bits)0303
70
#define big_line_break (eight_bits)0304 \
72
#define begin_bp (eight_bits)0305
73
#define insert_bp (eight_bits)0306 \
75
#define begin_meta (eight_bits)017
76
#define end_meta (eight_bits)027 \
78
#define TeX_string (eight_bits)0307
79
#define xref_roman (eight_bits)0310
80
#define xref_typewriter (eight_bits)0311
81
#define xref_wildcard (eight_bits)0312 \
83
#define control_text (eight_bits)0313 \
85
#define begin_nuweb (eight_bits)0314
86
#define no_mac_expand (eight_bits)0315
87
#define set_line_info (eight_bits)0316
88
#define short_fcn (eight_bits)0317 \
90
#define formatt (eight_bits)0320 \
92
#define limbo_text (eight_bits)0323
93
#define op_def (eight_bits)0324
94
#define macro_def (eight_bits)0325 \
96
#define ignore_defn (eight_bits)0327 \
98
#define new_output_file (eight_bits)0331 \
100
#define definition (eight_bits)0332
101
#define undefinition (eight_bits)0333
102
#define WEB_definition (eight_bits)0334 \
104
#define m_ifdef (eight_bits)0335
105
#define m_ifndef (eight_bits)0336
106
#define m_if (eight_bits)0337
107
#define m_else (eight_bits)0340
108
#define m_elif (eight_bits)0341
109
#define m_endif (eight_bits)0342
110
#define m_for (eight_bits)0343
111
#define m_endfor (eight_bits)0344
112
#define m_line (eight_bits)0345
113
#define m_undef (eight_bits)0346 \
115
#define end_of_buffer (eight_bits)0347 \
117
#define begin_code (eight_bits)0350
118
#define module_name (eight_bits)0351 \
120
#define new_module (eight_bits)0352 \
122
#define cur_end cur_state.end_field
123
#define cur_byte cur_state.byte_field
124
#define cur_name cur_state.name_field
125
#define cur_repl cur_state.repl_field
126
#define cur_mod cur_state.mod_field \
128
#define cur_language cur_state.language
129
#define cur_global_language cur_state.global_params.Language \
133
#define cur_params cur_state.params
134
#define cur_global_params cur_state.global_params \
137
#define macrobuf cur_state.macro_buf
138
#define cur_mp cur_state.mp
139
#define macrobuf_end cur_state.macro_buf_end \
143
#define SILENT (boolean)NO
144
#define COMPLAIN (boolean)YES \
146
#define OUTER_MACRO 0xFF
147
#define OUTER_UNMACRO 0xFE
148
#define UNDEFINED_MACRO 0xFD \
150
#define MAX_XLEVELS 200 \
152
#define equiv equiv_or_xref
153
#define EQUIV ASCII HUGE* \
157
#define MAC_LOOKUP(cur_val)(cur_val<MODULE_NAME? \
158
(text_pointer)(name_dir+(cur_val))->equiv:NULL) \
165
#define NOT_DEFINED 0
166
#define DEFERRED_MACRO 1 \
168
#define IMMEDIATE_MACRO 2
169
#define FILE_NAME 3 \
172
#define MCHECK(n,reason)if(mp+(n)>macrobuf_end) \
173
mbuf_full((unsigned long)(n),(outer_char*)reason) \
175
#define BP_MARKER 1 \
177
#define PROPER_END(end) \
178
end= (np+1)->byte_start; \
179
if(*end==BP_MARKER&&np!=npmax)end= ((BP*)end)->byte_start \
181
#define MAX_ID_LENGTH 32 \
183
#define UNNAMED_MODULE 0
184
#define N_IDBUF 100 \
186
#define fatal_RAT_ERROR(s1,s2,s3){ \
187
RAT_error(ERROR,OC(s1),0); \
188
fatal(ERR_R,OC(s2),OC(s3));} \
190
#define COPY_COMMENTS NO
191
#define SAVE_COMMENTS YES \
193
#define current_cmd lbl[wlevel].cmd
194
#define do_or_while (current_cmd==do_CMD||current_cmd==while_CMD) \
196
#define s_top lbl[wlevel].Top
197
#define s_next lbl[wlevel].Next
198
#define was_next lbl[wlevel].was_Next
199
#define s_break lbl[wlevel].Break
200
#define was_break lbl[wlevel].was_Break
201
#define s_case lbl[wlevel].Case
202
#define s_default lbl[wlevel].Default
203
#define icase lbl[wlevel].Icase \
205
#define DONT_PRINT_IF_0 YES
206
#define PRINT_IF_0 NO \
209
#define TO_MEMORY YES \
211
#define SAVE_IN_MEM(a){if(cur_case->txt.next>=cur_case->txt.end) \
212
resize(&cur_case->txt.start,BIG_SAVE8, \
213
&cur_case->txt.next, \
214
&cur_case->txt.end); \
215
*(cur_case->txt.next++)= (eight_bits)(a);} \
217
#define SAVE_16 {SAVE_IN_MEM(a0)SAVE_IN_MEM(a1)} \
219
#define XPN_CASES YES
220
#define DONT_XPN_CASES NO \
222
#define BLEVELS 100 \
224
#define copy_to(r_after)copy_2to(NOT_BEFORE,r_after) \
226
#define BRACE_ONLY 1 \
229
#define unmatched(l,r) \
230
RAT_error(WARNING,OC("Ignored '%c' not matched with %s"),2,XCHR(r),qdelim(l)) \
232
#define inserted(n,l0,r0,l,level) \
233
RAT_error(WARNING,OC("Inserted %d '%c' to balance '%c' at %s level %d"),5,n,XCHR(r0),XCHR(l0),qdelim(l),level) \
236
#define COPY_TO(r)psave_buffer= SAVE_AFTER(&save_buffer,BIG_SAVE8,r); \
237
copy_out(save_buffer,psave_buffer,!macro) \
239
#define COPY_2TO(r_before,r_after) \
240
psave_buffer= save_out(&save_buffer,BIG_SAVE8,r_before,r_after); \
241
copy_out(save_buffer,psave_buffer,!macro) \
243
#define INDENT indent_level++;blank_out(1)
244
#define OUTDENT indent_level--;out_pos-= indnt_size \
246
#define LABEL(lbl)out_label(DONT_PRINT_IF_0,(STMT_LBL)(lbl))
247
#define NUMBER(lbl)out_label(PRINT_IF_0,(STMT_LBL)(lbl)) \
250
#define PARENS copyd(TO_OUTPUT,XPN_CASES,050,051,NO) \
253
#define NL out_char(012)
254
#define LP out_char(050)
255
#define RP out_char(051)
256
#define COMMA out_char(054)
257
#define NOT out_char(041)
258
#define EQUALS out_char(075)
259
#define MINUS out_char(055)
260
#define EQ_EQ out_char(eq_eq)
261
#define OR out_char(or_or)
262
#define LT out_char(074)
263
#define GT out_char(076) \
265
#define IF(stmt_num)LABEL(stmt_num);id0(id__IF)
266
#define THEN id0(id__THEN);NL
267
#define ELSE id0(id__ELSE)
268
#define ENDIF id0(id__ENDIF);if(symbolic_label)id0(symbolic_label);NL
269
#define ENDWHERE id0(id__ENDWHERE);NL
270
#define GOTO(stmt)id0(id__GOTO);LABEL(stmt);NL
271
#define CONTINUE(stmt)LABEL(stmt);id0(id__CONTINUE);NL
272
#define RETURN id0(id__RETURN);NL
273
#define END id0(id__END);NL \
275
#define END_DO id0(id__END);id0(id__DO);NL
276
#define END_SELECT id0(id__END);id0(id__SELECT);NL \
278
#define NOT_LOOP(id,msg)not_loop(OC(id),OC(msg)) \
282
#define BIG_SAVE8 10000 \
284
#define id__ignore ignore \
286
#define UNEXPECTED(id)unexpected(OC(id)) \
290
#define cur_switch switches[switch_level] \
298
#if(part != 1 && part != 2 && part != 3)
306
#if(part == 0 || part == 1)
307
#define part1_or_extern
308
#define SET1(stuff) = stuff
309
#define TSET1(stuff) = stuff
311
#define part1_or_extern extern
320
#include "typedefs.h"
334
eight_bits HUGE*tok_start;
336
sixteen_bits text_link;
349
typedef text HUGE*text_pointer;
354
eight_bits HUGE*end_field;
355
eight_bits HUGE*byte_field;
356
name_pointer name_field;
357
text_pointer repl_field;
358
sixteen_bits mod_field;
359
PARAMS global_params,params;
360
eight_bits HUGE*macro_buf,HUGE*mp,HUGE*macro_buf_end;
364
typedef output_state HUGE*stack_pointer;
369
typedef enum{BAD_TOKEN,OR_OR,AND_AND,BIT_OR,BIT_XOR,BIT_AND,LOG_EQ,LOG_LT,
370
BIT_SHIFT,PLUS_MINUS,TIMES,EXP,UNARY,HIGHEST_UNARY}PRECEDENCE;
376
PRECEDENCE precedence;
390
typedef enum{Int,Double,Id,Op}TYPE;
398
struct val HUGE*last,HUGE*next;
405
sixteen_bits token[MAX_XLEVELS];
412
IN_COMMON boolean truncate_ids;
413
IN_COMMON unsigned short tr_max[];
414
IN_COMMON name_pointer npmax;
422
CONST ASCII HUGE*byte_start,HUGE*byte_end;
426
struct Trunc HUGE*Root;
433
size_t num[NUM_LANGUAGES];
435
ASCII HUGE*id,HUGE*id_end;
436
BP HUGE*first,HUGE*last;
437
struct Trunc HUGE*next;
442
IN_RATFOR int switch_level RSET(0);
447
eight_bits HUGE*start,HUGE*next,HUGE*end;
460
IN_RATFOR CASE HUGE*cur_case;
466
unsigned short ncases;
470
IN_RATFOR SWITCH HUGE*switches;
484
#define N_MSGBUF 2000
486
#define N_MSGBUF 10000
493
EXTERN long max_texts;
494
EXTERN text HUGE*text_info;
495
EXTERN text_pointer text_end;
497
EXTERN long dtexts_max;
498
EXTERN text HUGE*txt_dinfo;
499
EXTERN text_pointer textd_end;
501
EXTERN text_pointer text_ptr,txt_dptr;
504
EXTERN long max_toks;
505
EXTERN eight_bits HUGE*tok_mem;
506
EXTERN eight_bits HUGE*tok_m_end;
508
EXTERN long max_dtoks;
509
EXTERN eight_bits HUGE*tok_dmem;
510
EXTERN eight_bits HUGE*tokd_end;
512
EXTERN eight_bits HUGE*tok_ptr,HUGE*tok_dptr;
514
EXTERN eight_bits HUGE*mx_tok_ptr,HUGE*mx_dtok_ptr;
517
EXTERN text_pointer macro_text;
521
EXTERN output_state cur_state;
524
EXTERN long stck_size;
525
EXTERN output_state HUGE*stack;
526
EXTERN stack_pointer stck_end;
527
EXTERN stack_pointer stck_ptr;
531
IN_COMMON STMT_LBL max_stmt;
533
EXTERN sixteen_bits outp_line[NUM_LANGUAGES]
535
#if(part == 0 || part == 1)
543
EXTERN boolean mac_protected,in_string;
544
EXTERN text_pointer macro_text;
546
EXTERN OUTPUT_STATE out_state;
547
EXTERN int indent_level,out_pos,rst_pos,indnt_size;
548
EXTERN eight_bits sent;
550
IN_COMMON STMT_LBL max_stmt;
551
IN_COMMON sixteen_bits outp_line[];
556
IN_RATFOR sixteen_bits
557
id_block,id_blockdata,id_break,
563
id_else,id_elseif,id_end,
570
id_next,id_procedure,id_repeat,
571
id_return,id_switch,id_then,id_until,
574
IN_RATFOR sixteen_bits id_function,id_program,id_subroutine;
576
IN_RATFOR sixteen_bits
577
id_contains,id_elsewhere,id_endinterface,id_endtype,id_endmodule,
578
id_endselect,id_endwhere,id_interface,id_module,id_type,id_where;
581
IN_RATFOR sixteen_bits id_data;
584
IN_RATFOR sixteen_bits
585
id__CASE,id__CONTINUE,id__DEFAULT,
586
id__DO,id__ELSE,id__ELSEIF,id__END,
587
id__ENDIF,id__EXIT,id__GOTO,id__IF,
592
IN_RATFOR sixteen_bits
593
id__CONTAINS,id__CYCLE,id__ENDWHERE,id__INTERFACE,id__MODULE,
594
id__SELECT,id__TYPE,id__WHERE;
599
IN_RATFOR SPEC out_tokens[]
600
#if(part == 0 || part == 1)
602
{"CASE",0,NULL,&id__CASE},
603
{"CONTINUE",0,NULL,&id__CONTINUE},
604
{"DEFAULT",0,NULL,&id__DEFAULT},
605
{"DO",0,NULL,&id__DO},
606
{"ELSE",0,NULL,&id__ELSE},
607
{"ELSEIF",0,NULL,&id__ELSEIF},
608
{"END",0,NULL,&id__END},
609
{"ENDIF",0,NULL,&id__ENDIF},
610
{"EXIT",0,NULL,&id__EXIT},
611
{"GOTO",0,NULL,&id__GOTO},
612
{"IF",0,NULL,&id__IF},
613
{"RETURN",0,NULL,&id__RETURN},
614
{"THEN",0,NULL,&id__THEN},
615
{"WHILE",0,NULL,&id__WHILE},
621
IN_RATFOR SPEC out90_tokens[]
622
#if(part == 0 || part == 1)
624
{"CONTAINS",0,NULL,&id__CONTAINS},
625
{"CYCLE",0,NULL,&id__CYCLE},
626
{"ENDWHERE",0,NULL,&id__ENDWHERE},
627
{"INTERFACE",0,NULL,&id__INTERFACE},
628
{"MODULE",0,NULL,&id__MODULE},
629
{"SELECT",0,NULL,&id__SELECT},
630
{"TYPE",0,NULL,&id__TYPE},
631
{"WHERE",0,NULL,&id__WHERE},
639
eight_bits break_tokens[3];
642
IN_RATFOR SPEC spec_tokens[]
643
#if(part == 0 || part == 1)
645
{"block",0,x_block,&id_block},
646
{"blockdata",0,x_blockdata,&id_blockdata},
647
{"break",0,x_break,&id_break},
648
{"case",0,(X_FCN(*)(VOID))x_case,&id_case},
649
{"default",0,(X_FCN(*)(VOID))x_default,&id_default},
650
{"do",0,x_do,&id_do},
651
{"else",0,x_else,&id_else},
652
{"elseif",0,x_els_if,&id_elseif},
653
{"end",0,x_end,&id_end},
654
{"endif",0,x_en_if,&id_endif},
655
{"for",0,x_for,&id_for},
656
{"function",0,x_function,&id_function},
657
{"if",0,x_if,&id_if},
658
{"next",0,x_next,&id_next},
659
{"procedure",0,x_procedure,&id_procedure},
660
{"program",0,x_program,&id_program},
661
{"repeat",0,x_repeat,&id_repeat},
662
{"return",0,x_return,&id_return},
663
{"switch",0,x_switch,&id_switch},
664
{"subroutine",0,x_subroutine,&id_subroutine},
665
{"then",0,x_then,&id_then},
666
{"until",0,x_until,&id_until},
667
{"while",0,x_while,&id_while},
674
IN_RATFOR SPEC spec90_tokens[]
675
#if(part == 0 || part == 1)
677
{"contains",0,x_contains,&id_contains},
678
{"endinterface",0,x_en_interface,&id_endinterface},
679
{"endmodule",0,x_en_module,&id_endmodule},
680
{"endselect",0,x_en_select,&id_endselect},
681
{"endtype",0,x_en_type,&id_endtype},
682
{"endwhere",0,x_en_where,&id_endwhere},
683
{"interface",0,x_interface,&id_interface},
684
{"module",0,x_module,&id_module},
685
{"type",0,x_type,&id_type},
686
{"where",0,x_where,&id_where},
694
IN_RATFOR sixteen_bits sym_label RSET(0);
698
IN_RATFOR boolean saved_token RSET(NO);
699
IN_RATFOR eight_bits last_a;
700
IN_RATFOR int last_bytes;
706
IN_RATFOR eight_bits HUGE*cmnt_buf RSET(NULL),
707
HUGE*cmnt_buf_end RSET(NULL),
708
HUGE*cmnt_pos RSET(NULL);
714
STMT_LBL Top,Next,Break;
715
STMT_LBL Case,Default;
717
unsigned was_Break:1,
721
IN_RATFOR LBL HUGE*lbl,HUGE*lbl_end;
722
IN_RATFOR BUF_SIZE max_lbls;
724
IN_RATFOR int wlevel RSET(0);
732
IN_RATFOR boolean balanced RSET(YES);
733
IN_RATFOR ASCII cur_delim RSET('\0');
737
IN_RATFOR eight_bits HUGE*save_buffer RSET(NULL),HUGE*psave_buffer;
741
IN_RATFOR outer_char HUGE*cmd_fmt;
742
IN_RATFOR ASCII HUGE*cmd_msg,HUGE*cmd_end;
743
IN_RATFOR BUF_SIZE cmd_fsize,cmd_size;
747
IN_COMMON double g_ratio;
748
IN_COMMON CASE_TYPE max_spread;
749
IN_COMMON unsigned short marginal_cases;
751
IN_EVAL VAL HUGE*val_ptr,HUGE*val_heap;
770
outer_char*msg C1("")
778
ini_RAT_tokens FCN((language0))
779
LANGUAGE language0 C1("")
784
ini_special_tokens(language0,spec90_tokens);
785
ini_out_tokens(out90_tokens);
789
ini_special_tokens(language0,spec_tokens);
790
ini_out_tokens(out_tokens);
795
confusion(OC("ini_RAT_tokens"),OC("Language should be RATFOR-like here"));
798
ini_univ_tokens(language0);
804
break_tokens[0]= LEFT(id_break,ID0);
805
break_tokens[1]= RIGHT(id_break);
806
break_tokens[2]= 073;
808
pd= x_to_ASCII(OC("data"));
809
id_data= ID_NUM(pd,pd+4);
824
sym_label= (sixteen_bits)cur_val;
826
if(TOKEN1(a= next_byte()))BACK_UP
829
a= IDENTIFIER(a,next_byte());
831
if(name_dir[a].expandable)
843
out_char(identifier);
860
RAT_error FCN(VA_ALIST((err_type,msg,n VA_ARGS)))
862
ERR_TYPE err_type C0("Is it warning or error?")
863
CONST outer_char msg[]C0("Error message.")
864
int n C2("Number of arguments to follow."))
867
outer_char HUGE*temp,HUGE*temp1;
869
#if(NUM_VA_ARGS == 1)
871
CONST outer_char*msg;
875
temp= GET_MEM("RAT_error:temp",N_MSGBUF,outer_char);
876
temp1= GET_MEM("RAT_error:temp1",N_MSGBUF,outer_char);
880
#if(NUM_VA_ARGS == 1)
881
err_type= va_arg(arg_ptr,ERR_TYPE);
882
msg= va_arg(arg_ptr,char*);
886
vsprintf((char*)temp1,(CONST char*)msg,arg_ptr);
891
nsprintf(temp,OC("RATFOR %s (Output l. %u in %s): %s."),4,err_type==ERROR?"ERROR":"WARNING",OUTPUT_LINE,params.OUTPUT_FILE_NAME,temp1)>=(int)(N_MSGBUF))OVERFLW("temp","");
893
last_level= MAX(rlevel-1,0);
897
nsprintf(temp1,OC("%s Expanding \"%s\" (loop level %d) beginning at output line %u. \
898
In \"%s %s\" beginning at line %u."),7,(char*)temp,(char*)cmd_name(begun[last_level].cmd),begun[last_level].level,begun[last_level].line,(char*)cmd_name(begun[0].cmd),(char*)name_of(begun[0].name),begun[0].line)>=(int)(N_MSGBUF))OVERFLW("temp1","");
900
printf("\n%s\n",(char*)temp1);
901
OUT_MSG(to_ASCII(temp1),NULL);
905
FREE_MEM(temp,"RAT_error:temp",N_MSGBUF,char);
906
FREE_MEM(temp1,"RAT_error:temp1",N_MSGBUF,char);
912
output_ended FCN(VA_ALIST((msg,n VA_ARGS)))
914
CONST outer_char msg[]C0("Error message.")
915
int n C2("Number of arguments to follow."))
920
temp= GET_MEM("output_ended:temp",N_MSGBUF,char);
926
char*fmt0= va_arg(arg_ptr,char*);
929
vsprintf((char*)temp,fmt0,arg_ptr);
932
vsprintf(temp,(CONST char*)msg,arg_ptr);
937
RAT_error(ERROR,OC("Output ended %s"),1,temp);
939
fatal(ERR_R,OC("ABORTING!"),OC(""));
946
CMD cmd C1("Type of command.")
953
case blockdata_CMD:return OC("blockdata");
954
case break_CMD:return OC("break");
955
case case_CMD:return OC("case");
956
case contains_CMD:return OC("contains");
957
case default_CMD:return OC("default");
958
case do_CMD:return OC("do");
959
case for_CMD:return OC("for");
960
case function_CMD:return OC("function");
961
case if_CMD:return OC("if");
962
case interface_CMD:return OC("interface");
963
case module_CMD:return OC("module");
964
case next_CMD:return OC("next");
965
case program_CMD:return OC("program");
966
case repeat_CMD:return OC("repeat");
967
case return_CMD:return OC("return");
968
case subroutine_CMD:return OC("subroutine");
969
case switch_CMD:return OC("switch");
970
case type_CMD:return OC("type");
971
case until_CMD:return OC("until");
972
case where_CMD:return OC("where");
973
case while_CMD:return OC("while");
974
default:return OC("UNKNOWN CMD");
982
CONST outer_char s[]C1("Error message.")
985
RAT_error(ERROR,OC("Misplaced keyword: \
986
\"%s\" must be used only inside \"switch\""),1,s);
990
SRTN didnt_expand FCN((c0,c,op))
996
RAT_error(ERROR,OC("Was expecting '%c', not '%c', after \"%s\"; \
997
expansion aborted"),3,XCHR(c0),XCHR(c),op);
1003
outer_char c C1("Character expected next.")
1005
if((ASCII)(next_byte())!=XORD(c))
1008
RAT_error(WARNING,OC("Inserted '%c' after \"%s\""),1,c,cmd_name(begun[rlevel-1].cmd));
1023
static boolean ended_module= NO;
1041
cur_val= -(long)cur_mod;
1042
if(cur_val!=ignore)OUT_CHAR(module_number);
1055
if(TOKEN1(a0= *cur_byte++))
1057
if(a0==ignore&&!in_string)
1060
if(rlevel>0&&a0==begin_language)
1072
a= IDENTIFIER(a0,last_a= *cur_byte++);
1076
switch(a/MODULE_NAME)
1080
if(is_deferred(a))continue;
1084
(macro_text= (text_pointer)mac_lookup(a))!=NULL)
1087
long cur_val0= cur_val;
1090
p= xmacro(macro_text,&cur_byte,&cur_end,YES,
1093
push_level(NULL,p,mp);
1096
else if(!balanced&&language==RATFOR&&
1097
(a==id_function||a==id_program||a==id_subroutine))
1100
RAT_error(ERROR,OC("Inserted missing '%c' at beginning of function"),1,XCHR(cur_delim));
1104
goto return_next_byte;
1109
goto return_next_byte;
1117
cur_val= a-MODULE_NUM;
1118
if(cur_val>UNNAMED_MODULE)cur_mod= (sixteen_bits)cur_val;
1119
OUT_CHAR(module_number);
1134
skip_newlines FCN((save_comments))
1135
boolean save_comments C1("")
1141
cmnt_pos= cmnt_buf= GET_MEM("cmnt_buf",SAVE8,eight_bits);
1142
cmnt_buf_end= cmnt_buf+SAVE8;
1145
while((a= copy_comment(save_comments))==012);
1148
output_ended(OC("while skipping newlines"),0);
1155
copy_comment FCN((save_comments))
1156
boolean save_comments C1("")
1161
if((a= next_byte())!=stringg)return a;
1163
else if(save_comments)
1168
while((a= next_byte())!=stringg)
1170
if(cmnt_pos==cmnt_buf_end)
1171
resize(&cmnt_buf,SAVE8,&cmnt_pos,&cmnt_buf_end);
1181
while((a= get_output())!=stringg);
1184
DUMMY_RETURN(ignore);
1190
flush_comments(VOID)
1194
if(!cmnt_buf)return;
1196
for(p= cmnt_buf;p<cmnt_pos;p++)out_char(*p);
1197
if(cmnt_pos>cmnt_buf)NL;
1199
FREE_MEM(cmnt_buf,"cmnt_buf",SAVE8,eight_bits);
1200
cmnt_buf= cmnt_buf_end= cmnt_pos= NULL;
1207
sixteen_bits cur_val C1("Token to print out.")
1209
if(cur_val==ignore)return;
1211
if(out_state==NUM_OR_ID)C_putc(' ');
1213
out_ptrunc(cur_val);
1215
out_state= NUM_OR_ID;
1221
save_lbls FCN((cmd,top0,next0,break0,n_used))
1222
CMD cmd C0("The current command.")
1223
STMT_LBL top0 C0("Label number for top of block.")
1224
STMT_LBL next0 C0("Go here on |next|.")
1225
STMT_LBL break0 C0("Go here on |break|.")
1226
int n_used C1("Number of labels used in this expansion.")
1229
if(++wlevel>=(int)max_lbls)OVERFLW("stmt labels","");
1235
was_break= was_next= NO;
1240
s_case= s_default= 0;
1249
out_label FCN((suppress_0,stmt_num))
1250
boolean suppress_0 C0("Suppress if zero?")
1251
STMT_LBL stmt_num C1("Statement number to print.")
1253
outer_char temp[N_IDBUF];
1256
if(stmt_num==(STMT_LBL)0&&suppress_0)return;
1259
if(stmt_num>(STMT_LBL)99999)
1261
stmt_num= (STMT_LBL)99999;
1263
RAT_error(WARNING,OC("Automatic statement number out of bounds; %ld assumed"),1,stmt_num);
1268
nsprintf(temp,OC("%ld"),1,stmt_num)>=(int)(N_IDBUF))OVERFLW("temp","");
1279
copyd FCN((to_memory,xpn_cases,l,r,semi_allowed))
1280
boolean to_memory C0("To memory?")
1281
boolean xpn_cases C0("Expand |case| statements?")
1282
ASCII l C0("Left-hand delimiter.")
1283
ASCII r C0("Right-hand delimiter.")
1284
boolean semi_allowed C1("Is a semicolon allowed in the text to be \
1287
int bal,bal0[BLEVELS];
1288
LINE_NUMBER starting_line;
1289
eight_bits(*output_rtn)(VOID);
1290
sixteen_bits a,last_token;
1291
sixteen_bits l0= ignore,r0= ignore;
1293
boolean balanced0= balanced;
1294
ASCII cur_delim0= cur_delim;
1310
confusion(OC("copyd"),OC("Invalid left delimiter 0x%x"),l);
1315
if(l==0173&&xpn_cases)
1317
if(DONE_LEVEL&&!pop_level())
1318
output_ended(OC("after '{'"),0);
1324
if((ASCII)(next_byte())!=l)
1327
RAT_error(ERROR,OC("Missing opening delimiter '%c'; \
1328
text not copied"),1,XCHR(l));
1337
starting_line= OUTPUT_LINE;
1341
output_rtn= to_memory?next_byte:get_output;
1354
a= (sixteen_bits)(*output_rtn)();
1357
if(to_memory&&a==(sixteen_bits)stringg)
1358
in_string= BOOLEAN(!in_string);
1363
output_ended(OC("while scanning for '%c'. Scan began \
1364
with delimiter '%c' at line %u"),3,XCHR(r),XCHR(l),starting_line);
1366
if(a==(sixteen_bits)l)bal0[++bal]= 0;
1367
else if(a==(sixteen_bits)r)
1371
if(!to_memory)out_pos--;
1379
inserted(bal0[bal],l0,r0,l,bal);
1382
if(to_memory)SAVE_IN_MEM(r0)
1388
if(semi_allowed&&last_token&&last_token!=073)
1391
RAT_error(WARNING,OC("Supplied missing ';' before \
1392
delimiter '%c'"),1,r);
1394
if(to_memory)SAVE_IN_MEM(073)
1398
if(to_memory)SAVE_IN_MEM(r)
1409
else if(a==l0)bal0[bal]++;
1414
if(!to_memory)out_pos--;
1415
unmatched((ASCII)l0,(ASCII)r0);
1425
if(semi_allowed)found_semi= YES;
1427
RAT_error(ERROR,OC("Spurious semicolon"),0);
1430
if(!to_memory&&a==id_keyword)last_token= ignore;
1447
case begin_language:
1448
SAVE_IN_MEM(*cur_byte++);
1451
case new_output_file:
1453
RAT_error(ERROR,OC("@o command not allowed inside switch"),0);
1464
a= IDENTIFIER(a0= (eight_bits)a,a1= next_byte());
1469
copyd(TO_MEMORY,DONT_XPN_CASES,050,051,NO);
1470
skip_newlines(COPY_COMMENTS);
1471
copyd(TO_MEMORY,DONT_XPN_CASES,0173,0175,YES);
1473
else if(a==id_case)x_case();
1474
else if(a==id_default)x_default();
1482
SAVE_IN_MEM(next_byte())
1490
balanced= balanced0;
1491
cur_delim= cur_delim0;
1500
copyd(TO_OUTPUT,XPN_CASES,0173,0175,YES);
1502
if(--brace_level==0)
1513
stmt FCN((to_memory,brace_only))
1514
boolean to_memory C0("")
1515
boolean brace_only C1("Is only a left brace allowed next?")
1520
skip_newlines(COPY_COMMENTS);
1522
if((a= next_byte())!=0173)
1525
output_ended(OC("at beginning of statement"),0);
1531
RAT_error(WARNING,OC("Inserted '{'"),0);
1533
copyd(to_memory,XPN_CASES,0173,0175,YES);
1547
a= IDENTIFIER(a,next_byte());
1549
for(s= spec_tokens;s->len!=0;s++)
1550
if(a==*s->pid&&s->expand!=NULL)
1559
else copyd(to_memory,XPN_CASES,0173,0175,YES);
1573
if((a= get_output())==ignore)
1574
output_ended(OC("during scan of simple \
1577
if(a==073&&!in_string)break;
1581
if((a= next_byte())!=stringg){BACK_UP return;}
1583
if(*cur_byte!=012){BACK_UP return;}
1587
while((a= get_output())!=stringg);
1594
save_out FCN((pp,nmax,r_before,r_after))
1595
eight_bits HUGE**pp C0("Address of pointer to buffer where result is \
1597
int nmax C0("Length of above buffer.")
1598
eight_bits r_before C0("Stop before here.")
1599
eight_bits r_after C1("Stop after here.")
1602
eight_bits HUGE*p,HUGE*p_end;
1603
LINE_NUMBER starting_line;
1604
int bal,bal0[BLEVELS];
1608
*pp= GET_MEM("*pp",nmax,eight_bits);
1623
l= (eight_bits)0173;
1635
starting_line= OUTPUT_LINE;
1640
confusion(OC("save_out"),OC("Shouldn't be inside string here"));
1644
if(p>=p_end)resize(pp,nmax,&p,&p_end);
1647
if(TOKEN1(a= next_byte()))
1653
output_ended(OC("while scanning from line %u \
1654
for delimiter (r_before = '%c', r_after = '%c')"),3,starting_line,XCHR(r_before),XCHR(r_after));
1656
if(a==l)bal0[++bal]= 0;
1657
else if(a==r_after&&r_after!=NOT_AFTER)
1662
unmatched(l,r_after);
1669
inserted(bal0[bal],0173,0175,l,bal);
1674
if(p>=p_end)resize(pp,nmax,&p,&p_end);
1688
else if(a==r_before&&r_before!=NOT_BEFORE)
1694
else if(a==0173)bal0[bal]++;
1700
unmatched(0173,0175);
1718
in_string= BOOLEAN(!in_string);
1722
case begin_language:
1747
static outer_char q0[4];
1749
sprintf((char*)q0,delim?"'%c'":"?",XCHR(delim));
1756
resize FCN((pp,nmax,pq,pp_end))
1757
eight_bits HUGE**pp C0("Addr of ptr to beginning of buffer")
1758
int nmax C0("Resizing increment")
1759
eight_bits HUGE**pq C0("Address of current pointer")
1760
eight_bits HUGE**pp_end C1("Addr of ptr to end of buffer")
1762
int old_len= PTR_DIFF(int,*pq,*pp);
1763
int new_len= old_len+nmax;
1765
*pp= (eight_bits HUGE*)REALLOC(*pp,
1766
new_len*sizeof(eight_bits),
1767
old_len*sizeof(eight_bits));
1769
*pp_end= *pp+new_len-1;
1783
ALLOC(LBL,lbl,"lb",max_lbls,0);
1784
lbl_end= lbl+max_lbls;
1788
ALLOC(outer_char,cmd_fmt,"cf",cmd_fsize,0);
1789
ALLOC(ASCII,cmd_msg,"cg",cmd_size,0);
1790
cmd_end= cmd_msg+cmd_size;
1794
begun= GET_MEM("begun",max_lbls,BEGUN);
1802
out_cmd FCN(VA_ALIST((emit_continue,abbrev,beginning,fmt0,n VA_ARGS)))
1804
boolean emit_continue C0("Put a |continue| in case of label.")
1805
outer_char abbrev C0("Abbreviation of command.")
1806
CONST outer_char beginning[]C0("Beginning part of message.")
1807
CONST outer_char*fmt0 C0("Format of the message.")
1808
int n C2("Number of arguments to message."))
1811
#if(NUM_VA_ARGS == 1)
1812
boolean emit_continue;
1814
CONST outer_char*beginning;
1815
CONST outer_char*fmt0;
1819
VA_START(arg_ptr,n);
1821
#if(NUM_VA_ARGS == 1)
1822
emit_continue= va_arg(arg_ptr,boolean);
1823
abbrev= va_arg(arg_ptr,char);
1824
beginning= va_arg(arg_ptr,char*);
1825
fmt0= va_arg(arg_ptr,char*);
1826
va_arg(arg_ptr,int);
1831
static outer_char brkset[3]= "*?";
1834
boolean found_abbrev;
1838
found_abbrev= BOOLEAN(STRPBRK(abbrev_cmds,brkset)!=NULL);
1840
if(suppress_cmds){if(found_abbrev)return;}
1841
else{if(!found_abbrev)return;}
1854
nsprintf(cmd_fmt,OC("--- %s \"%s%s\" ---"),3,beginning,cmd_name(begun[rlevel-1].cmd),fmt0)>=(int)(cmd_fsize))OVERFLW("cmd_fmt","");
1860
eight_bits HUGE*s,HUGE*s1;
1869
OVERFLW("cmd_msg","cg");
1871
if(*p=='%'&&*(p+1)=='s')
1881
s= va_arg(arg_ptr,eight_bits*);
1882
s1= va_arg(arg_ptr,eight_bits*);
1899
if(Fortran88&&symbolic_label)
1901
id0(symbolic_label);OUT_CHAR(072);
1908
expanding FCN((cmd))
1909
CMD cmd C1("Type of identifier being expanded.")
1911
if(rlevel>=(int)max_lbls)OVERFLW("Nesting","");
1913
begun[rlevel].cmd= cmd;
1914
begun[rlevel].name= rlevel?cur_fcn:NO_FCN;
1915
begun[rlevel].symbolic= sym_label;
1916
begun[rlevel].function= BOOLEAN(CHOICE(rlevel,is_function,NO));
1917
begun[rlevel].line= OUTPUT_LINE;
1918
begun[rlevel].level= wlevel;
1927
eight_bits HUGE*a= NULL,HUGE*pa;
1929
expanding(while_CMD);
1930
save_lbls(while_CMD,max_stmt,max_stmt,max_stmt+1,2);
1937
if((c= next_byte())!='(')
1939
didnt_expand('(',c,"while");
1943
pa= SAVE_AFTER(&a,SAVE8,051);
1946
out_cmd(YES,'w',OC(""),OC("(%s)"),2,a,pa);
1950
id0(id__DO);id0(id__WHILE);LP;copy_out(a,pa,!macro);RP;
1955
IF(s_top);LP;copy_out(a,pa,!macro);RP;THEN;
1959
if(!Fortran88){GOTO(s_top);}
1962
if(Fortran88){END_DO;}
1966
if(was_break){CONTINUE(s_break);}
1971
FREE_MEM(a,"while:a",SAVE8,eight_bits);
1982
if(wlevel==0&&switch_level==0)
1984
NOT_LOOP("break"," or \"switch\"");
1989
expanding(break_CMD);
1995
out_cmd(YES,'b',OC(""),OC(""),0);
1997
if(Fortran88&&do_or_while)
2001
if(TOKEN1(a= next_byte()))BACK_UP
2002
else id0(IDENTIFIER(a,next_byte()));
2007
else{GOTO(s_break);}
2016
not_loop FCN((id,msg))
2017
CONST outer_char id[]C0("Errant identifier name.")
2018
CONST outer_char msg[]C1("Error message.")
2021
RAT_error(WARNING,OC("Misplaced keyword: \
2022
\"%s\" must appear inside loop%s; command ignored"),2,id,msg);
2035
NOT_LOOP("next","");
2040
expanding(next_CMD);
2044
out_cmd(YES,'n',OC(""),OC(""),0);
2046
if(Fortran88&&do_or_while)
2050
if(TOKEN1(a= next_byte()))BACK_UP
2051
else id0(IDENTIFIER(a,next_byte()));
2067
eight_bits HUGE*u= NULL,HUGE*pu;
2069
expanding(repeat_CMD);
2070
save_lbls(repeat_CMD,max_stmt,max_stmt+1,max_stmt+2,3);
2073
out_cmd(YES,'p',OC(""),OC(""),0);
2079
if(was_next)LABEL(s_next);
2081
skip_newlines(SAVE_COMMENTS);
2084
if(TOKEN1(a= next_byte()))BACK_UP
2087
a= IDENTIFIER(a,next_byte());
2093
expanding(until_CMD);
2099
if((c= next_byte())!='(')
2101
didnt_expand('(',c,"until");
2105
pu= SAVE_AFTER(&u,SAVE8,051);
2107
out_cmd(NO,'p',OC(""),OC("(%s)"),2,u,pu);
2110
LP;copy_out(u,pu,!macro);RP;
2112
FREE_MEM(u,"repeat:u",SAVE8,eight_bits);
2120
if(was_break){CONTINUE(s_break);}
2134
b= next_byte();BACK_UP
2145
save_lbls(do_CMD,0L,max_stmt,max_stmt+1,2);
2148
out_cmd(YES,'d',OC(""),OC(""),0);
2152
if(!TOKEN1(a= next_byte()))
2153
a= IDENTIFIER(a,next_byte());
2159
id0(id__DO);if(!Fortran88)LABEL(s_next);COPY_2TO(0173,073);NL;
2165
id0(id__END);id0(id__DO);
2166
if(symbolic_label)id0(symbolic_label);
2172
if(was_break){CONTINUE(s_break);}
2185
eight_bits HUGE*a= NULL,HUGE*b= NULL,HUGE*c= NULL,
2186
HUGE*pa,HUGE*pb,HUGE*pc;
2189
save_lbls(for_CMD,max_stmt,max_stmt+1,max_stmt+2,3);
2196
if((c= next_byte())!='(')
2198
didnt_expand('(',c,"for");
2202
pa= SAVE_AFTER(&a,SAVE8,073);
2203
pb= SAVE_AFTER(&b,SAVE8,073);
2204
pc= SAVE_AFTER(&c,SAVE8,051);
2207
out_cmd(YES,'f',OC(""),OC("(%s;%s;%s)"),6,a,pa,b,pb,c,pc);
2210
if(pa>a){copy_out(a,pa,!macro);NL;}
2214
{IF(s_top);LP;copy_out(b,pb,!macro);RP;THEN;}
2215
else{CONTINUE(s_top);}
2222
if(was_next){CONTINUE(s_next);}
2226
out_cmd(NO,'f',OC("Reinitialization of"),OC("(%s;%s;%s)"),6,a,pa,b,pb,c,pc);
2227
copy_out(c,pc,!macro);NL;
2232
if(was_break){CONTINUE(s_break);}
2235
FREE_MEM(a,"for:a",SAVE8,eight_bits);
2236
FREE_MEM(b,"for:b",SAVE8,eight_bits);
2237
FREE_MEM(c,"for:c",SAVE8,eight_bits);
2247
out_cmd(YES,'i',OC(""),OC(""),0);
2249
xpn_body(id__IF,YES,id__THEN);
2254
xpn_else(id_if,id_elseif,id__IF,YES,id__THEN))break;
2265
xpn_body FCN((token1,scan_parens,token2))
2266
sixteen_bits token1 C0("")
2267
boolean scan_parens C0("")
2268
sixteen_bits token2 C1("")
2270
LABEL(ignore);id0(token1);
2272
if(scan_parens)PARENS;
2273
if(token2)id0(token2);
2284
xpn_else FCN((id_x,id_else_x,token1,scan_parens,token2))
2285
sixteen_bits id_x C0("")
2286
sixteen_bits id_else_x C0("")
2287
sixteen_bits token1 C0("")
2288
boolean scan_parens C0("")
2289
sixteen_bits token2 C1("")
2293
skip_newlines(SAVE_COMMENTS);
2295
if(TOKEN1(a= next_byte()))
2302
a= IDENTIFIER(a,next_byte());
2308
xpn_body(token1,scan_parens,token2);
2322
if(TOKEN1(a= next_byte()))BACK_UP
2325
a= IDENTIFIER(a,next_byte());
2329
xpn_body(token1,scan_parens,token2);
2335
if(out_pos>rst_pos)NL;
2356
UNEXPECTED("elseif");
2370
UNEXPECTED("endif");
2374
x_en_interface(VOID)
2376
UNEXPECTED("endinterface");
2382
UNEXPECTED("endmodule");
2388
UNEXPECTED("endselect");
2394
UNEXPECTED("endtype");
2400
UNEXPECTED("endwhere");
2406
UNEXPECTED("procedure");
2418
UNEXPECTED("until");
2426
expanding(where_CMD);
2428
out_cmd(YES,'h',OC(""),OC(""),0);
2430
xpn_body(id__WHERE,YES,id__ignore);
2432
xpn_else(id_where,id_elsewhere,id__WHERE,NO,id__ignore);
2441
unexpected FCN((id))
2442
CONST outer_char id[]C1("Error message.")
2445
RAT_error(WARNING,OC("Unexpected keyword \"%s\" ignored"),1,id);
2453
eight_bits HUGE*a= NULL,HUGE*pa;
2454
outer_char temp[N_IDBUF];
2456
boolean computed_goto= NO;
2457
CASE_TYPE cmin= 0,cmax;
2458
CASE_TYPE mcases= 0;
2459
unsigned short num_cases;
2461
expanding(switch_CMD);
2463
if(switches==NULL)switches= GET_MEM("switches",NSWITCHES,SWITCH);
2466
if(cur_switch.cases==NULL)
2467
cur_switch.cases= GET_MEM("cur_switch.cases",NCASES,CASE);
2468
cur_switch.ncases= 0;
2469
cur_switch.has_default= NO;
2473
cur_case= &cur_switch.cases[0];
2474
cur_case->txt.next= cur_case->txt.start=
2475
GET_MEM("cur_case->txt.start",BIG_SAVE8,eight_bits);
2476
cur_case->txt.end= cur_case->txt.start+BIG_SAVE8;
2478
save_lbls(switch_CMD,0L,s_next,max_stmt,1);
2485
if((c= next_byte())!='(')
2487
didnt_expand('(',c,"switch");
2491
pa= SAVE_AFTER(&a,SAVE8,051);
2494
out_cmd(YES,'s',OC(""),OC("(%s)"),2,a,pa);
2498
id0(id__SELECT);id0(id__CASE);LP;copy_out(a,pa,!macro);RP;NL;
2501
stmt(TO_MEMORY,BRACE_ONLY);
2517
for(k= 1;k<=cur_switch.ncases;k++)
2519
cur_case= &cur_switch.cases[k];
2521
if(cur_case->is_default)continue;
2526
extern boolean eval_msgs;
2529
EVALUATE(val,cur_case->case_txt.start,cur_case->case_txt.next);
2536
cur_case->value= (CASE_TYPE)(val.value.i);
2541
RAT_error(WARNING,OC("Case value %#g of type double truncated to int"),1,val.value.d);
2542
cur_case->value= (CASE_TYPE)(val.value.d);
2552
if(cur_case->value<cmin)cmin= cur_case->value;
2553
if(cur_case->value>cmax)cmax= cur_case->value;
2556
if(cur_switch.ncases==1&&s_default!=0)
2562
else mcases= (cmax-cmin+1);
2564
if((num_cases= cur_switch.ncases-(unsigned short)(s_default!=0))==0)
2569
computed_goto= BOOLEAN((num_cases>marginal_cases&&
2570
mcases<max_spread)?YES:
2571
((double)mcases)/num_cases<=g_ratio);
2586
if(mcases>0){id0(id__GOTO);LP;}
2588
for(m= 0;m<mcases;m++,m<mcases?COMMA:RP)
2589
LABEL(label_case(cmin,m));
2593
COMMA;LP;copy_out(a,pa,!macro);RP;
2594
MINUS;LP;NUMBER(cmin-1);RP;NL;
2599
GOTO(s_default?s_default:(was_break= YES,s_break));
2603
for(k= 1;k<=cur_switch.ncases;k++)
2605
cur_case= &cur_switch.cases[k];
2609
CONTINUE(cur_case->label);
2611
copy_out(cur_case->txt.start,cur_case->txt.next,!macro);
2619
boolean case_ended_with_break= NO;
2620
boolean made_temp= YES;
2624
if(!Fortran88&&(made_temp= BOOLEAN(!((pa-a)==2&&!TOKEN1(*a)))))
2629
nsprintf(temp,OC("I%d"),1,s_break)>=(int)(N_IDBUF))OVERFLW("temp","");
2631
icase= ID_NUM((ASCII HUGE*)temp,(ASCII HUGE*)(temp+STRLEN(temp)));
2633
id0(icase);EQUALS;copy_out(a,pa,!macro);NL;
2636
for(k= 1;k<=cur_switch.ncases;k++)
2639
cur_case= &cur_switch.cases[k];
2642
if(k==1)s_case= max_stmt++;
2647
CASE HUGE*last_case= &cur_switch.cases[k-1];
2650
if(PTR_DIFF(long,last_case->txt.next,last_case->txt.start)>=3)
2651
case_ended_with_break=
2652
BOOLEAN(MEMCMP(last_case->txt.next-3,break_tokens,3)==0);
2653
else case_ended_with_break= NO;
2657
if(!case_ended_with_break){GOTO(s_case);}
2666
if(cur_case->is_default)id0(id__DEFAULT);
2669
if(*cur_case->case_txt.start!=050)LP;
2670
copy_out(cur_case->case_txt.start,cur_case->case_txt.next,
2672
if(*(cur_case->case_txt.next-1)!=051)RP;
2676
if(k>1&&!case_ended_with_break)
2684
if(cur_case->is_default){CONTINUE(s_default);}
2687
IF(s_case);LP;NOT;LP;
2690
if(made_temp)id0(icase);else copy_out(a,pa,!macro);
2692
copy_out(cur_case->case_txt.start,
2693
cur_case->case_txt.next,!macro);
2695
GOTO(s_case= max_stmt++);
2701
copy_out(cur_case->txt.start,cur_case->txt.next,!macro);
2723
if(was_break)LABEL(s_break);
2724
id0(id__END);id0(id__SELECT);
2725
if(symbolic_label)id0(symbolic_label);
2728
else if(was_break){CONTINUE(s_break);}
2734
FREE_MEM(a,"switch:a",SAVE8,eight_bits);
2740
show_cmd FCN((cur_case))
2741
CONST CASE HUGE*cur_case C1("")
2743
if(cur_case->is_default)
2745
expanding(default_CMD);
2747
out_cmd(NO,'t',OC(""),OC(":"),0);
2751
expanding(case_CMD);
2753
out_cmd(NO,'c',OC(""),OC(" %s:"),2,cur_case->case_txt.start,cur_case->case_txt.next);
2760
label_case FCN((cmin,m))
2761
CASE_TYPE cmin C0("")
2764
CASE_TYPE num= cmin+m;
2768
for(k= 1;k<=cur_switch.ncases;k++)
2770
cur_case= &cur_switch.cases[k];
2772
if(!cur_case->is_default&&cur_case->value==num)
2773
return cur_case->label= s_case= max_stmt++;
2777
for(k= 1;k<=cur_switch.ncases;k++)
2778
if(cur_case->is_default)return s_default;
2788
not_switch(OC("case"));
2792
expanding(case_CMD);
2796
*cur_case->txt.next= '\0';
2799
cur_case= &cur_switch.cases[++cur_switch.ncases];
2802
if(cur_case->case_txt.start==NULL)
2804
cur_case->case_txt.start=
2805
GET_MEM("cur_case->case_txt.start",SAVE8,eight_bits);
2806
cur_case->case_txt.end= cur_case->case_txt.start+SAVE8;
2808
cur_case->txt.start=
2809
GET_MEM("cur_case->txt.start",BIG_SAVE8,eight_bits);
2810
cur_case->txt.end= cur_case->txt.start+BIG_SAVE8;
2814
cur_case->txt.next= cur_case->txt.start;
2817
cur_case->case_txt.next= SAVE_AFTER(&cur_case->case_txt.start,SAVE8,072);
2818
cur_case->is_default= NO;
2823
CONST CASE HUGE*old_case;
2825
for(k= 1;k<cur_switch.ncases;k++)
2827
old_case= &cur_switch.cases[k];
2829
if(web_strcmp((CONST ASCII HUGE*)cur_case->case_txt.start,
2830
(CONST ASCII HUGE*)cur_case->case_txt.next,
2831
(CONST ASCII HUGE*)old_case->case_txt.start,
2832
(CONST ASCII HUGE*)old_case->case_txt.next)==EQUAL)
2835
RAT_error(ERROR,OC("Duplicate case value in switch"),0);
2853
not_switch(OC("default"));
2857
expanding(default_CMD);
2859
if(cur_switch.has_default)
2861
RAT_error(ERROR,OC("Only one default allowed per switch"),0);
2862
else cur_switch.has_default= YES;
2866
*cur_case->txt.next= '\0';
2869
cur_case= &cur_switch.cases[++cur_switch.ncases];
2872
if(cur_case->case_txt.start==NULL)
2874
cur_case->case_txt.start=
2875
GET_MEM("cur_case->case_txt.start",SAVE8,eight_bits);
2876
cur_case->case_txt.end= cur_case->case_txt.start+SAVE8;
2878
cur_case->txt.start=
2879
GET_MEM("cur_case->txt.start",BIG_SAVE8,eight_bits);
2880
cur_case->txt.end= cur_case->txt.start+BIG_SAVE8;
2884
cur_case->txt.next= cur_case->txt.start;
2887
cur_case->case_txt.next= cur_case->case_txt.start;
2888
cur_case->is_default= YES;
2890
cur_case->label= s_default= max_stmt++;
2899
X_FCN x_program(VOID)
2904
expanding(program_CMD);
2912
if(!(a==040||a==tab_mark))
2920
RAT_error(ERROR,OC("Expected identifier after \"%s\""),1,"program");
2928
cur_fcn= IDENTIFIER(a,next_byte());
2932
id0(id_program);id0(cur_fcn);
2934
if(cur_fcn==id_procedure)
2940
b= next_byte();BACK_UP
2944
skip_newlines(COPY_COMMENTS);
2946
copy_out(insert.program.start,insert.program.end,!macro);
2948
COPY_2TO(0173,NOT_AFTER);
2949
if(psave_buffer>save_buffer)NL;
2951
stmt(TO_OUTPUT,BRACE_ONLY);
2956
if(Fortran88){id0(id_program);id0(cur_fcn);}
2965
X_FCN x_module(VOID)
2970
expanding(module_CMD);
2978
if(!(a==040||a==tab_mark))
2986
RAT_error(ERROR,OC("Expected identifier after \"%s\""),1,"module");
2994
cur_fcn= IDENTIFIER(a,next_byte());
2998
id0(id_module);id0(cur_fcn);
3000
if(cur_fcn==id_procedure)
3006
b= next_byte();BACK_UP
3010
skip_newlines(COPY_COMMENTS);
3012
copy_out(insert.module.start,insert.module.end,!macro);
3014
COPY_2TO(0173,NOT_AFTER);
3015
if(psave_buffer>save_buffer)NL;
3017
stmt(TO_OUTPUT,BRACE_ONLY);
3022
if(Fortran88){id0(id_module);id0(cur_fcn);}
3031
X_FCN x_subroutine(VOID)
3036
expanding(subroutine_CMD);
3044
if(!(a==040||a==tab_mark))
3052
RAT_error(ERROR,OC("Expected identifier after \"%s\""),1,"subroutine");
3060
cur_fcn= IDENTIFIER(a,next_byte());
3064
id0(id_subroutine);id0(cur_fcn);
3066
if(cur_fcn==id_procedure)
3072
b= next_byte();BACK_UP
3076
skip_newlines(COPY_COMMENTS);
3078
copy_out(insert.subroutine.start,insert.subroutine.end,!macro);
3080
COPY_2TO(0173,NOT_AFTER);
3081
if(psave_buffer>save_buffer)NL;
3083
stmt(TO_OUTPUT,BRACE_ONLY);
3088
if(Fortran88){id0(id_subroutine);id0(cur_fcn);}
3097
X_FCN x_function(VOID)
3102
expanding(function_CMD);
3110
if(!(a==040||a==tab_mark))
3118
RAT_error(ERROR,OC("Expected identifier after \"%s\""),1,"function");
3126
cur_fcn= IDENTIFIER(a,next_byte());
3130
id0(id_function);id0(cur_fcn);
3132
if(cur_fcn==id_procedure)
3138
b= next_byte();BACK_UP
3142
skip_newlines(COPY_COMMENTS);
3144
copy_out(insert.function.start,insert.function.end,!macro);
3146
COPY_2TO(0173,NOT_AFTER);
3147
if(psave_buffer>save_buffer)NL;
3149
stmt(TO_OUTPUT,BRACE_ONLY);
3154
if(Fortran88){id0(id_function);id0(cur_fcn);}
3163
X_FCN x_blockdata(VOID)
3168
expanding(blockdata_CMD);
3176
if(!(a==040||a==tab_mark))
3184
RAT_error(ERROR,OC("Expected identifier after \"%s\""),1,"blockdata");
3192
cur_fcn= IDENTIFIER(a,next_byte());
3196
id0(id_blockdata);id0(cur_fcn);
3198
if(cur_fcn==id_procedure)
3204
b= next_byte();BACK_UP
3208
skip_newlines(COPY_COMMENTS);
3210
copy_out(insert.blockdata.start,insert.blockdata.end,!macro);
3212
COPY_2TO(0173,NOT_AFTER);
3213
if(psave_buffer>save_buffer)NL;
3215
stmt(TO_OUTPUT,BRACE_ONLY);
3220
if(Fortran88){id0(id_blockdata);id0(cur_fcn);}
3229
X_FCN x_interface(VOID)
3234
expanding(interface_CMD);
3242
if(!(a==040||a==tab_mark))
3250
RAT_error(ERROR,OC("Expected identifier after \"%s\""),1,"interface");
3258
cur_fcn= IDENTIFIER(a,next_byte());
3262
id0(id_interface);id0(cur_fcn);
3264
if(cur_fcn==id_procedure)
3270
b= next_byte();BACK_UP
3274
skip_newlines(COPY_COMMENTS);
3276
copy_out(insert.interface.start,insert.interface.end,!macro);
3278
COPY_2TO(0173,NOT_AFTER);
3279
if(psave_buffer>save_buffer)NL;
3281
stmt(TO_OUTPUT,BRACE_ONLY);
3286
if(Fortran88){id0(id_interface);id0(cur_fcn);}
3302
if(TOKEN1(a= next_byte()))
3309
a= IDENTIFIER(a,next_byte());
3311
if(a==id_data)x_blockdata();
3340
b= next_byte();BACK_UP
3348
expanding(type_CMD);
3350
if(TOKEN1(a= next_byte()))
3353
RAT_error(ERROR,OC("Expected identifier after \"%s\""),1,"type");
3359
cur_struct= IDENTIFIER(a,next_byte());
3362
id0(id_type);id0(cur_struct);
3366
stmt(TO_OUTPUT,BRACE_ONLY);
3370
id0(id__END);id0(id_type);id0(cur_struct);
3371
char_after(';');OUT_CHAR(';');
3382
eight_bits HUGE*return_expr= NULL,HUGE*pr;
3384
expanding(return_CMD);
3387
if((pr= SAVE_AFTER(&return_expr,SAVE8,073))>return_expr)
3391
RAT_error(ERROR,OC("Can't return value from program or subroutine"),0);
3395
out_cmd(YES,'r',OC(""),OC(" %s"),2,return_expr,pr);
3396
id0(cur_fcn);EQUALS;
3397
copy_out(return_expr,pr,!macro);NL;
3403
FREE_MEM(return_expr,"return_expr",SAVE8,eight_bits);
3411
eight_bits HUGE*I= NULL,HUGE*pI;
3412
eight_bits HUGE*Imin= NULL,HUGE*pImin;
3413
eight_bits HUGE*Imax= NULL,HUGE*pImax;
3414
eight_bits HUGE*Di= NULL,HUGE*pDi;
3415
eight_bits HUGE*txt= NULL,HUGE*ptxt;
3419
eight_bits temp[20];
3420
extern int last_bytes;
3421
extern boolean saved_token;
3430
if((c= next_byte())!='(')
3432
didnt_expand('(',c,"$DO");
3437
pI= SAVE_AFTER(&I,SAVE8,054);
3442
RAT_error(ERROR,OC("Expected identifier for first argument of $DO; \
3443
expansion aborted"),0);
3447
pImin= SAVE_AFTER(&Imin,SAVE8,054);
3448
imin= neval(Imin,pImin);
3450
pImax= SAVE_AFTER(&Imax,SAVE8,054);
3451
imax= neval(Imax,pImax);
3453
pDi= SAVE_AFTER(&Di,SAVE8,051);
3461
if(!(c==0173||c==050))
3464
RAT_error(ERROR,OC("Was expecting '{' or '(', not '%c', after $DO(); \
3465
expansion aborted"),1,XCHR(c));
3472
ptxt= SAVE_AFTER(&txt,BIG_SAVE8,c==0173?0175:051);
3475
n= name_dir+IDENTIFIER(*I,*(I+1));
3476
n->info.Macro_type= IMMEDIATE_MACRO;
3477
t= GET_MEM("equiv",2,text);
3478
n->equiv_or_xref= (EQUIV)t;
3482
if(!((di>=0&&imax<imin)||(di<0&&imax>imin)))
3483
for(i= imin;di>=0?i<=imax:i>=imax;i+= di)
3486
sprintf((char*)(temp+2),"%c%d%c",XCHR(constant),i,XCHR(constant));
3489
(t+1)->tok_start= temp+STRLEN(temp);
3491
t->nbytes= STRLEN(temp);
3492
copy_out(txt,ptxt,!macro);
3500
FREE_MEM(t,"t",2,text);
3501
n->equiv_or_xref= NULL;
3502
n->info.Macro_type= NOT_DEFINED;
3504
FREE_MEM(I,"unroll:I",SAVE8,eight_bits);
3505
FREE_MEM(Imin,"unroll:Imin",SAVE8,eight_bits);
3506
FREE_MEM(Imax,"unroll:Imax",SAVE8,eight_bits);
3507
FREE_MEM(txt,"unroll:txt",SAVE8,eight_bits);
3515
insert.program.start= insert.program.end=
3516
GET_MEM("program",2,eight_bits);
3517
insert.module.start= insert.module.end=
3518
GET_MEM("module",2,eight_bits);
3519
insert.subroutine.start= insert.subroutine.end=
3520
GET_MEM("subroutine",2,eight_bits);
3521
insert.function.start= insert.function.end=
3522
GET_MEM("function",2,eight_bits);
3523
insert.blockdata.start= insert.blockdata.end=
3524
GET_MEM("blockdata",2,eight_bits);
3525
insert.interface.start= insert.interface.end=
3526
GET_MEM("interface",2,eight_bits);