Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

open-axiom repository from github

24005 views
1
/*
2
Copyright (C) 1991-2002, The Numerical Algorithms Group Ltd.
3
All rights reserved.
4
Copyright (C) 2007-2016, Gabriel Dos Reis.
5
All rights reserved.
6
7
Redistribution and use in source and binary forms, with or without
8
modification, are permitted provided that the following conditions are
9
met:
10
11
- Redistributions of source code must retain the above copyright
12
notice, this list of conditions and the following disclaimer.
13
14
- Redistributions in binary form must reproduce the above copyright
15
notice, this list of conditions and the following disclaimer in
16
the documentation and/or other materials provided with the
17
distribution.
18
19
- Neither the name of The Numerical Algorithms Group Ltd. nor the
20
names of its contributors may be used to endorse or promote products
21
derived from this software without specific prior written permission.
22
23
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
24
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
25
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
26
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
27
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
*/
35
36
#include "debug.h"
37
#include "halloc.h"
38
#include "sockio.h"
39
#include "parse.h"
40
#include "parse-paste.h"
41
#include "parse-types.h"
42
#include "lex.h"
43
#include "hyper.h"
44
#include "extent.h"
45
#include "event.h"
46
#include "display.h"
47
#include "group.h"
48
#include "scrollbar.h"
49
#include "titlebar.h"
50
51
using namespace OpenAxiom;
52
53
static void end_a_page(void );
54
static HyperDocPage * format_page(UnloadedPage * ulpage);
55
static void parse_page(HyperDocPage * page);
56
static void parse_replacepage(void );
57
static void start_footer(void );
58
static void start_scrolling(void );
59
static void Push_MR(void );
60
static void Pop_MR(void );
61
static void parse_title(HyperDocPage * page);
62
static void parse_header(HyperDocPage * page);
63
static void init_parse_page(HyperDocPage * page);
64
65
66
TextNode *curr_node; /* current node being parsed. It is to be the
67
* next one filled */
68
HashTable *gLinkHashTable; /* the hash table of active link windows */
69
TextNode *cur_spadcom; /* The current OpenAxiom command */
70
71
short int gParserMode; /* Parser mode flag */
72
short int gParserRegion; /* Parser Region flag scrolling etc */
73
short int gStringValueOk; /* is a string or box value ok */
74
bool gEndedPage;
75
76
extern int example_number; /* sequence example number */
77
78
79
int ret_val; /* The return value from get_token */
80
81
HyperDocPage *cur_page;
82
83
char *replace_page; /* true if dynamic page is link to static one */
84
85
86
void
87
reset_connection()
88
{
89
if (spad_socket) {
90
FD_CLR(spad_socket->socket, &socket_mask);
91
purpose_table[spad_socket->purpose] = NULL;
92
close(spad_socket->socket);
93
spad_socket->socket = 0;
94
spad_socket = NULL;
95
if (input_string)
96
input_string[0] = '\0';
97
spad_socket->nbytes_pending = 0;
98
connect_spad();
99
}
100
}
101
102
/*
103
* These routines are used for storing an restoring the parser mode. When
104
* I start to parse from string, or from a macro, I need to restore the
105
* parser mode and region once done. These routines do that
106
*
107
*/
108
109
typedef struct mr_stack {
110
/** The structure for storing parser mode and region **/
111
short int fParserMode;
112
short int fParserRegion;
113
struct mr_stack *fNext;
114
} MR_Stack;
115
116
MR_Stack *top_mr_stack = NULL; /** Declaration for the stack **/
117
118
static void
119
Push_MR()
120
{
121
MR_Stack *newStackItem = (MR_Stack *) halloc(sizeof(MR_Stack), "Mode Region Stack");
122
123
newStackItem->fParserMode = gParserMode;
124
newStackItem->fParserRegion = gParserRegion;
125
newStackItem->fNext = top_mr_stack;
126
top_mr_stack = newStackItem;
127
}
128
129
static void
130
Pop_MR()
131
{
132
MR_Stack *old = top_mr_stack;
133
134
if (old == NULL) {
135
fprintf(stderr, "(HyperDoc) Parser Error: Tried to pop empty MR Stack\n");
136
exit(-1);
137
}
138
else {
139
gParserMode = old->fParserMode;
140
gParserRegion = old->fParserRegion;
141
top_mr_stack = old->fNext;
142
free(old);
143
}
144
}
145
146
void
147
load_page(HyperDocPage *page)
148
{
149
if (page->type == UnloadedPageType) {
150
HyperDocPage *new_page;
151
init_scanner();
152
new_page = format_page((UnloadedPage *)page);
153
gWindow->page = new_page;
154
/* free(page); */
155
page = new_page;
156
}
157
}
158
159
HyperDocPage *formatpage;
160
161
/* Display a HyperDoc page with the given name, parsing it if needed */
162
163
void
164
display_page(HyperDocPage *page)
165
{
166
HyperDocPage *new_page;
167
168
XUnmapSubwindows(gXDisplay, gWindow->fMainWindow);
169
XUnmapSubwindows(gXDisplay, gWindow->fScrollWindow);
170
XFlush(gXDisplay);
171
172
if (setjmp(jmpbuf)) {
173
174
/*
175
* since I did not finish formatting the page, let me get rid of what
176
* I had
177
*/
178
free_page(formatpage);
179
/* Replace the buggy page with what I started with */
180
hash_replace(gWindow->fPageHashTable, (char *)page, formatpage->name);
181
if (!strcmp(formatpage->name, "ErrorPage")) {
182
fprintf(stderr, "(HyperDoc) Oops the error page is buggy\n");
183
exit(-1);
184
}
185
gWindow->page = page = (HyperDocPage *) hash_find(gWindow->fPageHashTable, "ErrorPage");
186
if (page == NULL) {
187
fprintf(stderr, "(HyperDoc) No error page found, exiting\n");
188
exit(-1);
189
}
190
reset_connection();
191
}
192
if (page->type == UnloadedPageType || page->type == ErrorPage) {
193
/* Gack! (page should be a union!) */
194
init_scanner();
195
new_page = format_page((UnloadedPage *)page);
196
gWindow->page = new_page;
197
/* free(page); */
198
page = new_page;
199
}
200
show_page(page);
201
}
202
203
204
/* Parse a given HyperDoc Page, from the top */
205
206
static HyperDocPage *
207
format_page(UnloadedPage *ulpage)
208
{
209
/*int ret_val;*/
210
HyperDocPage *page = alloc_page(ulpage->name);
211
212
/*
213
* In case of an error I will have to get at this page so I can free the
214
* waisted memory
215
*/
216
formatpage = page;
217
page->type = Normal;
218
hash_replace(gWindow->fPageHashTable, (char *)page, ulpage->name);
219
220
cfile = find_fp(ulpage->fpos);
221
222
223
page->filename = alloc_string(ulpage->fpos.name);
224
parse_page(page);
225
return page;
226
}
227
228
/* parse the HyperDoc statements in the given string */
229
230
void
231
parse_from_string(char *str)
232
{
233
save_scanner_state();
234
last_ch = NoChar;
235
last_token = 0;
236
input_string = str;
237
input_type = SourceInputKind::String;
238
parse_HyperDoc();
239
restore_scanner_state();
240
}
241
242
static void
243
parse_title(HyperDocPage *page)
244
{
245
TextNode *node;
246
247
Push_MR();
248
gParserRegion = Title;
249
get_expected_token(openaxiom_Lbrace_token);
250
node = alloc_node();
251
page->title = node;
252
node->type = openaxiom_Titlenode_token;
253
node->next = alloc_node();
254
node = node->next;
255
node->type = openaxiom_Center_token;
256
node->next = alloc_node();
257
curr_node = node->next;
258
parse_HyperDoc();
259
curr_node->type = openaxiom_Endcenter_token;
260
curr_node->next = alloc_node();
261
curr_node = curr_node->next;
262
curr_node->type = openaxiom_Endtitle_token;
263
curr_node->next = NULL;
264
if (gNeedIconName) {
265
char *title = print_to_string(page->title);
266
267
XSetIconName(gXDisplay, gWindow->fMainWindow, title);
268
gNeedIconName = 0;
269
}
270
if (token.type != openaxiom_Rbrace_token) {
271
fprintf(stderr, "(HyperDoc) Parse title was expecting a closing brace\n");
272
print_page_and_filename();
273
jump();
274
}
275
linkTitleBarWindows();
276
Pop_MR();
277
}
278
279
static void
280
parse_header(HyperDocPage *page)
281
{
282
TextNode *node;
283
284
Push_MR();
285
gParserRegion = Header;
286
node = alloc_node();
287
page->header = node;
288
node->type = openaxiom_Headernode_token;
289
node->next = alloc_node();
290
curr_node = node->next;
291
parse_HyperDoc();
292
}
293
294
/*
295
* parse a page from the top level
296
*/
297
298
static void
299
init_parse_page(HyperDocPage *page)
300
{
301
gEndedPage = gInDesc = gStringValueOk = gInIf =
302
gInButton = gInOptional = gInVerbatim = gInPaste = gInItems =
303
gInSpadsrc = false;
304
example_number = 1;
305
cur_page = page;
306
gParserMode = AllMode;
307
/* Now I should set the input list to be null */
308
free_input_list(page->input_list);
309
page->input_list = page->current_item = NULL;
310
311
init_top_group();
312
clear_be_stack();
313
314
cur_spadcom = NULL;
315
gLinkHashTable = page->fLinkHashTable;
316
hash_init(
317
gLinkHashTable,
318
LinkHashSize,
319
(EqualFunction) window_equal,
320
(HashcodeFunction) window_code);
321
gPageBeingParsed = page;
322
323
}
324
325
void
326
init_parse_patch(HyperDocPage *page)
327
{
328
gEndedPage = gInDesc = gStringValueOk = gInIf =
329
gInButton = gInOptional = gInVerbatim = gInPaste = gInItems =
330
gInSpadsrc = false;
331
gParserMode = AllMode;
332
gParserRegion = Scrolling;
333
334
init_top_group();
335
clear_be_stack();
336
337
cur_spadcom = NULL;
338
gLinkHashTable = page->fLinkHashTable;
339
gPageBeingParsed = page;
340
}
341
342
#define end_page(t) \
343
((t == openaxiom_Page_token \
344
|| t == openaxiom_NewCommand_token \
345
||t == openaxiom_Endpage_token) ? 1 : 0)
346
347
static void
348
parse_page(HyperDocPage *page)
349
{
350
init_parse_page(page);
351
352
/* Get the name of the page */
353
354
get_expected_token(openaxiom_Page_token);
355
get_expected_token(openaxiom_Lbrace_token);
356
get_expected_token(openaxiom_Word_token);
357
if (page->name == NULL)
358
page->name = alloc_string(token.id);
359
get_expected_token(openaxiom_Rbrace_token);
360
/* parse the title */
361
gWindow->fDisplayedWindow = gWindow->fMainWindow;
362
parse_title(page);
363
364
/*
365
* Now start parsing the header region
366
*/
367
parse_header(page);
368
}
369
370
char *ExpectedBeginScroll =
371
"Parser Error: Unexpected new page, expecting a begin scroll\n", *ExpectedEndScroll =
372
"Parser Error: Unexpected new page, expected an end scroll\n";
373
374
/*
375
* The general HyperDoc parsing function. expects to see anything. This
376
* function will parse until it sees either: 1) A new page starting 2) An end
377
* of file 3) a closing bracket "}"
378
*/
379
380
void
381
parse_HyperDoc()
382
{
383
TextNode *node = NULL /*, *save_node = NULL, *arg_node = NULL*/ ;
384
385
for(;;) {
386
ret_val = get_token();
387
388
if (ret_val == EOF)
389
return;
390
391
switch (token.type) {
392
case openaxiom_Spadsrc_token:
393
parse_spadsrc(curr_node);
394
break;
395
case openaxiom_Helppage_token:
396
parse_help();
397
break;
398
case openaxiom_Endpatch_token:
399
case openaxiom_Endpaste_token:
400
case openaxiom_Rbrace_token:
401
return;
402
case openaxiom_Paste_token:
403
parse_paste();
404
break;
405
case openaxiom_Pastebutton_token:
406
parse_pastebutton();
407
break;
408
case openaxiom_Endpage_token:
409
case openaxiom_NewCommand_token:
410
case openaxiom_Page_token:
411
end_a_page();
412
return;
413
case openaxiom_EndScroll_token:
414
token.type = openaxiom_Endscroll_token;
415
case openaxiom_Endscroll_token:
416
start_footer();
417
break;
418
case openaxiom_Beginscroll_token:
419
start_scrolling();
420
break;
421
case openaxiom_Thispage_token: /* it really is just a word */
422
curr_node->type = openaxiom_Word_token;
423
curr_node->data.text = alloc_string(gPageBeingParsed->name);
424
break;
425
case openaxiom_Icorrection_token:
426
node->type = openaxiom_Noop_token;
427
break;
428
case openaxiom_Newcond_token:
429
parse_newcond();
430
break;
431
case openaxiom_Setcond_token:
432
parse_setcond();
433
break;
434
case openaxiom_Dollar_token:
435
parse_verbatim(openaxiom_Math_token);
436
break;
437
case openaxiom_Verbatim_token:
438
parse_verbatim(openaxiom_Verbatim_token);
439
break;
440
case openaxiom_Ifcond_token:
441
parse_ifcond();
442
break;
443
case openaxiom_Fi_token:
444
if (gInIf)
445
return;
446
else {
447
curr_node->type = openaxiom_Noop_token;
448
/* Oops I had a problem parsing this puppy */
449
fprintf(stderr, "(HyperDoc) \\fi found without macthing if?\n");
450
longjmp(jmpbuf, 1);
451
fprintf(stderr, "(HyperDoc) Longjmp failed -- Exiting \n");
452
exit(-1);
453
}
454
case openaxiom_Else_token:
455
if (gInIf)
456
return;
457
else {
458
/* Oops I had a problem parsing this puppy */
459
curr_node->type = openaxiom_Noop_token;
460
fprintf(stderr, "(HyperDoc) \\else found without macthing if?\n");
461
longjmp(jmpbuf, 1);
462
fprintf(stderr, "(HyperDoc) Longjmp failed -- Exiting \n");
463
exit(-1);
464
}
465
case openaxiom_Macro_token:
466
parse_macro();
467
break;
468
case openaxiom_Env_token:
469
/** In this case, get the environment value, and make it a word **/
470
parse_env(curr_node);
471
break;
472
case openaxiom_WindowId_token:
473
curr_node->type = openaxiom_WindowId_token;
474
curr_node->space = token.id[-1];
475
curr_node->data.text = window_id(gWindow->fMainWindow);
476
break;
477
case openaxiom_Punctuation_token:
478
case openaxiom_Word_token:
479
case openaxiom_Lsquarebrace_token:
480
case openaxiom_Dash_token:
481
curr_node->type = token.type;
482
curr_node->space = token.id[-1];
483
curr_node->data.text = alloc_string(token.id);
484
break;
485
case openaxiom_Pagename_token:
486
{
487
char *str;
488
489
curr_node->type = openaxiom_Word_token;
490
curr_node->space = 0;
491
str = halloc(strlen(cur_page->name) + 1, "parse");
492
sprintf(str, "%s", cur_page->name);
493
curr_node->data.text = alloc_string(str);
494
break;
495
}
496
case openaxiom_Examplenumber_token:
497
{
498
char *str;
499
500
curr_node->type = openaxiom_Word_token;
501
curr_node->space = 0;
502
str = halloc(5, "parse");
503
sprintf(str, "%d", example_number);
504
curr_node->data.text = alloc_string(str);
505
break;
506
}
507
case openaxiom_Rsquarebrace_token:
508
if (gInOptional)
509
return;
510
else {
511
curr_node->type = token.type;
512
curr_node->space = token.id[-1];
513
curr_node->data.text = alloc_string(token.id);
514
}
515
break;
516
case openaxiom_EndTitems_token:
517
token.type = openaxiom_Endtitems_token;
518
case openaxiom_Endtitems_token:
519
if (gParserMode != AllMode) {
520
curr_node->type = openaxiom_Noop_token;
521
fprintf(stderr, "(HyperDoc) Found a bad token %s\n", token_table[token.type]);
522
longjmp(jmpbuf, 1);
523
}
524
else {
525
curr_node->type = token.type;
526
break;
527
}
528
case openaxiom_EndItems_token:
529
token.type = openaxiom_Enditems_token;
530
case openaxiom_Enditems_token:
531
gInItems = false;
532
case openaxiom_Horizontalline_token:
533
case openaxiom_Par_token:
534
case openaxiom_Newline_token:
535
case openaxiom_Titem_token:
536
if (gParserMode != AllMode) {
537
curr_node->type = openaxiom_Noop_token;
538
fprintf(stderr, "(HyperDoc) Found a bad token %s\n", token_table[token.type]);
539
longjmp(jmpbuf, 1);
540
}
541
else {
542
curr_node->type = token.type;
543
break;
544
}
545
case openaxiom_Begintitems_token:
546
case openaxiom_Beginitems_token:
547
if (gParserMode != AllMode) {
548
curr_node->type = openaxiom_Noop_token;
549
fprintf(stderr, "(HyperDoc) Found a bad token %s\n", token_table[token.type]);
550
longjmp(jmpbuf, 1);
551
}
552
else {
553
parse_begin_items();
554
break;
555
}
556
case openaxiom_Item_token:
557
parse_item();
558
break;
559
case openaxiom_Mitem_token:
560
parse_mitem();
561
break;
562
case openaxiom_VSpace_token:
563
case openaxiom_Tab_token:
564
case openaxiom_HSpace_token:
565
case openaxiom_Indent_token:
566
case openaxiom_Indentrel_token:
567
parse_value1();
568
break;
569
case openaxiom_Space_token:
570
parse_value2();
571
break;
572
case openaxiom_Lbrace_token:
573
curr_node->type = openaxiom_Group_token;
574
curr_node->space = token.id[-1];
575
push_group_stack();
576
node = alloc_node();
577
curr_node->next = node;
578
curr_node = curr_node->next;
579
parse_HyperDoc();
580
curr_node->type = openaxiom_Endgroup_token;
581
pop_group_stack();
582
break;
583
case openaxiom_Upbutton_token:
584
case openaxiom_Returnbutton_token:
585
case openaxiom_Link_token:
586
case openaxiom_Downlink_token:
587
case openaxiom_Memolink_token:
588
case openaxiom_Windowlink_token:
589
parse_button();
590
break;
591
case openaxiom_Unixlink_token:
592
case openaxiom_LispMemoLink_token:
593
case openaxiom_LispDownLink_token:
594
case openaxiom_Lisplink_token:
595
case openaxiom_Lispcommand_token:
596
case openaxiom_Lispcommandquit_token:
597
case openaxiom_Spadlink_token:
598
case openaxiom_Spaddownlink_token:
599
case openaxiom_Spadmemolink_token:
600
case openaxiom_Unixcommand_token:
601
case openaxiom_Spadcall_token:
602
case openaxiom_Spadcallquit_token:
603
case openaxiom_Qspadcall_token:
604
case openaxiom_Qspadcallquit_token:
605
case openaxiom_Lispwindowlink_token:
606
parse_command();
607
break;
608
case openaxiom_Controlbitmap_token:
609
case openaxiom_Inputbitmap_token:
610
case openaxiom_Inputpixmap_token:
611
case openaxiom_Inputimage_token:
612
parse_input_pix();
613
break;
614
case openaxiom_Box_token:
615
parse_box();
616
break;
617
case openaxiom_Mbox_token:
618
parse_mbox();
619
break;
620
case openaxiom_Free_token:
621
parse_free();
622
break;
623
case openaxiom_Center_token:
624
parse_centerline();
625
break;
626
case openaxiom_Bound_token:
627
add_dependencies();
628
break;
629
case openaxiom_Spadcommand_token:
630
case openaxiom_Spadgraph_token:
631
parse_spadcommand(curr_node);
632
break;
633
case openaxiom_Table_token:
634
parse_table();
635
break;
636
case openaxiom_Beep_token:
637
case openaxiom_Emphasize_token:
638
case openaxiom_BoldFace_token:
639
case openaxiom_Rm_token:
640
case openaxiom_It_token:
641
case openaxiom_Tt_token:
642
case openaxiom_Sl_token:
643
curr_node->type = token.type;
644
curr_node->space = token.id[-1];
645
break;
646
case openaxiom_Inputstring_token:
647
parse_inputstring();
648
break;
649
case openaxiom_SimpleBox_token:
650
parse_simplebox();
651
break;
652
case openaxiom_BoxValue_token:
653
case openaxiom_StringValue_token:
654
if (!gStringValueOk) {
655
strcpy(ebuffer,"(HyperDoc): Unexpected Value Command:");
656
strcat(ebuffer, token.id);
657
658
parser_error(ebuffer);
659
curr_node->type = openaxiom_Noop_token;
660
longjmp(jmpbuf, 1);
661
}
662
curr_node->type = token.type;
663
curr_node->space = token.id[-1];
664
get_expected_token(openaxiom_Lbrace_token);
665
get_expected_token(openaxiom_Word_token);
666
curr_node->data.text = alloc_string(token.id);
667
get_expected_token(openaxiom_Rbrace_token);
668
break;
669
case openaxiom_NoLines_token:
670
gPageBeingParsed->page_flags |= NOLINES;
671
break;
672
case openaxiom_Pound_token:
673
curr_node->type = openaxiom_Pound_token;
674
curr_node->space = token.id[-1];
675
curr_node->next = alloc_node();
676
curr_node = curr_node->next;
677
parse_parameters();
678
break;
679
case openaxiom_Radiobox_token:
680
parse_radiobox();
681
break;
682
case openaxiom_Radioboxes_token:
683
parse_radioboxes();
684
break;
685
case openaxiom_Replacepage_token:
686
parse_replacepage();
687
break;
688
default:
689
fprintf(stderr, "(HyperDoc) Keyword not currently supported: %s\n", token.id);
690
print_page_and_filename();
691
curr_node->type = openaxiom_Noop_token;
692
break;
693
}
694
if (gEndedPage)
695
return;
696
if (curr_node->type != openaxiom_Noop_token) {
697
node = alloc_node();
698
curr_node->next = node;
699
curr_node = node;
700
}
701
}
702
}
703
704
705
/* parse a page from a socket source */
706
707
HyperDocPage *
708
parse_page_from_socket()
709
{
710
HyperDocPage *page = alloc_page((char *) NULL);
711
HyperDocPage *hpage;
712
713
init_scanner();
714
input_type = SourceInputKind::SpadSocket;
715
input_string = "";
716
cur_spadcom = NULL;
717
gLinkHashTable = page->fLinkHashTable;
718
hash_init(
719
gLinkHashTable,
720
LinkHashSize,
721
(EqualFunction) window_equal,
722
(HashcodeFunction) window_code);
723
gPageBeingParsed = page;
724
replace_page = NULL;
725
if (setjmp(jmpbuf)) {
726
/* Ooops, somewhere I had an error */
727
free_page(page);
728
page = (HyperDocPage *) hash_find(gWindow->fPageHashTable, "ErrorPage");
729
reset_connection();
730
}
731
else {
732
parse_page(page);
733
page->type = SpadGen;
734
page->filename = NULL;
735
/* just for kicks, let me add this thing to the hash file */
736
hpage = (HyperDocPage *) hash_find(gWindow->fPageHashTable, page->name);
737
if (hpage)
738
hash_replace(gWindow->fPageHashTable, (char *)page, page->name);
739
else {
740
hash_insert(gWindow->fPageHashTable, (char *)page, page->name);
741
}
742
}
743
if (replace_page != NULL) {
744
free_page(page);
745
page = (HyperDocPage *) hash_find(gWindow->fPageHashTable, replace_page);
746
if (page == NULL)
747
fprintf(stderr, "(HyperDoc) Unknown page: %s\n", replace_page);
748
}
749
return page;
750
}
751
752
HyperDocPage *
753
parse_page_from_unixfd()
754
{
755
HyperDocPage *page = alloc_page((char *) NULL);
756
757
init_scanner();
758
input_type = SourceInputKind::UnixFD;
759
cur_spadcom = NULL;
760
gLinkHashTable = page->fLinkHashTable;
761
hash_init(
762
gLinkHashTable,
763
LinkHashSize,
764
(EqualFunction) window_equal,
765
(HashcodeFunction) window_code);
766
gPageBeingParsed = page;
767
if (setjmp(jmpbuf)) {
768
/* Ooops, somewhere I had an error */
769
free_page(page);
770
page = (HyperDocPage *) hash_find(gWindow->fPageHashTable, "ErrorPage");
771
reset_connection();
772
}
773
else {
774
parse_page(page);
775
page->type = Unixfd;
776
page->filename = NULL;
777
}
778
return page;
779
780
}
781
782
static void
783
start_scrolling()
784
{
785
786
/*
787
* if I am here than I had a begin scroll. This means I should end the
788
* header, and then start parsing the footer
789
*/
790
791
if (gParserRegion != Header) {
792
curr_node->type = openaxiom_Noop_token;
793
fprintf(stderr, "(HyperDoc) Parser Error: Unexpected BeginScrollFound\n");
794
longjmp(jmpbuf, 1);
795
fprintf(stderr, "(HyperDoc) Longjump failed exiting\n");
796
}
797
curr_node->type = openaxiom_Endheader_token;
798
curr_node->next = NULL;
799
Pop_MR();
800
801
Push_MR();
802
gParserRegion = Scrolling;
803
gWindow->fDisplayedWindow = gWindow->fScrollWindow;
804
curr_node = alloc_node();
805
gPageBeingParsed->scrolling = curr_node;
806
curr_node->type = openaxiom_Scrollingnode_token;
807
}
808
809
static void
810
start_footer()
811
{
812
/*
813
* This ends the parsing of the scrolling region, and then starts to
814
* parse the footer
815
*/
816
817
if (gParserRegion != Scrolling) {
818
curr_node->type = openaxiom_Noop_token;
819
fprintf(stderr, "(HyperDoc) Parser Error: Unexpected Endscroll Found\n");
820
print_page_and_filename();
821
longjmp(jmpbuf, 1);
822
fprintf(stderr, "(HyperDoc) Longjump failed exiting\n");
823
}
824
825
curr_node->type = openaxiom_Endscrolling_token;
826
curr_node->next = NULL;
827
Pop_MR();
828
linkScrollBars();
829
830
Push_MR();
831
gParserRegion = Footer;
832
curr_node = alloc_node();
833
curr_node->type = openaxiom_Footernode_token;
834
gPageBeingParsed->footer = curr_node;
835
gWindow->fDisplayedWindow = gWindow->fMainWindow;
836
}
837
838
static void
839
end_a_page()
840
{
841
if (gParserRegion == Scrolling) {
842
fprintf(stderr, "%s\n",
843
"(HyperDoc) end_a_page: Unexpected End of Page occurred \
844
inside a \beginscroll");
845
print_page_and_filename();
846
jump();
847
}
848
gEndedPage = true;
849
if (gParserRegion == Footer) {
850
/* the person had all the regions, I basically just have to leave */
851
curr_node->type = openaxiom_Endscrolling_token;
852
curr_node->next = NULL;
853
Pop_MR();
854
}
855
else if (gParserRegion == Header) {
856
/* person had a header. So just end it and return */
857
curr_node->type = openaxiom_Endheader_token;
858
curr_node->next = NULL;
859
Pop_MR();
860
gPageBeingParsed->scrolling = NULL;
861
gPageBeingParsed->footer = NULL;
862
}
863
}
864
865
static void
866
parse_replacepage()
867
{
868
get_expected_token(openaxiom_Lbrace_token);
869
get_token();
870
replace_page = alloc_string(token.id);
871
get_expected_token(openaxiom_Rbrace_token);
872
}
873
874