Trailing-Edge
-
PDP-10 Archives
-
decuslib20-04
-
decus/20-0135/10/form.sim
There are 4 other files named form.sim in the archive. Click here to see a list.
00040 OPTIONS(/e/l);
00080 EXTERNAL CHARACTER PROCEDURE fetchar, insinglechar;
00120 EXTERNAL INTEGER PROCEDURE trmop, gettab, checkreal, checkint, iondx;
00160 EXTERNAL PROCEDURE depchar, echo, abort, outchr, forceout, outstring;
00180 EXTERNAL PROCEDURE outche;
00200 EXTERNAL TEXT PROCEDURE frontstrip, upcase, storbokstav, tmpin, scanto;
00220 EXTERNAL TEXT PROCEDURE maketext;
00240 EXTERNAL BOOLEAN PROCEDURE tmpout, meny;
00280 EXTERNAL CLASS vista, termty;
00320 vista CLASS form;
00360 NOT HIDDEN PROTECTED myinimage, show_page, ask_page, field,
00400 intfield, realfield, choicefield, alphafield, first_field,
00440 stopasking;
00480 NOT HIDDEN height, echon, echoff, terminaltype,
00520 resume_display, cancel_display, start_blink, stop_blink,
00560 cause_real_time_delay, get_char_from_screen,
00600 synchronize, restore_the_whole_screen,
00640 home_the_cursor, set_char_on_screen,
00680 outchar, blank_line, outimage, outtext, make_blank,
00720 outfix, outreal, outint,
00760 restore_one_char,
00800 insingle, inimage, inint, inreal,
00840 inword, inyes, move_the_cursor_to, blank_the_screen,
00880 stopblink, startblink,
00920 horizontalpos, verticalpos,
00960 up, down, left, right, altmode,
01000 carriagereturn, linefeed, home, fill,
01040 null, tab, formfeed, verttab,
01080 controlchar, screen, echoenabled;
01120 BEGIN
01160 REF (field) last_field, first_field, main_field,
01200 temp_field;
01240 BOOLEAN error_is_blinking, got_movechar, stopask,
01280 last_is_controlchar;
01320 INTEGER errmesslength, i, line, order, cover_length;
01360 CHARACTER c, movechar; TEXT temp_answer;
01400
01440 PROCEDURE stopasking; stopask:= TRUE;
01480
01520
01560 PROCEDURE myinimage(length, stopchar);
01600 INTEGER length; CHARACTER stopchar;
01640 BEGIN
01680 BOOLEAN nostopchar; INTEGER count, firstpos;
01720 firstpos:= horizontalpos;
01760 sysin.image:= NOTEXT;
01800 sysin.image.setpos(1);
01840 WHILE TRUE DO
01880 BEGIN
01920 IF count > length THEN GOTO out;
01960 c:= insingle(TRUE);
02000 IF NOT nostopchar THEN
02040 nostopchar:= stopchar NE c ELSE IF c = stopchar THEN
02080 GOTO out;
02120 IF NOT controlchar AND c NE fill THEN
02160 BEGIN
02200 sysin.image.putchar(c); count:= count+1;
02240 last_is_controlchar:= FALSE;
02280 IF c = '?' AND count = 1 THEN GOTO outfast;
02320 END ELSE
02360 BEGIN
02400 IF c =
02440 carriagereturn THEN
02480 BEGIN insingle(TRUE);
02520 GOTO outfast;
02560 END;
02600 last_is_controlchar:= TRUE;
02640 BEGIN
02680 IF c NE fill THEN GOTO out;
02720 last_is_controlchar:= FALSE;
02760 IF horizontalpos < firstpos THEN
02800 move_the_cursor_to(firstpos,verticalpos);
02840 IF sysin.pos > 1 THEN
02880 BEGIN
02920 IF echoenabled THEN
02960 BEGIN
03000 IF count <= 0 THEN outchar(' ');
03040 END ELSE
03080 BEGIN
03120 sysin.setpos(sysin.pos-1);
03160 sysin.image.putchar(' ');
03200 sysin.setpos(sysin.pos-1);
03240 END;
03280 END;
03320 END;
03360 END;
03400 END;
03440 out: IF c NE tab THEN
03480 sysin.image.putchar(c);
03520 outfast: sysin.image.setpos(1);
03560 END;
03600
03640 PROCEDURE show_page;
03680 BEGIN
03720 FOR temp_field:- first_field,
03760 temp_field.next WHILE temp_field =/= NONE DO
03800 INSPECT temp_field DO
03840 BEGIN
03880 putheader; answer:- NOTEXT;
03920 END;
03960 END;
04000
04040 PROCEDURE ask_page;
04080 BEGIN
04120 loop: IF stopask THEN stopask:= FALSE ELSE
04160 FOR temp_field:- first_field,
04200 temp_field.next WHILE temp_field =/= NONE DO
04240 IF temp_field.answer = NOTEXT THEN
04280 BEGIN
04320 resume(temp_field);
04360 GOTO loop;
04400 END;
04440 sysout.breakoutimage;
04480 END;
04520
04560 CLASS field(h,v,header,length,stopchar, helptext);
04600 VALUE header, helptext;
04640 INTEGER h, v, length; CHARACTER stopchar;
04680 TEXT header, helptext;
04720 VIRTUAL: PROCEDURE help;
04760 BEGIN
04800 TEXT answer; INTEGER orderinline;
04840 REF(field) next;
04880
04920 PROCEDURE help;
04960 BEGIN
05000 IF helptext == NOTEXT THEN helptext:-
05040 copy("There is no HELP available here");
05080 blank_line(18);
05120 move_the_cursor_to(0,18); outtext(helptext); breakoutimage;
05160 error_is_blinking:= TRUE;
05200 END;
05240
05280 PROCEDURE error(errmess); VALUE errmess; TEXT errmess;
05320 BEGIN
05360 move_the_cursor_to(0,18); start_blink;
05400 outtext("->"); stop_blink;
05440 outtext(errmess);
05480 error_is_blinking:= TRUE;
05520 errmesslength:= errmess.length;
05560 GOTO get_answer;
05600 END;
05640
05680 PROCEDURE putheader;
05720 IF header =/= NOTEXT THEN
05760 BEGIN
05800 move_the_cursor_to(h,v); outtext(header);
05840 END;
05880
05920 PROCEDURE screen_answer(answer);
05960 TEXT answer;
06000 COMMENT will put answer onto screen,
06040 covering cover_length chars;
06080 BEGIN
06120 move_the_cursor_to(h+header.length+1,v);
06160 outtext(answer);
06200 make_blank(length-answer.length);
06240 END;
06280
06320 PROCEDURE change_answer(new_answer);
06360 VALUE new_answer; TEXT new_answer;
06400 BEGIN
06440 i:= answer.length;
06480 answer:- new_answer;
06520 screen_answer(answer);
06560 END;
06600
06640 IF last_field =/= NONE THEN last_field.next:- THIS
06680 field;
06720 last_field:- THIS field;
06760 IF first_field == NONE THEN first_field:- THIS field;
06800 IF line NE v THEN
06840 BEGIN
06880 line:= v; order:= orderinline:= 1;
06920 END ELSE
06960 BEGIN orderinline:= order:= order+1;
07000 END;
07040 detach;
07080 get_answer:
07120 move_the_cursor_to(h+header.length+1,v);
07160 IF echoenabled THEN inimage ELSE
07200 myinimage(length,stopchar);
07240 temp_answer:- copy(frontstrip(sysin.image.strip));
07280 IF temp_answer = "?" THEN
07320 BEGIN help; GOTO get_answer;
07360 END;
07400 IF sysin.image.sub(1,1) = " " AND temp_answer =/= NOTEXT
07440 THEN screen_answer(temp_answer);
07480 movechar:= IF temp_answer == NOTEXT THEN ' ' ELSE
07520 temp_answer.sub(temp_answer.length,1).getchar;
07560 got_movechar:= IF last_is_controlchar THEN
07600 movechar = left OR movechar = right
07640 OR movechar = up OR movechar = down
07680 OR movechar = home ELSE FALSE;
07720 IF error_is_blinking THEN
07760 BEGIN
07800 blank_line(18); error_is_blinking:= FALSE;
07840 IF answer.length > temp_answer.length THEN
07880 BEGIN
07920 move_the_cursor_to(h+header.length+1
07960 +temp_answer.length-
08000 (IF got_movechar THEN 1 ELSE 0),v);
08040 cover_length:= answer.length-temp_answer.length
08080 +(IF got_movechar THEN 1 ELSE 0);
08120 FOR i:= 1 STEP 1 UNTIL cover_length DO outchar(' ');
08160 END;
08200 answer:- NOTEXT;
08240 END;
08280 IF answer.length > temp_answer.length AND
08320 NOT (NOT echoenabled AND got_movechar
08360 AND temp_answer.length = 1) THEN
08400 BEGIN
08440 move_the_cursor_to(h+header.length+1+temp_answer.
08480 length, v);
08520 cover_length:= answer.length;
08560 FOR i:= temp_answer.length+1 STEP 1 UNTIL
08600 cover_length DO outchar(' ');
08640 END;
08680 IF (IF temp_answer == NOTEXT THEN FALSE
08720 ELSE temp_answer.sub(1,1) = "^") THEN
08760 BEGIN
08800 TEXT searched; REF(field) test_field;
08840 screen_answer(answer);
08880 searched:- temp_answer.sub(2,temp_answer.length-1);
08920 test_field:- first_field;
08960 WHILE test_field =/= NONE DO
09000 BEGIN
09040 IF test_field.header.length >= searched.length
09080 THEN
09120 BEGIN
09160 IF test_field.header.sub(1,
09200 searched.length) = searched THEN
09240 BEGIN
09280 IF test_field =/= THIS field THEN
09320 BEGIN
09360 IF main_field == NONE THEN main_field:-
09400 THIS field;
09440 resume(test_field);
09480 END;
09520 GOTO get_answer;
09560 END;
09600 END;
09640 test_field:- test_field.next;
09680 END;
09720 error("No such header.");
09760 END;
09800 IF NOT echoenabled THEN
09840 BEGIN
09880 IF got_movechar THEN
09920 BEGIN
09960 INTEGER goalline, goalorder;
10000 BOOLEAN modified_goal;
10040 REF (field) test_field, back_field;
10080 IF movechar = home THEN
10120 BEGIN goalline:= 0; goalorder:= 1;
10160 END ELSE IF movechar = left THEN
10200 BEGIN goalline:= v; goalorder:= orderinline-1;
10240 IF goalorder < 1 THEN goalorder:= 1;
10280 END ELSE IF movechar = right THEN
10320 BEGIN goalline:= v; goalorder:= orderinline+1;
10360 END ELSE IF movechar = up THEN
10400 BEGIN goalline:= v-1; goalorder:= orderinline;
10440 END ELSE IF movechar = down THEN
10480 BEGIN goalline:= v+1; goalorder:= orderinline;
10520 END;
10560 test_field:- first_field;
10600 WHILE test_field =/= NONE DO
10640 BEGIN
10680 tryagain: IF test_field.v = goalline AND
10720 test_field.orderinline =
10760 goalorder THEN GOTO found;
10800 IF test_field.v > goalline THEN
10840 BEGIN
10880 IF back_field =/= NONE THEN
10920 BEGIN
10960 IF movechar = up AND NOT modified_goal THEN
11000 BEGIN
11040 modified_goal:= TRUE;
11080 goalline:= back_field.v;
11120 test_field:-first_field;
11160 GOTO tryagain;
11200 END ELSE IF movechar = down THEN
11240 BEGIN
11280 IF test_field.v-back_field.v>1 THEN
11320 goalline:=
11360 goalline+test_field.v-back_field.v-1;
11400 GOTO tryagain;
11440 END;
11480 END;
11520 GOTO backfound;
11560 END;
11600 back_field:- test_field;
11640 test_field:- test_field.next;
11680 END;
11720 IF movechar = down AND NOT modified_goal THEN
11760 BEGIN
11800 modified_goal:= TRUE;
11840 goalline:= goalline-1;
11880 test_field:- first_field;
11920 GOTO tryagain;
11960 END;
12000 backfound: IF back_field =/= NONE
12040 THEN test_field:- back_field;
12080 found: IF test_field =/= THIS field THEN
12120 BEGIN
12160 IF main_field == NONE THEN main_field:-
12200 THIS field;
12240 resume(test_field);
12280 END;
12320 GOTO get_answer;
12360 END;
12400 END;
12440 answer:- temp_answer;
12480 INNER; IF main_field == NONE THEN detach ELSE
12520 BEGIN temp_field:- main_field; main_field:- NONE;
12560 IF temp_field =/= THIS field AND
12600 temp_field.answer == NOTEXT THEN
12640 resume(temp_field) ELSE detach;
12680 END;
12720 GOTO get_answer;
12760 END of field;
12800
12840 field CLASS intfield(min,max,rangerror);
12880 VALUE rangerror; INTEGER min, max; TEXT rangerror;
12920 BEGIN
12960 INTEGER intvalue;
13000 answer.setpos(1);
13040 IF checkint(answer) >= 1 AND NOT answer.more THEN
13080 BEGIN
13120 answer.setpos(1); intvalue:= answer.getint;
13160 IF intvalue < min OR intvalue > max THEN
13200 error(rangerror);
13240 END ELSE error("Integer input was expected.");
13280 END;
13320
13360 field CLASS realfield(min,max,rangerror);
13400 VALUE rangerror; REAL min, max; TEXT rangerror;
13440 BEGIN
13480 REAL realvalue;
13520 answer.setpos(1);
13560 IF checkreal(answer) >= 1 AND NOT answer.more THEN
13600 BEGIN
13640 answer.setpos(1); realvalue:= answer.getreal;
13680 IF realvalue < min OR realvalue > max THEN
13720 error(rangerror);
13760 END ELSE error("Integer input was expected.");
13800 END;
13840
13880 field CLASS choicefield(nonemessage);
13920 VALUE nonemessage; TEXT nonemessage;
13960 BEGIN
14000 CLASS choice(choicetext);
14040 VALUE choicetext; TEXT choicetext;
14080 BEGIN
14120 REF (choice) nextchoice;
14160 upcase(choicetext);
14200 IF lastchoice =/= NONE THEN
14240 lastchoice.nextchoice:- THIS choice ELSE
14280 firstchoice:- THIS choice;
14320 lastchoice:- THIS choice;
14360 END;
14400 REF (choice) firstchoice, lastchoice, tempchoice;
14440 REF (choice) foundchoice;
14480 foundchoice:- NONE;
14520 upcase(answer);
14560 IF answer =/= NOTEXT THEN
14600 BEGIN
14640 tempchoice:- firstchoice;
14680 WHILE tempchoice =/= NONE DO
14720 BEGIN
14760 INSPECT tempchoice DO
14800 IF answer.length <= choicetext.length THEN
14840 BEGIN
14880 IF choicetext.sub(1,answer.length) = answer THEN
14920 BEGIN
14960 IF answer.length EQ choicetext.length THEN
15000 GOTO good;
15040 IF foundchoice =/= NONE THEN
15080 BEGIN
15120 error("Ambiguous entry, give more characters.");
15160 GOTO good;
15200 END;
15240 foundchoice:- tempchoice;
15280 END;
15320 END;
15360 tempchoice:- tempchoice.nextchoice;
15400 END;
15440 END;
15480 IF foundchoice == NONE THEN error(nonemessage)
15520 ELSE change_answer(foundchoice.choicetext);
15560 good:
15600 END of choicefield;
15640
15680 field CLASS alphafield;
15720 BEGIN
15760 answer.setpos(1);
15800 WHILE answer.more DO
15840 BEGIN
15880 c:= answer.getchar;
15920 IF NOT letter(c) AND c NE ' ' THEN
15960 error("Only letters accepted in answer.");
16000 END;
16040 END of alphafield;
16080 line:= -1;
16120 END of form;