MAKEFRAM.LST 83 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058
  1. Listing:
  2. 1 IMPLEMENTATION MODULE MakeFrame;
  3. 2 (*
  4. 3 * REPERTOIRE
  5. 4 * Release 1.6
  6. 5 * By Charles Bradford and Cole Brecheen
  7. 6 * (c) Copyright 1985-1992 PMI
  8. 7 * Green Bay, Wisconsin
  9. 8 * All rights reserved
  10. 9 * (414) 468-6040
  11. 10 *
  12. 11 * $Header: D:/logfiles/mods/makefram.mov 1.8 17 Mar 1991 18:02:14 coleb $
  13. 12 *
  14. 13 * Modified March 9, 1990 - mbc. Change syntax to allow Real.x, where x
  15. 14 * is the number of decimal places on input for the real.
  16. 15 * March 24, 1990 - mbc. move realDecPlaces declaration.
  17. 16 *)
  18. 17
  19. 18
  20. 19 (*EntryDiag:
  21. 20 IMPORT Diagnostics;
  22. 21 :EntryDiag*)
  23. 22
  24. 23 IMPORT ByteFiddler;
  25. 24 IMPORT ErrorManager;
  26. 25 IMPORT FieldTypes;
  27. 26 IMPORT GenLists;
  28. 27 IMPORT LowLevel;
  29. 28 IMPORT M2Strings;
  30. 29 IMPORT MsColors;
  31. 30 IMPORT NdxTypes;
  32. 31 IMPORT Numbers;
  33. 32 IMPORT NumTypes;
  34. 33 IMPORT Parser;
  35. 34 IMPORT PosUtils;
  36. 35 IMPORT ScrnTypes;
  37. 36 IMPORT ScrnUtl1;
  38. 37 IMPORT StrConv;
  39. 38 IMPORT StrCnv1;
  40. 39 IMPORT StrEdit;
  41. 40 IMPORT SYSTEM;
  42. 41 IMPORT VStorage;
  43. 42 IMPORT VWindows;
  44. 43
  45. 44 VAR
  46. 45 Initialized: BOOLEAN;
  47. 46
  48. 47
  49. 48 TYPE
  50. 49 CStackP = POINTER TO CStack;
  51. ***** ^ undeclared identifier
  52. 50 CStack =
  53. 51 RECORD
  54. 52 Ccode: CHAR;
  55. 53 forec, backc: MsColors.AColor;
  56. ***** ^ not supported yet
  57. 54 atrbc: MsColors.AMonoAttribute;
  58. ***** ^ not supported yet
  59. 55 prv, nxt: CStackP;
  60. 56 END;
  61. ***** ^ not supported yet
  62. 57
  63. 58 CONST
  64. 59 AfterLastElmt = 65535;
  65. 60 BorderChar = ':';
  66. 61 MaxScrWidth = 255;
  67. 62 EOF = 32C;
  68. 63 EOL = 15C;
  69. 64 FormFeed = 14C;
  70. 65 blank = ' ';
  71. 66 null = '';
  72. 67 NoFrame = '';
  73. 68 RecType = 1;
  74. 69 SectnEnd = "}";
  75. 70
  76. 71 (* Error Strings *)
  77. 72 BadCommand = 'unrecognized command';
  78. ***** ^ not supported yet
  79. 73 CoEqErr = 'Designate colors with "="';
  80. ***** ^ not supported yet
  81. 74 CoFormErr = 'Color statements must be of form: (number, number) attrib';
  82. ***** ^ not supported yet
  83. 75 CoNumErr = 'Colors must be valid name or number < 16:';
  84. ***** ^ not supported yet
  85. 76 CornerErr = 'Upper left corner is not above and left of the lower right';
  86. ***** ^ not supported yet
  87. 77 DataErr = 'data list is missing or format is invalid';
  88. ***** ^ not supported yet
  89. 78 EdErr = 'number of lines for the editor field is missing';
  90. ***** ^ not supported yet
  91. 79 FewErr = 'Fewer fields in command area than on screen';
  92. ***** ^ not supported yet
  93. 80 FMErr = 'FieldMark (#) error: redefinition invalid or field not closed';
  94. ***** ^ not supported yet
  95. 81 FieldFormErr = 'invalid field type or keyword';
  96. ***** ^ not supported yet
  97. 82 FrameNameErr = "Frame name incorrect or missing; must have ':' in col 0";
  98. ***** ^ not supported yet
  99. 83 FrameErr = 'Frame must start with either ==== or frame name';
  100. ***** ^ not supported yet
  101. 84 GroupErr = 'Choice fields must be inside groups';
  102. ***** ^ not supported yet
  103. 85 HelpErr = 'help list is missing or format is invalid';
  104. ***** ^ not supported yet
  105. 86 HelpFErr = 'frame name for help is missing';
  106. ***** ^ not supported yet
  107. 87 InsuffMem = 'Too little memory';
  108. ***** ^ not supported yet
  109. 88 MoreErr = 'More fields in command section than on screen';
  110. ***** ^ not supported yet
  111. 89 NeedBracket = 'Max and min acceptable values in brackets are missing';
  112. ***** ^ not supported yet
  113. 90 NeedColon = 'colon after position or heading key word is missing';
  114. ***** ^ not supported yet
  115. 91 NeedParen = 'Field subcommands must start with "("';
  116. ***** ^ not supported yet
  117. 92 NeedQuote = 'field name (may be null) in quotes must be supplied';
  118. ***** ^ not supported yet
  119. 93 NestErr = 'Improper nesting of color codes';
  120. ***** ^ not supported yet
  121. 94 NormalErr = 'normal next frame name is missing';
  122. ***** ^ not supported yet
  123. 95 NumSepErr = 'Either numbers or separators are invalid, check format';
  124. ***** ^ not supported yet
  125. 96 ParentErr = 'Bad Parent Frame';
  126. ***** ^ not supported yet
  127. 97 PlacementErr = 'Invalid designation of Frame Above, Below, Left, or Right';
  128. ***** ^ not supported yet
  129. 98 PromptErr = 'prompt text is missing';
  130. ***** ^ not supported yet
  131. 99 SectnEndErr = 'Command sections must end with "}"';
  132. ***** ^ not supported yet
  133. 100 SectnErr = 'Command sections must start with ":{"';
  134. ***** ^ not supported yet
  135. 101 SelectorErr = 'field selector must be a single character';
  136. ***** ^ not supported yet
  137. 102 WinFormErr = 'Invalid keyword in windows subsection command';
  138. ***** ^ not supported yet
  139. 103
  140. 104 VAR
  141. 105 (* the following are screen characteristics that may be
  142. 106 altered gloablly for a file by commands in any screen frame *)
  143. 107 ColorKeys : ARRAY [0 .. 255] OF CHAR;
  144. ***** ^ not supported yet
  145. ***** ^ not supported yet
  146. 108 (* defined colors *)
  147. 109 KeyFors, KeyBacks : ARRAY [0 .. 255] OF MsColors.AColor;
  148. ***** ^ not supported yet
  149. ***** ^ not supported yet
  150. 110 KeyAtrbs : ARRAY [0 .. 255] OF MsColors.AMonoAttribute;
  151. ***** ^ not supported yet
  152. ***** ^ not supported yet
  153. 111
  154. 112 DefaultFore, DefaultBack, DefaultBordfor, DefaultBordbak,
  155. 113 DefaultSelfor, DefaultSelbak, DefaultPbfor, DefaultPbbak,
  156. 114 DefaultMsgfor, DefaultMsgbak, DefaultPromfor,
  157. 115 DefaultPrombak: MsColors.AColor;
  158. ***** ^ not supported yet
  159. 116
  160. 117 DefaultAtrb, DefaultBordatrb, DefaultSelatrb, DefaultPbatrb,
  161. 118 DefaultMsgatrb, DefaultPromatrb : MsColors.AMonoAttribute;
  162. ***** ^ not supported yet
  163. 119
  164. 120 ColorStack: CStackP;
  165. ***** ^ not supported yet
  166. 121 ColorBase: CStack;
  167. ***** ^ not supported yet
  168. 122 (* We make ColorBase a record instead of a pointer so as to
  169. 123 avoid doing dynamic memory allocation during the module
  170. 124 initialization sequence. *)
  171. 125 FieldMark : CHAR;
  172. 126 (* field delimiter in the screen image *)
  173. 127 ReplacingFieldMarks : BOOLEAN;
  174. 128
  175. 129 (* the following variables are used repeatedly and are global
  176. 130 solely for convenience *)
  177. 131 CurrentWord: ARRAY [0..MaxScrWidth] OF CHAR;
  178. ***** ^ not supported yet
  179. ***** ^ not supported yet
  180. 132 (* usually the word retrieved by using GetNextWord *)
  181. 133 Terminator: CHAR;
  182. 134 (* usually the character terminating the word read with GetNextWord *)
  183. 135 CurrentLine: CARDINAL;
  184. 136 (* the line of the input genlist currently being processed *)
  185. 137 CurrentIndex: CARDINAL;
  186. 138 (* the index of the character on the current line currently
  187. 139 being processed *)
  188. 140 DataList, PromptList, HelpList, EdList, FieldList, ImageList, LinkedFrames:
  189. 141 GenLists.GenList;
  190. ***** ^ not supported yet
  191. 142 ErrStrGlobal : ARRAY [0 .. 255] OF CHAR;
  192. ***** ^ not supported yet
  193. ***** ^ not supported yet
  194. 143 FrameRec: ScrnTypes.PackedFrameRec;
  195. ***** ^ not supported yet
  196. 144 HelpFrame, ParentFrame, NormalNextFrame, FrameAbove, FrameBelow,
  197. 145 FrameLeft, FrameRight: ScrnTypes.AFrameName;
  198. ***** ^ not supported yet
  199. 146 BadLineGlobal: CARDINAL;
  200. 147 InListGlobal: GenLists.GenList;
  201. ***** ^ not supported yet
  202. 148 FieldCount, LineCount: CARDINAL;
  203. 149
  204. 150 PROCEDURE EnclosureCount( Opener, Closer: ARRAY OF CHAR;
  205. ***** ^ not supported yet
  206. 151 VAR TheStr: ARRAY OF CHAR; VAR TheCount: INTEGER;
  207. ***** ^ not supported yet
  208. 152 VAR StartFound, EndFound: BOOLEAN; CutWhenFound: BOOLEAN );
  209. 153
  210. 154 (* A general purpose procedure for keeping track of delimiters
  211. 155 that can cross strings and that can be nested. It's meant
  212. 156 to be called in a loop, and is useful in parsing series of
  213. 157 strings when you need to find closing quotes, braces,
  214. 158 brackets, etc. The first time you call it, StartFound and
  215. 159 EndFound should be false, and TheCount should be 0. If at
  216. 160 some point in the loop you pass it a string that contains
  217. 161 Opener, it sets StartFound to TRUE and begins to count
  218. 162 instances of Opener and Closer in TheStr--each Opener
  219. 163 increments TheCount, and each Closer decrements it. Because
  220. 164 StartFound will still be true the next time EnclosureCount
  221. 165 is called, this continues until the Closer that matches
  222. 166 Opener is found (i.e., until TheCount returns to 0). At
  223. 167 that point, EndFound gets set to TRUE. If the CutWhenFound
  224. 168 parameter is TRUE, the first Opener and the last Closer are
  225. 169 deleted from TheStr. *)
  226. 170
  227. 171 VAR
  228. 172 StrIndex : INTEGER;
  229. 173 StrLngth, OpenerLngth, CloserLngth : CARDINAL;
  230. 174 BEGIN
  231. 175 IF NOT StartFound THEN
  232. 176 TheCount := 0;
  233. 177 IF NOT PosUtils.Present( Opener, TheStr ) THEN
  234. ***** ^ not supported yet
  235. ***** ^ not supported yet
  236. ***** ^ not supported yet
  237. ***** ^ not supported yet
  238. 178 RETURN;
  239. 179 END;
  240. 180 END;
  241. 181 EndFound := FALSE;
  242. 182 StrLngth := M2Strings.Length( TheStr );
  243. ***** ^ not supported yet
  244. ***** ^ not supported yet
  245. ***** ^ not supported yet
  246. 183 OpenerLngth := M2Strings.Length( Opener );
  247. ***** ^ not supported yet
  248. ***** ^ not supported yet
  249. ***** ^ not supported yet
  250. 184 CloserLngth := M2Strings.Length( Closer );
  251. ***** ^ not supported yet
  252. ***** ^ not supported yet
  253. ***** ^ not supported yet
  254. 185 StrIndex := 0;
  255. 186 WHILE (StrIndex < INTEGER(StrLngth)) AND (NOT EndFound) DO
  256. ***** ^ not supported yet
  257. 187 IF ((OpenerLngth = 1) AND (TheStr[StrIndex] = Opener[0]))
  258. ***** ^ not supported yet
  259. ***** ^ not supported yet
  260. ***** ^ not supported yet
  261. ***** ^ not supported yet
  262. 188 OR (PosUtils.PosAdr( Opener,
  263. ***** ^ not supported yet
  264. ***** ^ not supported yet
  265. ***** ^ not supported yet
  266. 189 LowLevel.AddAddr(SYSTEM.ADR(TheStr),StrIndex),
  267. ***** ^ not supported yet
  268. ***** ^ not supported yet
  269. ***** ^ not supported yet
  270. ***** ^ not supported yet
  271. ***** ^ not supported yet
  272. ***** ^ not supported yet
  273. 190 OpenerLngth ) = 0) THEN
  274. ***** ^ not supported yet
  275. 191 TheCount := TheCount + 1;
  276. 192 IF (TheCount = 1) THEN
  277. 193 StartFound := TRUE;
  278. 194 IF CutWhenFound THEN
  279. 195 M2Strings.Delete( TheStr, StrIndex, M2Strings.Length(Opener) );
  280. ***** ^ not supported yet
  281. ***** ^ not supported yet
  282. ***** ^ not supported yet
  283. ***** ^ not supported yet
  284. ***** ^ not supported yet
  285. ***** ^ not supported yet
  286. 196 IF StrIndex # 0 THEN
  287. 197 DEC( StrIndex );
  288. ***** ^ undeclared identifier
  289. ***** ^ not supported yet
  290. 198 END;
  291. 199 END;
  292. 200 END;
  293. 201 END;
  294. 202 IF ((CloserLngth = 1) AND (TheStr[StrIndex] = Closer[0]))
  295. ***** ^ not supported yet
  296. ***** ^ not supported yet
  297. ***** ^ not supported yet
  298. ***** ^ not supported yet
  299. 203 OR (PosUtils.PosAdr( Closer,
  300. ***** ^ not supported yet
  301. ***** ^ not supported yet
  302. ***** ^ not supported yet
  303. 204 LowLevel.AddAddr(SYSTEM.ADR(TheStr),StrIndex),
  304. ***** ^ not supported yet
  305. ***** ^ not supported yet
  306. ***** ^ not supported yet
  307. ***** ^ not supported yet
  308. ***** ^ not supported yet
  309. ***** ^ not supported yet
  310. 205 CloserLngth ) = 0) THEN
  311. ***** ^ not supported yet
  312. 206 TheCount := TheCount - 1;
  313. 207 IF StartFound AND (TheCount = 0) THEN
  314. 208 IF CutWhenFound THEN
  315. 209 M2Strings.Delete( TheStr, StrIndex, M2Strings.Length(Closer) );
  316. ***** ^ not supported yet
  317. ***** ^ not supported yet
  318. ***** ^ not supported yet
  319. ***** ^ not supported yet
  320. ***** ^ not supported yet
  321. ***** ^ not supported yet
  322. 210 END;
  323. 211 EndFound := TRUE;
  324. 212 END;
  325. 213 END;
  326. 214 INC( StrIndex );
  327. ***** ^ undeclared identifier
  328. ***** ^ not supported yet
  329. 215 END;
  330. 216 END EnclosureCount;
  331. ***** ^ not supported yet
  332. 217
  333. 218
  334. 219
  335. 220 PROCEDURE EncodeColor( colr: MsColors.AColor): CHAR;
  336. ***** ^ not supported yet
  337. 221 VAR
  338. 222 tmpbyte:
  339. 223 RECORD
  340. 224 CASE : BOOLEAN OF
  341. ***** ^ not supported yet
  342. ***** ^ 'POINTER' expected
  343. 225 TRUE: tcolr: MsColors.AColor;
  344. 226 | FALSE: tlow, thi: CHAR;
  345. 227 END;
  346. 228 END;
  347. 229 BEGIN
  348. 230 tmpbyte.tcolr := colr;
  349. 231 ScrnUtl1.EncodeByte( tmpbyte.tlow);
  350. 232 RETURN tmpbyte.tlow;
  351. 233 END EncodeColor;
  352. 234
  353. 235 PROCEDURE EncodeAttrib( att: MsColors.AMonoAttribute): CHAR;
  354. 236 VAR
  355. 237 tmpbyte:
  356. 238 RECORD
  357. 239 CASE : BOOLEAN OF
  358. 240 TRUE: tatt: MsColors.AMonoAttribute;
  359. 241 | FALSE: tlow, thi: CHAR;
  360. 242 END;
  361. 243 END;
  362. 244 BEGIN
  363. 245 tmpbyte.tatt := att;
  364. 246 ScrnUtl1.EncodeByte( tmpbyte.tlow);
  365. 247 RETURN tmpbyte.tlow;
  366. 248 END EncodeAttrib;
  367. 249
  368. 250
  369. 251 PROCEDURE ReportErr( ErrDesc: ARRAY OF CHAR) : BOOLEAN;
  370. 252 (* appends an error description to the current line of text
  371. 253 and sets the bad line number. Always returns FALSE for
  372. 254 calling convenience (see usage below). *)
  373. 255 BEGIN
  374. 256 M2Strings.Assign( Parser.TheLine, ErrStrGlobal);
  375. 257 StrEdit.CutLeadingChars( ' ', ErrStrGlobal );
  376. 258 StrEdit.CutTrailingChars( ' ', ErrStrGlobal );
  377. 259 M2Strings.Insert( ' "', ErrStrGlobal, 0 );
  378. 260 StrEdit.Append( ErrStrGlobal, '" : ');
  379. 261 StrEdit.Append( ErrStrGlobal, ErrDesc);
  380. 262 BadLineGlobal := CurrentLine;
  381. 263 RETURN FALSE;
  382. 264 END ReportErr;
  383. 265
  384. 266
  385. 267 PROCEDURE GetColorNum( str: ARRAY OF CHAR; VAR num: CARDINAL ): BOOLEAN;
  386. 268 BEGIN
  387. 269 IF (StrConv.StrToCardinal( str, 0, num)) THEN
  388. 270 IF (num > 15) THEN
  389. 271 RETURN ReportErr( CoNumErr);
  390. 272 END;
  391. 273 RETURN TRUE;
  392. 274 END;
  393. 275 IF PosUtils.Equal('BLACK', str) THEN
  394. 276 num := 0;
  395. 277 ELSIF PosUtils.Equal('BLUE', str) THEN
  396. 278 num := 1;
  397. 279 ELSIF PosUtils.Equal('GREEN', str) THEN
  398. 280 num := 2;
  399. 281 ELSIF PosUtils.Equal('CYAN', str) THEN
  400. 282 num := 3;
  401. 283 ELSIF PosUtils.Equal('RED', str) THEN
  402. 284 num := 4;
  403. 285 ELSIF PosUtils.Equal('MAGENTA', str) THEN
  404. 286 num := 5;
  405. 287 ELSIF PosUtils.Equal('BROWN', str) THEN
  406. 288 num := 6;
  407. 289 ELSIF PosUtils.Equal('LIGHTGREY', str) THEN
  408. 290 num := 7;
  409. 291 ELSIF PosUtils.Equal('DARKGREY', str) THEN
  410. 292 num := 8;
  411. 293 ELSIF PosUtils.Equal('LIGHTBLUE', str) THEN
  412. 294 num := 9;
  413. 295 ELSIF PosUtils.Equal('LIGHTGREEN', str) THEN
  414. 296 num := 10;
  415. 297 ELSIF PosUtils.Equal('LIGHTCYAN', str) THEN
  416. 298 num := 11;
  417. 299 ELSIF PosUtils.Equal('PINK', str) THEN
  418. 300 num := 12;
  419. 301 ELSIF PosUtils.Equal('LIGHTMAGENTA', str) THEN
  420. 302 num := 13;
  421. 303 ELSIF PosUtils.Equal('YELLOW', str) THEN
  422. 304 num := 14;
  423. 305 ELSIF PosUtils.Equal('BRIGHTWHITE', str) THEN
  424. 306 num := 15;
  425. 307 ELSE
  426. 308 num := 0;
  427. 309 RETURN ReportErr( CoNumErr);
  428. 310 END;
  429. 311 RETURN TRUE;
  430. 312 END GetColorNum;
  431. 313
  432. 314
  433. 315 PROCEDURE NameToAttrib( TheName : ARRAY OF CHAR; VAR answer :
  434. 316 MsColors.AMonoAttribute) : BOOLEAN;
  435. 317 (* converts a string to a text attribute *)
  436. 318 BEGIN
  437. 319 IF PosUtils.Equal('PLAIN',TheName) THEN
  438. 320 answer := MsColors.plain;
  439. 321 ELSIF PosUtils.Equal('BOLD',TheName) THEN
  440. 322 answer := MsColors.bold;
  441. 323 ELSIF PosUtils.Equal('UNDERSCORED',TheName) THEN
  442. 324 answer := MsColors.underscored;
  443. 325 ELSIF PosUtils.Equal('BLINKING',TheName) THEN
  444. 326 answer := MsColors.blinking;
  445. 327 ELSIF PosUtils.Equal('REVERSEVIDEO',TheName) THEN
  446. 328 answer := MsColors.ReverseVideo;
  447. 329 ELSIF PosUtils.Equal('UNDERLINED',TheName) THEN
  448. 330 answer := MsColors.underscored;
  449. 331 ELSIF M2Strings.Length(TheName) = 0 THEN
  450. 332 answer := MsColors.invisible;
  451. 333 (* no attribute specified *)
  452. 334 ELSE
  453. 335 RETURN FALSE;
  454. 336 END;
  455. 337 RETURN TRUE;
  456. 338 END NameToAttrib;
  457. 339
  458. 340 PROCEDURE LastChar( VAR text: ARRAY OF CHAR): CHAR;
  459. 341 (* cut blanks and return the last non-blnk character in the
  460. 342 string *)
  461. 343 BEGIN
  462. 344 StrEdit.CutTrailingChars( blank, text);
  463. 345 IF M2Strings.Length( text) > 0 THEN
  464. 346 RETURN text[ M2Strings.Length( text) - 1];
  465. 347 ELSE
  466. 348 RETURN EOL;
  467. 349 END;
  468. 350 END LastChar;
  469. 351
  470. 352
  471. 353 PROCEDURE CrunchToNextDelim( VAR StartingAndEndingAt: CARDINAL;
  472. 354 VAR text: ARRAY OF CHAR );
  473. 355 VAR
  474. 356 last: CARDINAL;
  475. 357 done: BOOLEAN;
  476. 358 BEGIN
  477. 359 last := M2Strings.Length(text);
  478. 360 IF last = 0 THEN
  479. 361 RETURN;
  480. 362 ELSE
  481. 363 DEC(last);
  482. 364 END;
  483. 365 done := FALSE;
  484. 366 WHILE (StartingAndEndingAt <= last) AND (NOT done) DO
  485. 367 IF text[StartingAndEndingAt] = ' ' THEN
  486. 368 M2Strings.Delete( text, StartingAndEndingAt, 1 );
  487. 369 ELSIF PosUtils.Present( text[StartingAndEndingAt],
  488. 370 Parser.delimiters ) THEN
  489. 371 done := TRUE;
  490. 372 ELSE
  491. 373 INC( StartingAndEndingAt );
  492. 374 END;
  493. 375 END;
  494. 376 END CrunchToNextDelim;
  495. 377
  496. 378 PROCEDURE NextWord( VAR word: ARRAY OF CHAR; VAR term: CHAR);
  497. 379 (* uses global defaults to shorten call to GetNextWord for
  498. 380 code readability and skiping comments*)
  499. 381 BEGIN
  500. 382 Parser.GetNextWord( InListGlobal, CurrentLine, CurrentIndex, word, term);
  501. 383 WHILE PosUtils.Equal(word,Parser.StartComment) DO
  502. 384 Parser.SkipComments(InListGlobal,CurrentIndex,CurrentLine);
  503. 385 Parser.GetNextWord( InListGlobal, CurrentLine, CurrentIndex, word, term);
  504. 386 END;
  505. 387 END NextWord;
  506. 388
  507. 389
  508. 390 PROCEDURE NextWordCap( VAR word: ARRAY OF CHAR; VAR term: CHAR);
  509. 391 (* uses global defaults to shorten call to GetNextWord for
  510. 392 code readability*)
  511. 393 BEGIN
  512. 394 NextWord( word, term);
  513. 395 StrEdit.CAPstr( word);
  514. 396 END NextWordCap;
  515. 397
  516. 398
  517. 399 PROCEDURE NextCrunchedWord( VAR word: ARRAY OF CHAR; VAR term: CHAR);
  518. 400 (* gets the next word with blanks deleted and not counted as a
  519. 401 separator *)
  520. 402 VAR
  521. 403 line, index, spot, TypeCode, StrLngth: CARDINAL;
  522. 404 BEGIN
  523. 405 index:=CurrentIndex;
  524. 406 line:=CurrentLine;
  525. 407 IF CurrentLine <= GenLists.ListLength( InListGlobal ) THEN
  526. 408 NextWord(word,term);
  527. 409 IF line=CurrentLine THEN
  528. 410 CurrentIndex:=index
  529. 411 ELSE
  530. 412 CurrentIndex:=0
  531. 413 END;
  532. 414 END;
  533. 415 (* old version 7/17/91 John McMonagle
  534. 416 WHILE (CurrentIndex >= M2Strings.Length( Parser.TheLine)) AND
  535. 417 (CurrentLine < GenLists.ListLength( InListGlobal)) DO
  536. 418 (* go to next line, skipping blank lines *)
  537. 419 INC( CurrentLine);
  538. 420 GenLists.GetElmt( InListGlobal, CurrentLine, Parser.TheLine, TypeCode);
  539. 421 (*read next line*)
  540. 422 CurrentIndex := 0;
  541. 423 CrunchToNextDelim( CurrentIndex, Parser.TheLine );
  542. 424 (*Set it back to 0.*)
  543. 425 CurrentIndex := 0;
  544. 426 Parser.SkipComments( InListGlobal, CurrentIndex, CurrentLine );
  545. 427 (*We'll go back around if a comment was actually skipped.*)
  546. 428 END;
  547. 429 *)
  548. 430 spot := CurrentIndex;
  549. 431 CrunchToNextDelim( CurrentIndex, Parser.TheLine );
  550. 432 CurrentIndex := spot;
  551. 433 NextWord(word, term);
  552. 434 StrEdit.CAPstr( word);
  553. 435 END NextCrunchedWord;
  554. 436
  555. 437
  556. 438 PROCEDURE GetNextSep( VAR Term: CHAR);
  557. 439 (* A muddled function. Skips over blanks and leaves
  558. 440 CurrentIndex sitting on the first non-blank character that
  559. 441 follows. If that happens to be a delimiter, increments
  560. 442 CurrentIndex once more. *)
  561. 443 BEGIN
  562. 444 WHILE (CurrentIndex < M2Strings.Length( Parser.TheLine)) AND
  563. 445 (Parser.TheLine[ CurrentIndex] = blank) DO
  564. 446 (* skip blanks *)
  565. 447 INC( CurrentIndex);
  566. 448 END;
  567. 449 IF (CurrentIndex < M2Strings.Length( Parser.TheLine)) THEN
  568. 450 (* return sep, if found *)
  569. 451 Term := Parser.TheLine[ CurrentIndex];
  570. 452 IF PosUtils.Present( Term, Parser.delimiters) THEN
  571. 453 (* skip past separator found, so we start at
  572. 454 beginning of next word next time *)
  573. 455 INC( CurrentIndex);
  574. 456 END;
  575. 457 ELSE
  576. 458 Term := EOL;
  577. 459 (* if at end of line, return EOL *)
  578. 460 END;
  579. 461 END GetNextSep;
  580. 462
  581. 463
  582. 464 PROCEDURE NextNum( VAR result: CARDINAL): BOOLEAN;
  583. 465 (* converts next word into a CARDINAL. returns TRUE if OK *)
  584. 466 VAR
  585. 467 Word: ARRAY [0..MaxScrWidth] OF CHAR;
  586. 468 BEGIN
  587. 469 NextWord(Word,
  588. 470 Terminator);
  589. 471 RETURN StrConv.StrToCardinal( Word, 0, result);
  590. 472 END NextNum;
  591. 473
  592. 474
  593. 475 PROCEDURE FindCmdBegin( VAR line, index: CARDINAL): BOOLEAN;
  594. 476 (* looks for the CommandBeginStr and if found, returns:
  595. 477 TRUE, line found on & index past the end of line
  596. 478 else
  597. 479 RETURNS false & line started on & ending index of line. *)
  598. 480 VAR
  599. 481 StartLine, LstLngth, TypeCode: CARDINAL;
  600. 482 BEGIN
  601. 483 StartLine := line;
  602. 484 LstLngth := GenLists.ListLength(InListGlobal);
  603. 485 WHILE (line <= LstLngth) DO
  604. 486 GenLists.GetElmt( InListGlobal, line, Parser.TheLine, TypeCode);
  605. 487 IF PosUtils.Present( CommandBeginStr, Parser.TheLine) THEN
  606. 488 (* found command begin string, so start on next line *)
  607. 489 index := HIGH( Parser.TheLine)+1;
  608. 490 RETURN TRUE;
  609. 491 END;
  610. 492 INC( line);
  611. 493 END;
  612. 494 (* if didn't find cmdbgnstr, go back to starting place *)
  613. 495 line := StartLine;
  614. 496 GenLists.GetElmt( InListGlobal, line, Parser.TheLine, TypeCode);
  615. 497 index := HIGH( Parser.TheLine)+1;
  616. 498 RETURN FALSE;
  617. 499 END FindCmdBegin;
  618. 500
  619. 501
  620. 502 PROCEDURE SetToDefaultColors( VAR FrameRec: ScrnTypes.PackedFrameRec );
  621. 503 BEGIN
  622. 504 WITH FrameRec DO
  623. 505 normatrb := DefaultAtrb;
  624. 506 normfor := DefaultFore;
  625. 507 normbak := DefaultBack;
  626. 508 (* Normal text *)
  627. 509 bordatrb := DefaultBordatrb;
  628. 510 bordfor := DefaultBordfor;
  629. 511 bordbak := DefaultBordbak;
  630. 512 (* Border colors *)
  631. 513 selatrb := DefaultSelatrb;
  632. 514 selfor := DefaultSelfor;
  633. 515 selbak := DefaultSelbak;
  634. 516 (* Selected text *)
  635. 517 pbatrb := DefaultPbatrb;
  636. 518 pbfor := DefaultPbfor;
  637. 519 pbbak := DefaultPbbak;
  638. 520 (* Pointer Bar Colors *)
  639. 521 msgatrb := DefaultMsgatrb;
  640. 522 msgfor := DefaultMsgfor;
  641. 523 msgbak := DefaultMsgbak;
  642. 524 (* Message Box Colors *)
  643. 525 promatrb := DefaultPromatrb;
  644. 526 promfor := DefaultPromfor;
  645. 527 prombak := DefaultPrombak;
  646. 528 (* Prompt Line Colors *)
  647. 529 END;
  648. 530 END SetToDefaultColors;
  649. 531
  650. 532
  651. 533 PROCEDURE InitOutLists();
  652. 534 (* initialize the output genlists *)
  653. 535 BEGIN
  654. 536 GenLists.NewList( DataList);
  655. 537 GenLists.NewList( PromptList);
  656. 538 GenLists.NewList( HelpList);
  657. 539 GenLists.NewList( EdList);
  658. 540 GenLists.NewList( FieldList);
  659. 541 GenLists.NewList( ImageList);
  660. 542 GenLists.NilList( LinkedFrames );
  661. 543 WITH FrameRec DO
  662. 544 ClearFirst := TRUE;
  663. 545 ClearAfter := FALSE;
  664. 546 EntryBox := VWindows.DoubleBox;
  665. 547 ExitBox := VWindows.SingleBox;
  666. 548 Caption[0] := 0C;
  667. 549 VirtualWidth := 0;
  668. 550 VirtualHeight := 0;
  669. 551 startcol := 0;
  670. 552 endcol := 255;
  671. 553 startrow := 0;
  672. 554 endrow := 255;
  673. 555 headline := 0;
  674. 556 action := "I";
  675. 557 END;
  676. 558 SetToDefaultColors( FrameRec );
  677. 559 StrEdit.SetLength( HelpFrame, 0);
  678. 560 StrEdit.SetLength( ParentFrame, 0);
  679. 561 StrEdit.SetLength( NormalNextFrame, 0);
  680. 562 StrEdit.SetLength( FrameAbove, 0 );
  681. 563 StrEdit.SetLength( FrameBelow, 0 );
  682. 564 StrEdit.SetLength( FrameLeft, 0 );
  683. 565 StrEdit.SetLength( FrameRight, 0 );
  684. 566 END InitOutLists;
  685. 567
  686. 568
  687. 569 PROCEDURE GetAFrameName( VAR TheFrame: ARRAY OF CHAR): BOOLEAN;
  688. 570 (* gets the frame key as the next word, if the terminator is OK *)
  689. 571 VAR
  690. 572 tmpstr : ARRAY [0..79] OF CHAR;
  691. 573 BEGIN
  692. 574 IF (Terminator = ":") THEN
  693. 575 NextWord( tmpstr, Terminator);
  694. 576 IF M2Strings.Length(tmpstr) < HIGH(TheFrame) THEN
  695. 577 M2Strings.Assign( tmpstr, TheFrame );
  696. 578 RETURN TRUE;
  697. 579 END;
  698. 580 END;
  699. 581 RETURN FALSE;
  700. 582 END GetAFrameName;
  701. 583
  702. 584
  703. 585 PROCEDURE ListStartOK(): BOOLEAN;
  704. 586 (* checks to see if we are at the valid start of a command
  705. 587 area: we must have a ":" and a "{" next *)
  706. 588 VAR
  707. 589 tmpword: ARRAY [0..80] OF CHAR;
  708. 590 BEGIN
  709. 591 IF (Terminator = ":") THEN
  710. 592 NextCrunchedWord( tmpword, Terminator );
  711. 593 RETURN (M2Strings.Length( tmpword) = 0) AND
  712. 594 (Terminator = "{");
  713. 595 END;
  714. 596 RETURN FALSE;
  715. 597 END ListStartOK;
  716. 598
  717. 599
  718. 600 PROCEDURE GetList( VAR OutList: GenLists.GenList): BOOLEAN;
  719. 601 (* puts the following lines in a genlist, until a "}" is
  720. 602 reached *)
  721. 603 VAR
  722. 604 type: CARDINAL;
  723. 605 stop: BOOLEAN;
  724. 606 BEGIN
  725. 607 IF ListStartOK() THEN
  726. 608 stop := FALSE;
  727. 609 REPEAT
  728. 610 INC( CurrentLine);
  729. 611 IF CurrentLine > GenLists.ListLength( InListGlobal) THEN
  730. 612 RETURN ReportErr( SectnEndErr);
  731. 613 END;
  732. 614 GenLists.GetElmt( InListGlobal, CurrentLine, Parser.TheLine, type);
  733. 615 IF (M2Strings.Length( Parser.TheLine) > 0) AND
  734. 616 (Parser.TheLine[0] = SectnEnd) THEN
  735. 617 stop := TRUE;
  736. 618 ELSIF LastChar( Parser.TheLine) = SectnEnd THEN
  737. 619 M2Strings.Delete( Parser.TheLine,
  738. 620 M2Strings.Length(Parser.TheLine) - 1, 1);
  739. 621 stop := TRUE;
  740. 622 GenLists.ListInsert( Parser.TheLine, GenLists.StrCode,
  741. 623 OutList, AfterLastElmt);
  742. 624 ELSE
  743. 625 GenLists.ListInsert( Parser.TheLine, GenLists.StrCode,
  744. 626 OutList, AfterLastElmt);
  745. 627 END;
  746. 628 UNTIL stop;
  747. 629 (* set CurrentIndex high so GetNextWord will go to the next
  748. 630 line next time. *)
  749. 631 CurrentIndex := HIGH( Parser.TheLine) + 1;
  750. 632 RETURN TRUE;
  751. 633 ELSE
  752. 634 RETURN FALSE;
  753. 635 END;
  754. 636 END GetList;
  755. 637
  756. 638 PROCEDURE GetFieldMark( Terminator: CHAR): BOOLEAN;
  757. 639 (* reads a new field delimiter for use in the display section *)
  758. 640 BEGIN
  759. 641 IF (Terminator = ":") THEN
  760. 642 NextWord( CurrentWord, Terminator);
  761. 643 IF M2Strings.Length( CurrentWord) = 0 THEN
  762. 644 (*They're using a terminator as a field mark.*)
  763. 645 IF (Terminator # ' ') AND (Terminator # EOL) THEN
  764. 646 FieldMark := Terminator;
  765. 647 ELSE
  766. 648 RETURN FALSE;
  767. 649 END;
  768. 650 GetNextSep( Terminator );
  769. 651 (*They may or may not have '; replace' after FieldMark
  770. 652 command. This skips it if it's there, and leaves
  771. 653 CurrentIndex on the EOL if not.*)
  772. 654 ELSIF M2Strings.Length( CurrentWord) = 1 THEN
  773. 655 FieldMark := CurrentWord[0];
  774. 656 ELSE
  775. 657 RETURN FALSE;
  776. 658 END;
  777. 659 ELSE
  778. 660 RETURN FALSE;
  779. 661 END;
  780. 662 RETURN TRUE;
  781. 663 END GetFieldMark;
  782. 664
  783. 665 PROCEDURE CheckHelpFrame();
  784. 666 (* if the help string is only a single word short enough to be
  785. 667 a AFrameName, it is used as the HelpFrame, not a help list *)
  786. 668 VAR
  787. 669 line: ARRAY [0..255] OF CHAR;
  788. 670 lngth, type: CARDINAL;
  789. 671 BEGIN
  790. 672 lngth := GenLists.ListLength( HelpList);
  791. 673 IF (lngth <= 2) THEN
  792. 674 GenLists.GetElmt( HelpList, 1, line, type);
  793. 675 StrEdit.CrunchBlanks( line);
  794. 676 StrEdit.DeleteChar( '}', line );
  795. 677 IF (NOT PosUtils.Present( blank, line)) AND
  796. 678 (M2Strings.Length( line) <= NdxTypes.RecNameLength) THEN
  797. 679 M2Strings.Assign( line, HelpFrame);
  798. 680 GenLists.ListDelete( HelpList, 1, 1);
  799. 681 END;
  800. 682 END;
  801. 683 END CheckHelpFrame;
  802. 684
  803. 685
  804. 686 PROCEDURE SetColorBase( fore, back : MsColors.AColor; attrib:
  805. 687 MsColors.AMonoAttribute);
  806. 688 (* sets a new normal color & attribute, which are kept at the
  807. 689 bottom of the color stack *)
  808. 690 BEGIN
  809. 691 ColorBase.forec := fore;
  810. 692 ColorBase.backc := back;
  811. 693 IF attrib <> MsColors.invisible THEN
  812. 694 ColorBase.atrbc := attrib;
  813. 695 END;
  814. 696 END SetColorBase;
  815. 697
  816. 698 PROCEDURE GetColor( VAR forecolr, backcolr: MsColors.AColor; VAR atrbut:
  817. 699 MsColors.AMonoAttribute): BOOLEAN;
  818. 700 (* decode the following words as colors and attributes *)
  819. 701 VAR
  820. 702 colorord: CARDINAL;
  821. 703 term1 : CHAR;
  822. 704 BEGIN
  823. 705 NextWordCap( CurrentWord, Terminator);
  824. 706 (* get past the "(" *)
  825. 707 IF (M2Strings.Length( CurrentWord) # 0) OR
  826. 708 (Terminator # '(') THEN
  827. 709 RETURN ReportErr( CoFormErr);
  828. 710 END;
  829. 711 NextWordCap( CurrentWord, Terminator);
  830. 712 (* get the 1st color number *)
  831. 713 IF NOT GetColorNum( CurrentWord, colorord ) THEN
  832. 714 RETURN FALSE;
  833. 715 END;
  834. 716 forecolr := VAL( MsColors.AColor, colorord);
  835. 717 (* next, decode background *)
  836. 718 term1 := Terminator;
  837. 719 NextWordCap( CurrentWord, Terminator);
  838. 720 (* get the 2nd color number *)
  839. 721 IF (term1 # ',') OR
  840. 722 (Terminator # ')') THEN
  841. 723 RETURN ReportErr( CoFormErr);
  842. 724 END;
  843. 725 IF NOT GetColorNum( CurrentWord, colorord ) THEN
  844. 726 RETURN FALSE;
  845. 727 END;
  846. 728 backcolr := VAL( MsColors.AColor, colorord);
  847. 729 (* next, decode monochrome attribute *)
  848. 730 GetNextSep( Terminator);
  849. 731 (* see if there is a mono attrib *)
  850. 732 IF Terminator # EOL THEN
  851. 733 (* there is a mono attribute specified *)
  852. 734 NextCrunchedWord( CurrentWord, Terminator);
  853. 735 IF (Terminator # EOL) THEN
  854. 736 (* the mono attrib should be the last word on the line *)
  855. 737 RETURN ReportErr( CoFormErr);
  856. 738 END;
  857. 739 IF NOT NameToAttrib( CurrentWord, atrbut) THEN
  858. 740 RETURN ReportErr( CoFormErr);
  859. 741 END;
  860. 742 END;
  861. 743 RETURN TRUE;
  862. 744 END GetColor;
  863. 745
  864. 746
  865. 747 PROCEDURE DoColorChar( colorchar: CHAR) : BOOLEAN;
  866. 748 (* add the following character to the defined global color codes *)
  867. 749 VAR
  868. 750 poscnt: CARDINAL;
  869. 751 for1, back1: MsColors.AColor;
  870. 752 atrb1: MsColors.AMonoAttribute;
  871. 753 BEGIN
  872. 754 poscnt := PosUtils.Pos( colorchar, ColorKeys);
  873. 755 IF poscnt > HIGH( ColorKeys) THEN
  874. 756 (* color character is new *)
  875. 757 poscnt := M2Strings.Length(ColorKeys);
  876. 758 StrEdit.Append( ColorKeys, colorchar);
  877. 759 KeyAtrbs[poscnt] := DefaultAtrb;
  878. 760 END;
  879. 761 IF NOT GetColor( for1, back1, atrb1) THEN
  880. 762 RETURN FALSE;
  881. 763 END;
  882. 764 (* decode foreground and background *)
  883. 765 KeyFors[poscnt] := for1;
  884. 766 KeyBacks[poscnt] := back1;
  885. 767 IF atrb1 <> MsColors.invisible THEN
  886. 768 (* if an attribute specified, replace attribute *)
  887. 769 KeyAtrbs[poscnt] := atrb1;
  888. 770 END;
  889. 771 RETURN TRUE;
  890. 772 END DoColorChar;
  891. 773
  892. 774
  893. 775 PROCEDURE DoColors() : BOOLEAN;
  894. 776 (* process the color command section *)
  895. 777 VAR
  896. 778 for1, back1 : MsColors.AColor;
  897. 779 atrb1: MsColors.AMonoAttribute;
  898. 780 BEGIN
  899. 781 IF NOT ListStartOK() THEN
  900. 782 RETURN ReportErr( SectnErr);
  901. 783 END;
  902. 784 REPEAT
  903. 785 NextCrunchedWord( CurrentWord, Terminator);
  904. 786 IF (Terminator # "=") AND
  905. 787 (Terminator # blank) AND
  906. 788 (Terminator # SectnEnd) THEN
  907. 789 RETURN ReportErr( CoEqErr);
  908. 790 END;
  909. 791 IF PosUtils.Equal( CurrentWord, 'BORDER') THEN
  910. 792 IF NOT GetColor( for1, back1, atrb1) THEN
  911. 793 RETURN FALSE;
  912. 794 END;
  913. 795 DefaultBordatrb := atrb1;
  914. 796 DefaultBordfor := for1;
  915. 797 DefaultBordbak := back1;
  916. 798
  917. 799 ELSIF PosUtils.Equal(CurrentWord, 'SELECTEDTEXT') THEN
  918. 800 IF NOT GetColor( for1, back1, atrb1) THEN
  919. 801 RETURN FALSE;
  920. 802 END;
  921. 803 DefaultSelatrb := atrb1;
  922. 804 DefaultSelfor := for1;
  923. 805 DefaultSelbak := back1;
  924. 806
  925. 807 ELSIF PosUtils.Equal(CurrentWord, 'NORMALTEXT') THEN
  926. 808 IF NOT GetColor( for1, back1, atrb1) THEN
  927. 809 RETURN FALSE;
  928. 810 END;
  929. 811 DefaultAtrb := atrb1;
  930. 812 DefaultFore := for1;
  931. 813 DefaultBack := back1;
  932. 814 SetColorBase( for1, back1, atrb1);
  933. 815 (* We are changing the normal colors, so change the
  934. 816 colorstack appropriately *)
  935. 817
  936. 818 ELSIF PosUtils.Equal(CurrentWord, 'POINTERBAR') THEN
  937. 819 IF NOT GetColor( for1, back1, atrb1) THEN
  938. 820 RETURN FALSE;
  939. 821 END;
  940. 822 DefaultPbatrb := atrb1;
  941. 823 DefaultPbfor := for1;
  942. 824 DefaultPbbak := back1;
  943. 825
  944. 826 ELSIF PosUtils.Equal(CurrentWord, 'MESSAGES') THEN
  945. 827 IF NOT GetColor( for1, back1, atrb1) THEN
  946. 828 RETURN FALSE;
  947. 829 END;
  948. 830 DefaultMsgatrb := atrb1;
  949. 831 DefaultMsgfor := for1;
  950. 832 DefaultMsgbak := back1;
  951. 833
  952. 834 ELSIF PosUtils.Equal(CurrentWord, 'PROMPTS') THEN
  953. 835 IF NOT GetColor( for1, back1, atrb1) THEN
  954. 836 RETURN FALSE;
  955. 837 END;
  956. 838 DefaultPromatrb := atrb1;
  957. 839 DefaultPromfor := for1;
  958. 840 DefaultPrombak := back1;
  959. 841
  960. 842 ELSIF M2Strings.Length(CurrentWord) = 1 THEN
  961. 843 (* defining a new color code char *)
  962. 844 IF NOT DoColorChar( CurrentWord[0]) THEN
  963. 845 RETURN FALSE;
  964. 846 END;
  965. 847 ELSIF M2Strings.Length(CurrentWord) = 0 THEN
  966. 848 (* do nothing unless hit end of list *)
  967. 849 IF Terminator = EOF THEN
  968. 850 RETURN ReportErr( SectnEndErr);
  969. 851 END;
  970. 852 ELSE
  971. 853 RETURN ReportErr( CoFormErr);
  972. 854 END;
  973. 855 UNTIL Terminator = SectnEnd;
  974. 856 RETURN TRUE;
  975. 857 END DoColors;
  976. 858
  977. 859
  978. 860 PROCEDURE DoWindow() : BOOLEAN;
  979. 861 (* process the window comand section *)
  980. 862
  981. 863 PROCEDURE NextNumSubOne( VAR result: CARDINAL): BOOLEAN;
  982. 864 (* convert the next word to a number and subtract one *)
  983. 865 BEGIN
  984. 866 IF (NOT NextNum( result)) OR
  985. 867 (result = 0) THEN
  986. 868 RETURN FALSE;
  987. 869 END;
  988. 870 DEC( result);
  989. 871 RETURN TRUE;
  990. 872 END NextNumSubOne;
  991. 873
  992. 874 BEGIN
  993. 875 (* DoWindow *)
  994. 876 IF NOT ListStartOK() THEN
  995. 877 RETURN ReportErr( SectnErr);
  996. 878 END;
  997. 879 REPEAT
  998. 880 NextCrunchedWord( CurrentWord, Terminator);
  999. 881 IF PosUtils.Equal( CurrentWord, 'POSITION') THEN
  1000. 882 IF Terminator # ":" THEN
  1001. 883 RETURN ReportErr( NeedColon);
  1002. 884 END;
  1003. 885 NextWordCap( CurrentWord, Terminator);
  1004. 886 WITH FrameRec DO
  1005. 887 IF (Terminator # "(") OR
  1006. 888 (NOT NextNumSubOne( startcol)) OR
  1007. 889 (Terminator # ",") OR
  1008. 890 (NOT NextNumSubOne( startrow)) OR
  1009. 891 (Terminator # ",") OR
  1010. 892 (NOT NextNumSubOne( endcol)) OR
  1011. 893 (Terminator # ",") OR
  1012. 894 (NOT NextNumSubOne( endrow)) OR
  1013. 895 (Terminator # ")") THEN
  1014. 896 RETURN ReportErr( NumSepErr);
  1015. 897 END;
  1016. 898 IF (startcol > endcol) OR
  1017. 899 (startrow > endrow) THEN
  1018. 900 RETURN ReportErr( CornerErr);
  1019. 901 END;
  1020. 902 (* WindowHite := endrow - startrow; no longer used *)
  1021. 903 END;
  1022. 904 ELSIF PosUtils.Equal(CurrentWord, 'NOBOX') THEN
  1023. 905 LowLevel.Fill( SYSTEM.ADR(FrameRec.EntryBox),
  1024. 906 SYSTEM.TSIZE(VWindows.BoxStr), 0C );
  1025. 907 LowLevel.Fill( SYSTEM.ADR(FrameRec.ExitBox),
  1026. 908 SYSTEM.TSIZE(VWindows.BoxStr), 0C );
  1027. 909 (*Null it completely out to prevent confusion when
  1028. 910 we look at raw .DSP file dumps.*)
  1029. 911 ELSIF PosUtils.Equal(CurrentWord, 'SINGLEBOX') THEN
  1030. 912 FrameRec.ExitBox := VWindows.SingleBox;
  1031. 913 FrameRec.EntryBox := VWindows.SingleBox;
  1032. 914 ELSIF PosUtils.Equal(CurrentWord, 'DOUBLEBOX') THEN
  1033. 915 FrameRec.ExitBox := VWindows.SingleBox;
  1034. 916 FrameRec.EntryBox := VWindows.DoubleBox;
  1035. 917 ELSIF PosUtils.Equal(CurrentWord, 'ENTRYBOX') THEN
  1036. 918 IF Terminator = EOL THEN
  1037. 919 LowLevel.Fill( SYSTEM.ADR(FrameRec.EntryBox),
  1038. 920 SYSTEM.TSIZE(VWindows.BoxStr), 0C );
  1039. 921 ELSE
  1040. 922 NextWordCap( FrameRec.EntryBox, Terminator );
  1041. 923 END;
  1042. 924 ELSIF PosUtils.Equal(CurrentWord, 'EXITBOX') THEN
  1043. 925 IF Terminator = EOL THEN
  1044. 926 LowLevel.Fill( SYSTEM.ADR(FrameRec.ExitBox),
  1045. 927 SYSTEM.TSIZE(VWindows.BoxStr), 0C );
  1046. 928 ELSE
  1047. 929 NextWordCap( FrameRec.ExitBox, Terminator );
  1048. 930 END;
  1049. 931 ELSIF PosUtils.Equal(CurrentWord, 'CAPTION') THEN
  1050. 932 IF Terminator = EOL THEN
  1051. 933 FrameRec.Caption[0] := 0C;
  1052. 934 ELSE
  1053. 935 NextWord(FrameRec.Caption, Terminator );
  1054. 936 (* We call NextWord directly to preserve case
  1055. 937 and spacing in the caption. *)
  1056. 938 END;
  1057. 939 ELSIF PosUtils.Equal(CurrentWord, 'OVERLAY') THEN
  1058. 940 FrameRec.ClearFirst := FALSE;
  1059. 941 ELSIF PosUtils.Equal(CurrentWord, 'CLEARFIRST') THEN
  1060. 942 FrameRec.ClearFirst := TRUE;
  1061. 943 ELSIF PosUtils.Equal(CurrentWord, 'CLEARAFTER') THEN
  1062. 944 FrameRec.ClearAfter := TRUE;
  1063. 945 ELSIF PosUtils.Equal(CurrentWord, 'HEADINGLINE') OR
  1064. 946 PosUtils.Equal(CurrentWord, 'HEADING') THEN
  1065. 947 IF Terminator # ":" THEN
  1066. 948 RETURN ReportErr( NeedColon);
  1067. 949 END;
  1068. 950 IF (NOT NextNum( FrameRec.headline)) THEN
  1069. 951 RETURN ReportErr( NumSepErr);
  1070. 952 END;
  1071. 953 ELSIF (M2Strings.Length(CurrentWord) = 0) THEN
  1072. 954 (* do nothing unless at end of list *)
  1073. 955 IF Terminator = EOF THEN
  1074. 956 RETURN ReportErr( SectnEndErr);
  1075. 957 END;
  1076. 958 ELSE
  1077. 959 RETURN ReportErr( WinFormErr);
  1078. 960 END;
  1079. 961 (* Since we are assuming at this point a command has completed we
  1080. 962 will move past any comments etc on the rest of the line *)
  1081. 963 IF Terminator # EOL THEN
  1082. 964 CurrentIndex:=M2Strings.Length(Parser.TheLine)
  1083. 965 END;
  1084. 966 UNTIL Terminator = SectnEnd;
  1085. 967 RETURN TRUE;
  1086. 968 END DoWindow;
  1087. 969
  1088. 970 PROCEDURE InitFieldRec( VAR FieldRec: ScrnTypes.InputFieldRecord);
  1089. 971 (* initializes the field record *)
  1090. 972 BEGIN
  1091. 973 LowLevel.Fill( SYSTEM.ADR(FieldRec), ByteFiddler.Size(FieldRec), 0C );
  1092. 974 END InitFieldRec;
  1093. 975
  1094. 976 PROCEDURE InitImageRec( VAR ImageRec: ScrnTypes.ImageElement );
  1095. 977 BEGIN
  1096. 978 LowLevel.Fill( SYSTEM.ADR(ImageRec), ByteFiddler.Size(ImageRec), 0C );
  1097. 979 ImageRec.row := 1;
  1098. 980 ImageRec.col := 1;
  1099. 981 END InitImageRec;
  1100. 982
  1101. 983 PROCEDURE GetSelector( VAR sel : CARDINAL) : BOOLEAN;
  1102. 984 (* parses field for menu select character *)
  1103. 985 BEGIN
  1104. 986 NextWordCap( CurrentWord, Terminator);
  1105. 987 IF (M2Strings.Length( CurrentWord) > 0) OR (Terminator # "(") THEN
  1106. 988 IF Terminator = SectnEnd THEN
  1107. 989 (* at the end of Fields section *)
  1108. 990 RETURN FALSE;
  1109. 991 ELSE
  1110. 992 RETURN ReportErr( NeedParen);
  1111. 993 END;
  1112. 994 END;
  1113. 995 NextWord( CurrentWord, Terminator );
  1114. 996 (*We use GetNextWord instead of NextWordCap to preserve case
  1115. 997 of the select char.*)
  1116. 998 IF (M2Strings.Length( CurrentWord) > 1) OR (Terminator # ")") THEN
  1117. 999 IF NOT StrConv.StrToCardinal( CurrentWord, 0, sel ) THEN
  1118. 1000 (*This lets us use extended keys as selectors.*)
  1119. 1001 RETURN ReportErr( SelectorErr);
  1120. 1002 ELSE
  1121. 1003 RETURN TRUE;
  1122. 1004 END;
  1123. 1005 END;
  1124. 1006 IF M2Strings.Length( CurrentWord) = 1 THEN
  1125. 1007 (* the menu selector key, if specified for this field *)
  1126. 1008 sel := ORD( CurrentWord[0]);
  1127. 1009 ELSE
  1128. 1010 sel := 0;
  1129. 1011 END;
  1130. 1012 RETURN TRUE;
  1131. 1013 END GetSelector;
  1132. 1014
  1133. 1015 PROCEDURE GetInteger( VAR FieldRec: ScrnTypes.InputFieldRecord) : BOOLEAN;
  1134. 1016 BEGIN
  1135. 1017 FieldRec.typ := ScrnTypes.IntCode;
  1136. 1018 IF (Terminator # "[") THEN
  1137. 1019 RETURN ReportErr( NeedBracket);
  1138. 1020 END;
  1139. 1021 NextWordCap( CurrentWord, Terminator);
  1140. 1022 IF (CurrentWord[0] = 0C) AND (Terminator = "-") THEN
  1141. 1023 (*The lower bound is negative.*)
  1142. 1024 NextWordCap( CurrentWord, Terminator );
  1143. 1025 M2Strings.Insert( "-", CurrentWord, 0 );
  1144. 1026 END;
  1145. 1027 IF (Terminator = ".") THEN
  1146. 1028 (*The bounds are separated with .. instead of - .*)
  1147. 1029 GetNextSep( Terminator );
  1148. 1030 IF (Terminator # ".") THEN
  1149. 1031 RETURN ReportErr( NumSepErr);
  1150. 1032 END;
  1151. 1033 END;
  1152. 1034 IF NOT (StrConv.StrToLongInteger( CurrentWord, 0, FieldRec.iMin)) THEN
  1153. 1035 RETURN ReportErr( NumSepErr);
  1154. 1036 END;
  1155. 1037 NextWordCap( CurrentWord, Terminator);
  1156. 1038 IF (CurrentWord[0] = 0C) AND (Terminator = "-") THEN
  1157. 1039 (*The upper bound is negative.*)
  1158. 1040 NextWordCap( CurrentWord, Terminator );
  1159. 1041 M2Strings.Insert( "-", CurrentWord, 0 );
  1160. 1042 END;
  1161. 1043 IF NOT (StrConv.StrToLongInteger( CurrentWord, 0, FieldRec.iMax)) AND
  1162. 1044 (Terminator = "]") THEN
  1163. 1045 RETURN ReportErr( NeedBracket);
  1164. 1046 END;
  1165. 1047 GetNextSep( Terminator);
  1166. 1048 (* move separator past the ] *)
  1167. 1049 RETURN TRUE;
  1168. 1050 END GetInteger;
  1169. 1051
  1170. 1052
  1171. 1053 PROCEDURE GetReal( VAR FieldRec: ScrnTypes.InputFieldRecord) : BOOLEAN;
  1172. 1054 BEGIN
  1173. 1055 IF (Terminator # "[") THEN
  1174. 1056 RETURN ReportErr( NeedBracket);
  1175. 1057 END;
  1176. 1058 IF NOT StrCnv1.GetEmbeddedReal( Parser.TheLine, CurrentIndex,
  1177. 1059 FieldRec.rMin ) THEN
  1178. 1060 RETURN ReportErr( NumSepErr );
  1179. 1061 END;
  1180. 1062 (* CurrentIndex should now be sitting on whatever follows the first
  1181. 1063 number -- probably a space, maybe a '.' or a '-'. *)
  1182. 1064 IF Parser.TheLine[ CurrentIndex ] = ' ' THEN
  1183. 1065 GetNextSep( Terminator);
  1184. 1066 ELSE
  1185. 1067 INC( CurrentIndex );
  1186. 1068 END;
  1187. 1069 (* CurrentIndex is now sitting on the character following
  1188. 1070 the first character of the separator. *)
  1189. 1071 IF Parser.TheLine[ CurrentIndex ] = '.' THEN
  1190. 1072 (* Don't start looking for the next number in the middle of
  1191. 1073 the .. separator. *)
  1192. 1074 INC( CurrentIndex );
  1193. 1075 END;
  1194. 1076 IF NOT StrCnv1.GetEmbeddedReal( Parser.TheLine, CurrentIndex,
  1195. 1077 FieldRec.rMax ) THEN
  1196. 1078 RETURN ReportErr( NumSepErr );
  1197. 1079 END;
  1198. 1080
  1199. 1081 GetNextSep( Terminator);
  1200. 1082 IF (Terminator # "]") THEN
  1201. 1083 RETURN ReportErr( NumSepErr);
  1202. 1084 END;
  1203. 1085 GetNextSep( Terminator);
  1204. 1086 (* move separator past the ] *)
  1205. 1087 RETURN TRUE;
  1206. 1088 END GetReal;
  1207. 1089
  1208. 1090
  1209. 1091 PROCEDURE GetEdField( VAR FieldRec: ScrnTypes.InputFieldRecord) : BOOLEAN;
  1210. 1092 VAR
  1211. 1093 TmpEdList: GenLists.GenList;
  1212. 1094 BEGIN
  1213. 1095 FieldRec.typ := ScrnTypes.EditorCode;
  1214. 1096 NextWordCap( CurrentWord, Terminator);
  1215. 1097 IF NOT (StrConv.StrToCardinal( CurrentWord, 0, FieldRec.Row2) AND
  1216. 1098 (* Row2 is the number of lines now; we will correct it to
  1217. 1099 the ending virtual row number when we process the image
  1218. 1100 and find out what row it starts on. *)
  1219. 1101 (Terminator = blank)) THEN
  1220. 1102 RETURN ReportErr( EdErr);
  1221. 1103 END;
  1222. 1104 NextWordCap( CurrentWord, Terminator);
  1223. 1105 IF NOT (PosUtils.Equal( CurrentWord, "LINES") OR
  1224. 1106 PosUtils.Equal( CurrentWord, "LINE")) THEN
  1225. 1107 RETURN ReportErr( EdErr);
  1226. 1108 END;
  1227. 1109 FieldRec.TextRow1 := 0;
  1228. 1110 FieldRec.CursorCol := 1;
  1229. 1111 FieldRec.CursorRow := 1;
  1230. 1112 FieldRec.MaxLines := 0;
  1231. 1113 FieldRec.ChangeMade := FALSE;
  1232. 1114 FieldRec.ReadOnly := FALSE;
  1233. 1115 GenLists.NewList( TmpEdList);
  1234. 1116 GenLists.ListInsert( TmpEdList, GenLists.ListCode, EdList, AfterLastElmt);
  1235. 1117 FieldRec.EdFieldNum := GenLists.ListLength( EdList);
  1236. 1118 RETURN TRUE;
  1237. 1119 END GetEdField;
  1238. 1120
  1239. 1121
  1240. 1122 PROCEDURE GetFieldData( VAR FieldRec: ScrnTypes.InputFieldRecord ): BOOLEAN;
  1241. 1123 (* This lets you put the word 'data' somewhere in the list of
  1242. 1124 field attributes in the same way that you put 'prompt' there
  1243. 1125 in releases preceding 1.5d. GetFieldData appends the fieldname to
  1244. 1126 the frame's DataList, and then looks for the next
  1245. 1127 line that contains an opening brace, and puts it plus all
  1246. 1128 lines that follow it up to the matching closing brace into a
  1247. 1129 TmpList, which it then appends to the end of the frame's
  1248. 1130 DataList. This means you can find the data associated with a
  1249. 1131 particular field by starting at the end of the frame's
  1250. 1132 DataList. Any time you find an element that is a list, you
  1251. 1133 look at the preceding element of the frame's DataList to see if it
  1252. 1134 contains the field name in which you are interested. If it
  1253. 1135 does, the elements of the sublist will be the
  1254. 1136 strings retrieved by GetFieldData. We use it for things
  1255. 1137 like initialization of Editor fields and storage of
  1256. 1138 StrLogic expressions. *)
  1257. 1139 VAR
  1258. 1140 TmpList: GenLists.GenList;
  1259. 1141 BraceCount : INTEGER;
  1260. 1142 StartFound, EndFound : BOOLEAN;
  1261. 1143 TypeCode : CARDINAL;
  1262. 1144
  1263. 1145 BEGIN
  1264. 1146 BraceCount := 0;
  1265. 1147 StartFound := FALSE;
  1266. 1148 EndFound := FALSE;
  1267. 1149 GenLists.NewList( TmpList );
  1268. 1150 REPEAT
  1269. 1151 INC( CurrentLine);
  1270. 1152 IF CurrentLine < GenLists.ListLength( InListGlobal) THEN
  1271. 1153 GenLists.GetElmt( InListGlobal, CurrentLine, Parser.TheLine, TypeCode );
  1272. 1154
  1273. 1155 EnclosureCount( '{', '}', Parser.TheLine, BraceCount, StartFound,
  1274. 1156 EndFound, TRUE );
  1275. 1157
  1276. 1158 IF StartFound THEN
  1277. 1159 GenLists.ListInsert( Parser.TheLine, GenLists.StrCode,
  1278. 1160 TmpList, AfterLastElmt);
  1279. 1161 END;
  1280. 1162 ELSE
  1281. 1163 RETURN ReportErr( DataErr);
  1282. 1164 END;
  1283. 1165 UNTIL EndFound;
  1284. 1166 GenLists.ListInsert( FieldRec.fnam, GenLists.StrCode, DataList,
  1285. 1167 AfterLastElmt );
  1286. 1168 (* We insert the field name as the preceding element of the DataList
  1287. 1169 so that users will be able to find the data associated with
  1288. 1170 a particular field by looking for its name. *)
  1289. 1171 GenLists.ListInsert( TmpList, GenLists.ListCode, DataList, AfterLastElmt );
  1290. 1172 CurrentIndex := M2Strings.Length( Parser.TheLine);
  1291. 1173 RETURN TRUE;
  1292. 1174 END GetFieldData;
  1293. 1175
  1294. 1176
  1295. 1177 PROCEDURE GetFieldOptions( VAR FieldRec: ScrnTypes.InputFieldRecord) : BOOLEAN;
  1296. 1178 VAR
  1297. 1179 DataFound, PromptFound : BOOLEAN;
  1298. 1180 type : CARDINAL;
  1299. 1181 BEGIN
  1300. 1182 PromptFound := FALSE;
  1301. 1183 DataFound := FALSE;
  1302. 1184 IF Terminator = SectnEnd THEN
  1303. 1185 RETURN TRUE;
  1304. 1186 END;
  1305. 1187 REPEAT
  1306. 1188 GetNextSep( Terminator);
  1307. 1189 IF Terminator # EOL THEN
  1308. 1190 NextWordCap( CurrentWord, Terminator);
  1309. 1191 IF PosUtils.Equal(CurrentWord, 'REQUIRED') THEN
  1310. 1192 FieldRec.req := TRUE;
  1311. 1193 ELSIF PosUtils.Equal(CurrentWord, 'PROMPT') THEN
  1312. 1194 PromptFound := TRUE;
  1313. 1195 Terminator:=EOL;
  1314. 1196 ELSIF PosUtils.Equal(CurrentWord, 'DATA') THEN
  1315. 1197 DataFound := TRUE;
  1316. 1198 ELSIF PosUtils.Equal(CurrentWord, 'HELP') THEN
  1317. 1199 IF Terminator = EOL THEN
  1318. 1200 RETURN ReportErr( HelpFErr);
  1319. 1201 END;
  1320. 1202 NextWord( FieldRec.HelpFrame, Terminator );
  1321. 1203 (*Changed on 23 Apr 88: use GetNextWord to preserve case
  1322. 1204 sensitivity.*)
  1323. 1205 ELSIF FieldRec.typ = ScrnTypes.EditorCode THEN
  1324. 1206 IF PosUtils.Equal( CurrentWord, "READONLY" ) THEN
  1325. 1207 FieldRec.ReadOnly := TRUE;
  1326. 1208 ELSIF PosUtils.Equal( CurrentWord, "MAXLINES" ) THEN
  1327. 1209 IF NOT NextNum( FieldRec.MaxLines ) THEN
  1328. 1210 FieldRec.MaxLines := 0;
  1329. 1211 RETURN ReportErr( EdErr );
  1330. 1212 END;
  1331. 1213 END;
  1332. 1214 END;
  1333. 1215 END;
  1334. 1216 UNTIL (Terminator = EOL) OR (Terminator = SectnEnd) OR
  1335. 1217 (Terminator = EOF);
  1336. 1218 IF PromptFound THEN
  1337. 1219 (* add the prompt to the prompt list *)
  1338. 1220 IF Terminator = SectnEnd THEN
  1339. 1221 RETURN FALSE;
  1340. 1222 END;
  1341. 1223 INC( CurrentLine);
  1342. 1224 IF CurrentLine < GenLists.ListLength( InListGlobal) THEN
  1343. 1225 GenLists.GetElmt( InListGlobal, CurrentLine, Parser.TheLine, type);
  1344. 1226 GenLists.ListInsert( Parser.TheLine, GenLists.StrCode,
  1345. 1227 PromptList, AfterLastElmt);
  1346. 1228 FieldRec.PromptNum := GenLists.ListLength( PromptList);
  1347. 1229 ELSE
  1348. 1230 RETURN ReportErr( PromptErr);
  1349. 1231 END;
  1350. 1232 CurrentIndex := M2Strings.Length( Parser.TheLine);
  1351. 1233 END;
  1352. 1234 IF DataFound THEN
  1353. 1235 IF Terminator = SectnEnd THEN
  1354. 1236 RETURN FALSE;
  1355. 1237 END;
  1356. 1238 IF NOT GetFieldData( FieldRec ) THEN
  1357. 1239 RETURN FALSE;
  1358. 1240 END;
  1359. 1241 END;
  1360. 1242 RETURN TRUE;
  1361. 1243 END GetFieldOptions;
  1362. 1244
  1363. 1245
  1364. 1246 PROCEDURE DoFields() : BOOLEAN;
  1365. 1247 (* process the Fields section of the command area *)
  1366. 1248 VAR
  1367. 1249 FieldRec: ScrnTypes.InputFieldRecord;
  1368. 1250 DummyDspFile: ScrnTypes.DisplayFile;
  1369. 1251 selector, GroupCounter, GroupMax: CARDINAL;
  1370. 1252 GroupHeader: BOOLEAN;
  1371. 1253 realDecPlaces : CARDINAL; (* JDM/MBC *)
  1372. 1254 BEGIN
  1373. 1255 IF NOT ListStartOK() THEN
  1374. 1256 RETURN ReportErr( SectnErr);
  1375. 1257 END;
  1376. 1258 GroupMax := 0;
  1377. 1259 REPEAT
  1378. 1260 GroupHeader := FALSE;
  1379. 1261 InitFieldRec( FieldRec);
  1380. 1262 IF NOT GetSelector( selector) THEN
  1381. 1263 IF M2Strings.Length( ErrStrGlobal) = 0 THEN
  1382. 1264 RETURN TRUE;
  1383. 1265 ELSE
  1384. 1266 RETURN FALSE;
  1385. 1267 END;
  1386. 1268 END;
  1387. 1269 (*
  1388. 1270 NextWordCap( CurrentWord, Terminator);
  1389. 1271 (* space between ) and ' *)
  1390. 1272 IF (M2Strings.Length( CurrentWord) > 0) OR (Terminator # "'") THEN
  1391. 1273 RETURN ReportErr( NeedQuote);
  1392. 1274 END;
  1393. 1275 *)
  1394. 1276 NextWordCap( FieldRec.fnam, Terminator);
  1395. 1277 (* get field name *)
  1396. 1278 IF Terminator # "'" THEN
  1397. 1279 RETURN ReportErr( NeedQuote);
  1398. 1280 END;
  1399. 1281 NextWordCap( CurrentWord, Terminator);
  1400. 1282 IF PosUtils.Equal( CurrentWord, 'STRING') THEN
  1401. 1283 FieldRec.typ := ScrnTypes.StringCode;
  1402. 1284 ELSIF PosUtils.Equal(CurrentWord, 'GOTO') THEN
  1403. 1285 FieldRec.typ := ScrnTypes.GotoCode;
  1404. 1286 FieldRec.MenuKey := selector;
  1405. 1287 NextWord( FieldRec.ReturnVal, Terminator );
  1406. 1288 (*Use GetNextWord to preserve case sensitivity.*)
  1407. 1289 ELSIF PosUtils.Equal(CurrentWord, 'INTEGER') THEN
  1408. 1290 IF NOT GetInteger( FieldRec) THEN
  1409. 1291 RETURN FALSE;
  1410. 1292 END;
  1411. 1293 ELSIF PosUtils.Equal(CurrentWord, 'REAL') THEN
  1412. 1294 (* We have to set the tag field before any of the variant
  1413. 1295 fields; Stony Brook is smart enough to check for consistency. *)
  1414. 1296 FieldRec.typ := ScrnTypes.RealCode;
  1415. 1297 IF Terminator = "." THEN
  1416. 1298 (* find and load the number of decimal places for the REAL *)
  1417. 1299 IF NOT NextNum( realDecPlaces ) THEN
  1418. 1300 RETURN ReportErr( NumSepErr );
  1419. 1301 ELSE
  1420. 1302 FieldRec.decimalPlace := VAL( ScrnTypes.DecimalPlaceType,
  1421. 1303 realDecPlaces );
  1422. 1304 END
  1423. 1305 ELSE
  1424. 1306 (* Signal that the default of user-specified dec. place used *)
  1425. 1307 FieldRec.decimalPlace := -1;
  1426. 1308 END;
  1427. 1309 IF NOT GetReal( FieldRec) THEN
  1428. 1310 RETURN FALSE;
  1429. 1311 END;
  1430. 1312 ELSIF PosUtils.Equal(CurrentWord, 'GROUP') THEN
  1431. 1313 GroupHeader := TRUE;
  1432. 1314 GroupCounter := 1;
  1433. 1315 IF (NOT NextNum( GroupMax)) OR
  1434. 1316 (GroupMax = 0) THEN
  1435. 1317 RETURN ReportErr( NumSepErr);
  1436. 1318 END;
  1437. 1319 ELSIF PosUtils.Equal(CurrentWord, 'CHOICE') THEN
  1438. 1320 IF (GroupMax = 0) THEN
  1439. 1321 (* error if didn't start a group first *)
  1440. 1322 RETURN ReportErr( GroupErr);
  1441. 1323 END;
  1442. 1324 FieldRec.typ := ScrnTypes.GroupMember;
  1443. 1325 FieldRec.ChoiceKey := selector;
  1444. 1326 FieldRec.GroupSize := GroupMax;
  1445. 1327 FieldRec.GroupID := GroupCounter;
  1446. 1328 FieldRec.selected := (GroupCounter = 1);
  1447. 1329 (* TRUE for first field *)
  1448. 1330 INC( GroupCounter);
  1449. 1331 IF (GroupMax < GroupCounter) THEN
  1450. 1332 (* at end of group, reset size to show no group is active *)
  1451. 1333 GroupMax := 0;
  1452. 1334 END;
  1453. 1335 ELSIF PosUtils.Equal(CurrentWord, 'EDITOR') THEN
  1454. 1336 IF NOT GetEdField( FieldRec) THEN
  1455. 1337 RETURN FALSE;
  1456. 1338 END;
  1457. 1339 ELSIF PosUtils.Equal(CurrentWord, 'DISPLAY') OR
  1458. 1340 PosUtils.Equal(CurrentWord, 'DISPLAYONLY') THEN
  1459. 1341 FieldRec.typ := ScrnTypes.DispCode;
  1460. 1342
  1461. 1343 ELSIF M2Strings.Length(CurrentWord) = 0 THEN
  1462. 1344 (* do nothing unless at end of list *)
  1463. 1345 IF Terminator = EOF THEN
  1464. 1346 RETURN ReportErr( SectnEndErr);
  1465. 1347 END;
  1466. 1348 ELSE
  1467. 1349 (* This is what allows you to have user-defined type names.*)
  1468. 1350 FieldRec.typ := FieldTypes.TypeCode( CurrentWord );
  1469. 1351 END;
  1470. 1352 IF NOT GroupHeader THEN
  1471. 1353 (* do not process options or save a field record for
  1472. 1354 group headers *)
  1473. 1355 IF NOT GetFieldOptions( FieldRec) THEN
  1474. 1356 RETURN FALSE;
  1475. 1357 END;
  1476. 1358 GenLists.ListInsert( FieldRec, RecType, FieldList, AfterLastElmt);
  1477. 1359 END;
  1478. 1360 UNTIL Terminator = SectnEnd;
  1479. 1361 RETURN TRUE;
  1480. 1362 END DoFields;
  1481. 1363
  1482. 1364 PROCEDURE DoCommandArea( VAR FrameName: ScrnTypes.AFrameName): BOOLEAN;
  1483. 1365 (* Processes the command area of the frame. FrameName is set to
  1484. 1366 the name of the frame processed. The other output is communicated
  1485. 1367 in the global variables that MakeOutList uses. *)
  1486. 1368 VAR
  1487. 1369 dumtype: CARDINAL;
  1488. 1370 BEGIN
  1489. 1371 ReplacingFieldMarks := FALSE;
  1490. 1372 NextWordCap( CurrentWord, Terminator);
  1491. 1373 (* We start by determining whether FrameName is inside or
  1492. 1374 outside the Command Area -- outside is the old syntax. *)
  1493. 1375 IF (Parser.TheLine[0] # BorderChar) OR
  1494. 1376 (M2Strings.Length(CurrentWord) # 0) THEN
  1495. 1377 FrameName[0] := 0C;
  1496. 1378 IF NOT FindCmdBegin( CurrentLine, CurrentIndex) THEN
  1497. 1379 RETURN ReportErr( FrameErr);
  1498. 1380 END;
  1499. 1381 ELSE
  1500. 1382 (* FrameName is outside the command area. *)
  1501. 1383 NextWord( CurrentWord, Terminator );
  1502. 1384 (* The frame name is next and it should be the last thing
  1503. 1385 on the line. We use GetNextWord to preserve case
  1504. 1386 sensitivity.*)
  1505. 1387 IF (Terminator # EOL) OR
  1506. 1388 (M2Strings.Length(CurrentWord) = 0) THEN
  1507. 1389 RETURN ReportErr( FrameNameErr);
  1508. 1390 END;
  1509. 1391 (* save name, which was CAPPED by NextWordCap() *)
  1510. 1392 M2Strings.Assign( CurrentWord, FrameName);
  1511. 1393 IF NOT FindCmdBegin( CurrentLine, CurrentIndex) THEN
  1512. 1394 (* continue only if find a command begin string *)
  1513. 1395 RETURN TRUE;
  1514. 1396 END;
  1515. 1397 END;
  1516. 1398
  1517. 1399 LOOP
  1518. 1400 NextCrunchedWord( CurrentWord, Terminator);
  1519. 1401 IF PosUtils.Equal( CurrentWord, 'PARENTFRAME' ) THEN
  1520. 1402 IF NOT GetAFrameName( ParentFrame) THEN
  1521. 1403 RETURN ReportErr( ParentErr);
  1522. 1404 END;
  1523. 1405 ELSIF PosUtils.Equal( CurrentWord, 'NORMALNEXT' ) THEN
  1524. 1406 IF NOT GetAFrameName( NormalNextFrame) THEN
  1525. 1407 RETURN ReportErr( NormalErr);
  1526. 1408 END;
  1527. 1409 ELSIF PosUtils.Equal( CurrentWord, 'FRAMEABOVE' ) THEN
  1528. 1410 IF NOT GetAFrameName( FrameAbove ) THEN
  1529. 1411 RETURN ReportErr( PlacementErr );
  1530. 1412 END;
  1531. 1413 ELSIF PosUtils.Equal( CurrentWord, 'FRAMEBELOW' ) THEN
  1532. 1414 IF NOT GetAFrameName( FrameBelow ) THEN
  1533. 1415 RETURN ReportErr( PlacementErr );
  1534. 1416 END;
  1535. 1417 ELSIF PosUtils.Equal( CurrentWord, 'FRAMELEFT' ) THEN
  1536. 1418 IF NOT GetAFrameName( FrameLeft ) THEN
  1537. 1419 RETURN ReportErr( PlacementErr );
  1538. 1420 END;
  1539. 1421 ELSIF PosUtils.Equal( CurrentWord, 'FRAMERIGHT' ) THEN
  1540. 1422 IF NOT GetAFrameName( FrameRight ) THEN
  1541. 1423 RETURN ReportErr( PlacementErr );
  1542. 1424 END;
  1543. 1425 ELSIF PosUtils.Equal( CurrentWord, 'FIELDMARK' ) THEN
  1544. 1426 IF NOT GetFieldMark( Terminator) THEN
  1545. 1427 RETURN ReportErr( FMErr);
  1546. 1428 END;
  1547. 1429 ELSIF PosUtils.Equal( CurrentWord, 'WINDOW' ) THEN
  1548. 1430 IF NOT DoWindow() THEN
  1549. 1431 RETURN FALSE;
  1550. 1432 END;
  1551. 1433 ELSIF PosUtils.Equal( CurrentWord, 'DATA' ) THEN
  1552. 1434 IF NOT GetList( DataList) THEN
  1553. 1435 RETURN ReportErr( DataErr);
  1554. 1436 END;
  1555. 1437 ELSIF PosUtils.Equal( CurrentWord, 'HELP' ) THEN
  1556. 1438 IF NOT GetList( HelpList) THEN
  1557. 1439 RETURN ReportErr( HelpErr);
  1558. 1440 END;
  1559. 1441 CheckHelpFrame();
  1560. 1442 ELSIF PosUtils.Equal( CurrentWord, 'COLORS' ) THEN
  1561. 1443 IF NOT DoColors() THEN
  1562. 1444 RETURN FALSE;
  1563. 1445 END;
  1564. 1446 ELSIF PosUtils.Equal( CurrentWord, 'FIELDS' ) THEN
  1565. 1447 IF NOT DoFields() THEN
  1566. 1448 RETURN FALSE;
  1567. 1449 END;
  1568. 1450 ELSIF PosUtils.Present( CommandEndStr, Parser.TheLine) THEN
  1569. 1451 IF FrameName[0] = 0C THEN
  1570. 1452 (*We never found a FrameName.*)
  1571. 1453 StrEdit.AssignStr( FrameNameErr, ErrStrGlobal );
  1572. 1454 RETURN FALSE;
  1573. 1455 END;
  1574. 1456 RETURN TRUE;
  1575. 1457 ELSIF (Parser.TheLine[0] = BorderChar) AND
  1576. 1458 (M2Strings.Length(CurrentWord) = 0) THEN
  1577. 1459 NextWord( CurrentWord, Terminator );
  1578. 1460 (* The frame name is next (and it should be the last thing
  1579. 1461 on the line); don't use NextWordCap because it caps, and
  1580. 1462 we want to be case sensitive with frame names. *)
  1581. 1463 IF (* (Terminator # EOL) OR JM 7/16/91 *)
  1582. 1464 (M2Strings.Length(CurrentWord) = 0) THEN
  1583. 1465 RETURN ReportErr( FrameNameErr);
  1584. 1466 END;
  1585. 1467 M2Strings.Assign( CurrentWord, FrameName);
  1586. 1468 (* Save name*)
  1587. 1469 ELSIF PosUtils.Equal( CurrentWord, 'HITANYKEY') THEN
  1588. 1470 FrameRec.action := "W";
  1589. 1471 ELSIF PosUtils.Equal( CurrentWord, 'DISPLAYONLY') THEN
  1590. 1472 FrameRec.action := "D";
  1591. 1473 ELSIF PosUtils.Equal( CurrentWord, 'INPUTSCREEN') THEN
  1592. 1474 FrameRec.action := "I";
  1593. 1475 ELSIF PosUtils.Equal( CurrentWord, 'REPLACE') THEN
  1594. 1476 ReplacingFieldMarks := TRUE;
  1595. 1477 ELSE
  1596. 1478 RETURN ReportErr( BadCommand);
  1597. 1479 END;
  1598. 1480 END;
  1599. 1481 END DoCommandArea;
  1600. 1482
  1601. 1483 PROCEDURE CheckFieldNumber();
  1602. 1484 (* check if same number of fields on screen as defined *)
  1603. 1485 BEGIN
  1604. 1486 IF FieldCount < GenLists.ListLength( FieldList) THEN
  1605. 1487 StrEdit.AssignStr( MoreErr, ErrStrGlobal);
  1606. 1488 BadLineGlobal := CurrentLine;
  1607. 1489 ELSIF FieldCount > GenLists.ListLength( FieldList) THEN
  1608. 1490 StrEdit.AssignStr( FewErr, ErrStrGlobal);
  1609. 1491 BadLineGlobal := CurrentLine;
  1610. 1492 (* ELSIF LineCount > (WindowHite + 1) THEN
  1611. 1493 AssignStr( 'Warning: screen may exceed window; scrolling may occur',
  1612. 1494 ErrStrGlobal); *)
  1613. 1495 END;
  1614. 1496 END CheckFieldNumber;
  1615. 1497
  1616. 1498 PROCEDURE AddToOutList(VAR line : ARRAY OF CHAR): BOOLEAN;
  1617. 1499
  1618. 1500 PROCEDURE HaveColor(): BOOLEAN;
  1619. 1501 BEGIN
  1620. 1502 (* is true if a color is turned on (we will store blanks) *)
  1621. 1503 RETURN(ColorStack^.prv <> NIL)
  1622. 1504 END HaveColor;
  1623. 1505
  1624. 1506 PROCEDURE AddColor( incode: CHAR; forcod, backcod: MsColors.AColor;
  1625. 1507 atrbcod: MsColors.AMonoAttribute);
  1626. 1508 BEGIN
  1627. 1509 VStorage.DosAlloc( ColorStack^.nxt, SYSTEM.TSIZE(CStack) );
  1628. 1510 ColorStack^.nxt^.prv := ColorStack;
  1629. 1511 ColorStack := ColorStack^.nxt;
  1630. 1512 ColorStack^.Ccode := incode;
  1631. 1513 ColorStack^.forec := forcod;
  1632. 1514 ColorStack^.backc := backcod;
  1633. 1515 ColorStack^.atrbc := atrbcod;
  1634. 1516 ColorStack^.nxt := NIL;
  1635. 1517 END AddColor;
  1636. 1518
  1637. 1519 PROCEDURE DeleteColor(): BOOLEAN;
  1638. 1520 BEGIN
  1639. 1521 IF ColorStack^.prv = NIL THEN
  1640. 1522 RETURN ReportErr( NestErr);
  1641. 1523 ELSE
  1642. 1524 ColorStack := ColorStack^.prv;
  1643. 1525 VStorage.DosDealloc( ColorStack^.nxt, SYSTEM.TSIZE(CStack) );
  1644. 1526 (* Note that this will never deallocate the
  1645. 1527 ColorBase, which is good since ColorBase is now
  1646. 1528 in the data segment. *)
  1647. 1529 ColorStack^.nxt := NIL;
  1648. 1530 RETURN TRUE;
  1649. 1531 END;
  1650. 1532 END DeleteColor;
  1651. 1533
  1652. 1534 VAR
  1653. 1535 InAField, firstcol, ColorChange : BOOLEAN;
  1654. 1536 LineLngth, indentation, i, WhichColor, BlanksInARow : CARDINAL;
  1655. 1537 ImageRec: ScrnTypes.ImageElement;
  1656. 1538
  1657. 1539 PROCEDURE AddRecord( VAR ImageRec: ScrnTypes.ImageElement);
  1658. 1540 VAR
  1659. 1541 FieldRec: ScrnTypes.InputFieldRecord;
  1660. 1542 TmpCol2, type: CARDINAL;
  1661. 1543 BEGIN
  1662. 1544 TmpCol2 := ImageRec.col + M2Strings.Length(
  1663. 1545 ImageRec.text) - 1;
  1664. 1546 IF (ImageRec.field > 0) THEN
  1665. 1547 (* save image list position in ImageNum field in field record *)
  1666. 1548 IF FieldCount > GenLists.ListLength( FieldList ) THEN
  1667. 1549 IF NOT ReportErr( FewErr ) THEN
  1668. 1550 END;
  1669. 1551 RETURN;
  1670. 1552 END;
  1671. 1553 GenLists.GetElmt( FieldList, FieldCount, FieldRec, type);
  1672. 1554 FieldRec.ImageNum := GenLists.ListLength( ImageList) + 1;
  1673. 1555 IF FieldRec.typ = ScrnTypes.EditorCode THEN
  1674. 1556 (* This editor field's width & height must be stored *)
  1675. 1557 INC( FieldRec.Row2, ImageRec.row - 1);
  1676. 1558 IF FieldRec.Row2 > FrameRec.VirtualHeight THEN
  1677. 1559 FrameRec.VirtualHeight := FieldRec.Row2;
  1678. 1560 END;
  1679. 1561 IF ReplacingFieldMarks THEN
  1680. 1562 FieldRec.Col2 := TmpCol2 + 1;
  1681. 1563 ELSE
  1682. 1564 FieldRec.Col2 := TmpCol2;
  1683. 1565 END;
  1684. 1566 IF FieldRec.Col2 > FrameRec.VirtualWidth THEN
  1685. 1567 FrameRec.VirtualWidth := FieldRec.Col2;
  1686. 1568 END;
  1687. 1569 END;
  1688. 1570 GenLists.ListReplace( FieldRec, type, FieldList, FieldCount);
  1689. 1571 END;
  1690. 1572 IF ImageRec.row > FrameRec.VirtualHeight THEN
  1691. 1573 FrameRec.VirtualHeight := ImageRec.row;
  1692. 1574 END;
  1693. 1575 IF TmpCol2 > FrameRec.VirtualWidth THEN
  1694. 1576 FrameRec.VirtualWidth := TmpCol2;
  1695. 1577 END;
  1696. 1578 ScrnUtl1.EncodeImageRec( ImageRec);
  1697. 1579 GenLists.ListInsert( ImageRec, GenLists.StrCode,
  1698. 1580 ImageList, AfterLastElmt);
  1699. 1581 END AddRecord;
  1700. 1582
  1701. 1583 PROCEDURE NewLineCheck();
  1702. 1584 VAR
  1703. 1585 BufChar : CHAR;
  1704. 1586 FieldRec: ScrnTypes.InputFieldRecord;
  1705. 1587 BEGIN
  1706. 1588 BufChar := line[indentation - 1];
  1707. 1589 WhichColor := PosUtils.Pos( BufChar, ColorKeys);
  1708. 1590 IF (BufChar = FieldMark) OR
  1709. 1591 (WhichColor <= HIGH(ColorKeys)) OR
  1710. 1592 ((BufChar = blank) AND (NOT ColorChange)) THEN
  1711. 1593 RETURN;
  1712. 1594 END;
  1713. 1595 IF firstcol THEN
  1714. 1596 (* in first column of new line *)
  1715. 1597 InitImageRec( ImageRec );
  1716. 1598 firstcol := FALSE;
  1717. 1599 ELSIF ((BlanksInARow>=3) AND (NOT HaveColor())) OR
  1718. 1600 ColorChange THEN
  1719. 1601 IF BlanksInARow >= 3 THEN
  1720. 1602 (* cut blanks from the end of the string *)
  1721. 1603 StrEdit.CutTrailingChars( blank, ImageRec.text);
  1722. 1604 END;
  1723. 1605 AddRecord( ImageRec);
  1724. 1606 InitImageRec( ImageRec );
  1725. 1607 ELSE
  1726. 1608 RETURN;
  1727. 1609 END;
  1728. 1610 WITH ImageRec DO
  1729. 1611 row := LineCount;
  1730. 1612 col := indentation;
  1731. 1613 foreg := ColorStack^.forec;
  1732. 1614 backg := ColorStack^.backc;
  1733. 1615 atrb := ColorStack^.atrbc;
  1734. 1616 IF InAField THEN
  1735. 1617 field := FieldCount;
  1736. 1618 ELSE
  1737. 1619 field := 0;
  1738. 1620 END;
  1739. 1621 END;
  1740. 1622 ColorChange := FALSE;
  1741. 1623 END NewLineCheck;
  1742. 1624
  1743. 1625 BEGIN
  1744. 1626 (*AddToOutList*)
  1745. 1627 IF PosUtils.IsBlank(line) THEN
  1746. 1628 RETURN TRUE;
  1747. 1629 END;
  1748. 1630 InAField := FALSE;
  1749. 1631 firstcol := TRUE;
  1750. 1632 ColorChange := FALSE;
  1751. 1633 BlanksInARow := 0;
  1752. 1634 indentation := 1;
  1753. 1635 LineLngth := M2Strings.Length( line);
  1754. 1636 InitImageRec( ImageRec );
  1755. 1637 WHILE indentation <= LineLngth DO
  1756. 1638 NewLineCheck();
  1757. 1639 IF line[indentation - 1]=FieldMark THEN
  1758. 1640 IF ColorStack^.Ccode = FieldMark THEN
  1759. 1641 (* if this mark is at end of a field *)
  1760. 1642 InAField := FALSE;
  1761. 1643 IF NOT DeleteColor() THEN
  1762. 1644 RETURN FALSE;
  1763. 1645 END;
  1764. 1646 ELSE
  1765. 1647 (* we are at the beginning of a field *)
  1766. 1648 AddColor( FieldMark, ColorStack^.forec,
  1767. 1649 ColorStack^.backc, ColorStack^.atrbc);
  1768. 1650 (* Use existing color for menu item *)
  1769. 1651 InAField := TRUE;
  1770. 1652 INC( FieldCount);
  1771. 1653 END;
  1772. 1654 IF ReplacingFieldMarks THEN
  1773. 1655 line[ indentation - 1] := blank;
  1774. 1656 IF InAField AND (line[indentation] # blank) THEN
  1775. 1657 (*We do the following to prevent the color change associated
  1776. 1658 with the field from beginning until _after_ the replaced
  1777. 1659 space.*)
  1778. 1660 INC( indentation );
  1779. 1661 INC(BlanksInARow);
  1780. 1662 IF ((BlanksInARow<3) AND (NOT firstcol)) OR HaveColor() THEN
  1781. 1663 StrEdit.Append(ImageRec.text, blank);
  1782. 1664 END;
  1783. 1665 END;
  1784. 1666 ELSE
  1785. 1667 M2Strings.Delete(line, indentation - 1, 1);
  1786. 1668 DEC( LineLngth );
  1787. 1669 END;
  1788. 1670 BlanksInARow := 0;
  1789. 1671 ColorChange := TRUE;
  1790. 1672 ELSIF WhichColor <= HIGH(ColorKeys) THEN
  1791. 1673 IF ColorStack^.Ccode = ColorKeys[ WhichColor] THEN
  1792. 1674 IF NOT DeleteColor() THEN
  1793. 1675 RETURN FALSE;
  1794. 1676 END;
  1795. 1677 ELSE
  1796. 1678 AddColor( ColorKeys[WhichColor], KeyFors[WhichColor],
  1797. 1679 KeyBacks[WhichColor], KeyAtrbs[WhichColor]);
  1798. 1680 END;
  1799. 1681 M2Strings.Delete(line, indentation - 1, 1);
  1800. 1682 DEC( LineLngth );
  1801. 1683 BlanksInARow := 0;
  1802. 1684 ColorChange := TRUE;
  1803. 1685 ELSIF line[indentation - 1]=blank THEN
  1804. 1686 INC(indentation);
  1805. 1687 INC(BlanksInARow);
  1806. 1688 IF ((BlanksInARow<3) AND (NOT firstcol)) OR HaveColor() THEN
  1807. 1689 StrEdit.Append(ImageRec.text, blank);
  1808. 1690 END;
  1809. 1691 ELSE
  1810. 1692 StrEdit.Append(ImageRec.text, line[indentation - 1]);
  1811. 1693 INC(indentation);
  1812. 1694 BlanksInARow := 0;
  1813. 1695 END;
  1814. 1696 END;
  1815. 1697 IF InAField THEN
  1816. 1698 RETURN ReportErr( FMErr );
  1817. 1699 END;
  1818. 1700 AddRecord( ImageRec);
  1819. 1701 RETURN TRUE;
  1820. 1702 END AddToOutList;
  1821. 1703
  1822. 1704 PROCEDURE DoDisplayArea();
  1823. 1705 VAR
  1824. 1706 TypeCode: CARDINAL;
  1825. 1707 BEGIN
  1826. 1708 LineCount := 0;
  1827. 1709 FieldCount := 0;
  1828. 1710 WHILE (CurrentLine < GenLists.ListLength( InListGlobal)) DO
  1829. 1711 INC( CurrentLine);
  1830. 1712 GenLists.GetElmt( InListGlobal, CurrentLine, Parser.TheLine, TypeCode);
  1831. 1713 (*read next line*)
  1832. 1714 StrEdit.ReplaceTabs( Parser.TheLine, 8 );
  1833. 1715 StrEdit.DeleteChar( FormFeed, Parser.TheLine );
  1834. 1716 IF PosUtils.Present(Parser.StartComment, Parser.TheLine) THEN
  1835. 1717 WHILE (NOT PosUtils.Present(Parser.EndComment, Parser.TheLine)) AND
  1836. 1718 (CurrentLine < GenLists.ListLength( InListGlobal)) DO
  1837. 1719 INC( CurrentLine);
  1838. 1720 GenLists.GetElmt( InListGlobal, CurrentLine,
  1839. 1721 Parser.TheLine, TypeCode);
  1840. 1722 (*read next line*)
  1841. 1723 StrEdit.ReplaceTabs( Parser.TheLine, 8 );
  1842. 1724 (*lets you put comments in a frame file*)
  1843. 1725 END;
  1844. 1726 ELSE
  1845. 1727 INC( LineCount);
  1846. 1728 IF NOT AddToOutList( Parser.TheLine) THEN
  1847. 1729 RETURN;
  1848. 1730 END;
  1849. 1731 END;
  1850. 1732 END;
  1851. 1733 CheckFieldNumber();
  1852. 1734 END DoDisplayArea;
  1853. 1735
  1854. 1736
  1855. 1737 PROCEDURE InsertFrameLinks( VAR LinkedFrames: GenLists.GenList);
  1856. 1738 BEGIN
  1857. 1739 IF (FrameAbove[0] # 0C)
  1858. 1740 OR (FrameBelow[0] # 0C)
  1859. 1741 OR (FrameRight[0] # 0C)
  1860. 1742 OR (FrameLeft[0] # 0C) THEN
  1861. 1743 GenLists.NewList( LinkedFrames );
  1862. 1744 GenLists.ListInsert( FrameAbove, GenLists.StrCode, LinkedFrames,
  1863. 1745 AfterLastElmt);
  1864. 1746 GenLists.ListInsert( FrameBelow, GenLists.StrCode, LinkedFrames,
  1865. 1747 AfterLastElmt);
  1866. 1748 GenLists.ListInsert( FrameLeft, GenLists.StrCode, LinkedFrames,
  1867. 1749 AfterLastElmt);
  1868. 1750 GenLists.ListInsert( FrameRight, GenLists.StrCode, LinkedFrames,
  1869. 1751 AfterLastElmt);
  1870. 1752 END;
  1871. 1753 END InsertFrameLinks;
  1872. 1754
  1873. 1755
  1874. 1756 PROCEDURE MakeOutList( VAR OutList: GenLists.GenList);
  1875. 1757 BEGIN
  1876. 1758 SetToDefaultColors( FrameRec );
  1877. 1759 GenLists.NewList( OutList);
  1878. 1760 GenLists.ListInsert( HelpFrame, GenLists.StrCode, OutList,
  1879. 1761 AfterLastElmt);
  1880. 1762 GenLists.ListInsert( ParentFrame, GenLists.StrCode,
  1881. 1763 OutList, AfterLastElmt);
  1882. 1764 GenLists.ListInsert( NormalNextFrame, GenLists.StrCode,
  1883. 1765 OutList, AfterLastElmt);
  1884. 1766 GenLists.ListInsert( FrameRec, RecType, OutList,
  1885. 1767 AfterLastElmt);
  1886. 1768 GenLists.ListInsert( DataList, GenLists.ListCode, OutList,
  1887. 1769 AfterLastElmt);
  1888. 1770 GenLists.ListInsert( PromptList, GenLists.ListCode,
  1889. 1771 OutList, AfterLastElmt);
  1890. 1772 GenLists.ListInsert( HelpList, GenLists.ListCode, OutList,
  1891. 1773 AfterLastElmt);
  1892. 1774 GenLists.ListInsert( EdList, GenLists.ListCode, OutList,
  1893. 1775 AfterLastElmt);
  1894. 1776 GenLists.ListInsert( FieldList, GenLists.ListCode, OutList,
  1895. 1777 AfterLastElmt);
  1896. 1778 GenLists.ListInsert( ImageList, GenLists.ListCode, OutList,
  1897. 1779 AfterLastElmt);
  1898. 1780
  1899. 1781 InsertFrameLinks( LinkedFrames );
  1900. 1782 GenLists.ListInsert( LinkedFrames, GenLists.ListCode, OutList,
  1901. 1783 AfterLastElmt);
  1902. 1784 END MakeOutList;
  1903. 1785
  1904. 1786
  1905. 1787 PROCEDURE CompileFrame( VAR InList, OutList: GenLists.GenList; VAR
  1906. 1788 FrameName: ScrnTypes.AFrameName; VAR ErrStr: ARRAY OF CHAR; VAR
  1907. 1789 BadLine: CARDINAL);
  1908. 1790 (* compiles a single frame *)
  1909. 1791 VAR
  1910. 1792 DataSize, TotalElems, TotalSize: LONGINT;
  1911. 1793 TotalSublists: CARDINAL;
  1912. 1794 BEGIN
  1913. 1795 DataSize := GenLists.ListSize( InList, TotalElems,
  1914. 1796 TotalSublists, TotalSize );
  1915. 1797 (*Check memory here because it's too hard to get out if we
  1916. 1798 run out below. Figure we need about as much as the
  1917. 1799 InList occupies.*)
  1918. 1800 IF (TotalSize > NumTypes.L65535) OR
  1919. 1801 (NOT VStorage.IsAvailable(Numbers.C(TotalSize))) THEN
  1920. 1802 ErrorManager.WARN( InsuffMem );
  1921. 1803 RETURN;
  1922. 1804 END;
  1923. 1805 InitOutLists();
  1924. 1806 (* initialize the output genlists *)
  1925. 1807 StrEdit.SetLength( ErrStrGlobal, 0);
  1926. 1808 (* init the error string & line # *)
  1927. 1809 BadLineGlobal := 0;
  1928. 1810 InListGlobal := InList;
  1929. 1811 StrEdit.SetLength( Parser.TheLine, 0);
  1930. 1812 (* init the global line and index *)
  1931. 1813 CurrentLine := 0;
  1932. 1814 CurrentIndex := 1;
  1933. 1815 IF GenLists.ListLength( InList) > 0 THEN
  1934. 1816 IF DoCommandArea( FrameName) THEN
  1935. 1817 DoDisplayArea();
  1936. 1818 END;
  1937. 1819 END;
  1938. 1820 MakeOutList( OutList);
  1939. 1821 StrEdit.AssignStr( ErrStrGlobal, ErrStr);
  1940. 1822 BadLine := BadLineGlobal;
  1941. 1823 END CompileFrame;
  1942. 1824
  1943. 1825
  1944. 1826 PROCEDURE InitColors();
  1945. 1827 BEGIN
  1946. 1828 StrEdit.SetLength( ColorKeys, 4 );
  1947. 1829 ColorKeys[0] := 367C; (* Flash *)
  1948. 1830 ColorKeys[1] := 27C; (* UnderScored *)
  1949. 1831 ColorKeys[2] := 341C; (* Bold *)
  1950. 1832 ColorKeys[3] := 352C; (* Reversed *)
  1951. 1833 KeyFors[0] := MsColors.lightgrey;
  1952. 1834 KeyFors[1] := MsColors.blue;
  1953. 1835 KeyFors[2] := MsColors.brightwhite;
  1954. 1836 KeyFors[3] := MsColors.black;
  1955. 1837 KeyBacks[0] := MsColors.darkgrey;
  1956. 1838 KeyBacks[1] := MsColors.black;
  1957. 1839 KeyBacks[2] := MsColors.black;
  1958. 1840 KeyBacks[3] := MsColors.lightgrey;
  1959. 1841 KeyAtrbs[0] := MsColors.blinking;
  1960. 1842 KeyAtrbs[1] := MsColors.underscored;
  1961. 1843 KeyAtrbs[2] := MsColors.bold;
  1962. 1844 KeyAtrbs[3] := MsColors.ReverseVideo;
  1963. 1845 END InitColors;
  1964. 1846
  1965. 1847
  1966. 1848
  1967. 1849 PROCEDURE Init();
  1968. 1850 BEGIN
  1969. 1851 IF Initialized THEN
  1970. 1852 RETURN;
  1971. 1853 ELSE
  1972. 1854 Initialized := TRUE;
  1973. 1855 END;
  1974. 1856
  1975. 1857 (*EntryDiag:
  1976. 1858 Diagnostics.Init();
  1977. 1859 :EntryDiag*)
  1978. 1860
  1979. 1861 ByteFiddler.Init();
  1980. 1862 ErrorManager.Init();
  1981. 1863 FieldTypes.Init();
  1982. 1864 GenLists.Init();
  1983. 1865 LowLevel.Init();
  1984. 1866 M2Strings.Init();
  1985. 1867 MsColors.Init();
  1986. 1868 NdxTypes.Init();
  1987. 1869 Numbers.Init();
  1988. 1870 NumTypes.Init();
  1989. 1871 Parser.Init();
  1990. 1872 PosUtils.Init();
  1991. 1873 ScrnTypes.Init();
  1992. 1874 ScrnUtl1.Init();
  1993. 1875 StrConv.Init();
  1994. 1876 StrCnv1.Init();
  1995. 1877 StrEdit.Init();
  1996. 1878 VStorage.Init();
  1997. 1879 VWindows.Init();
  1998. 1880 (*EntryDiag:
  1999. 1881 Diagnostics.diagS( 'Entering MakeFrame', '' );
  2000. 1882 :EntryDiag*)
  2001. 1883
  2002. 1884 (* First we initialize all the normal screen colors. Just
  2003. 1885 change these assignments if your taste in colors differs
  2004. 1886 from ours. *)
  2005. 1887 DefaultFore := MsColors.lightgrey;
  2006. 1888 DefaultBack := MsColors.blue;
  2007. 1889 DefaultAtrb := MsColors.plain;
  2008. 1890 DefaultBordatrb := MsColors.plain;
  2009. 1891 DefaultBordfor := MsColors.lightcyan;
  2010. 1892 DefaultBordbak := MsColors.blue;
  2011. 1893 (* Border colors *)
  2012. 1894 DefaultSelatrb := MsColors.bold;
  2013. 1895 DefaultSelfor := MsColors.lightmagenta;
  2014. 1896 DefaultSelbak := MsColors.blue;
  2015. 1897 (* Selected text *)
  2016. 1898 DefaultPbatrb := MsColors.ReverseVideo;
  2017. 1899 DefaultPbfor := MsColors.black;
  2018. 1900 DefaultPbbak := MsColors.red;
  2019. 1901 (* Pointer Bar Colors *)
  2020. 1902 DefaultMsgatrb := MsColors.plain;
  2021. 1903 DefaultMsgfor := MsColors.black;
  2022. 1904 DefaultMsgbak := MsColors.lightgrey;
  2023. 1905 (* Message Box Colors *)
  2024. 1906 DefaultPromatrb := MsColors.ReverseVideo;
  2025. 1907 DefaultPromfor := MsColors.black;
  2026. 1908 DefaultPrombak := MsColors.cyan;
  2027. 1909 (* Prompt Line Colors *)
  2028. 1910
  2029. 1911 ColorStack := SYSTEM.ADR(ColorBase);
  2030. 1912 (* ColorBase is a record of the type to which ColorStack is
  2031. 1913 supposed to point. *)
  2032. 1914 ColorStack^.Ccode := blank;
  2033. 1915 ColorStack^.forec := DefaultFore;
  2034. 1916 ColorStack^.backc := DefaultBack;
  2035. 1917 ColorStack^.atrbc := DefaultAtrb;
  2036. 1918 ColorStack^.nxt := NIL;
  2037. 1919 ColorStack^.prv := NIL;
  2038. 1920 InitColors();
  2039. 1921 FieldMark := '#';
  2040. 1922 ReplacingFieldMarks := FALSE;
  2041. 1923 StrEdit.AssignStr( '====================', CommandBeginStr);
  2042. 1924 StrEdit.AssignStr( '--------------------', CommandEndStr);
  2043. 1925
  2044. 1926 (*EntryDiag:
  2045. 1927 Diagnostics.diagS( 'Exiting MakeFrame', '' );
  2046. 1928 :EntryDiag*)
  2047. 1929 END Init;
  2048. 1930
  2049. 1931
  2050. 1932 BEGIN
  2051. 1933 Initialized := FALSE;
  2052. 1934 Init();
  2053. 1935 END MakeFrame.
  2054. 117 errors