BUILDLST.MOD 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. IMPLEMENTATION MODULE BuildLst;
  2. (*
  3. * REPERTOIRE
  4. * Release 1.6
  5. * By Charles Bradford and Cole Brecheen
  6. * (c) Copyright 1985-1992 PMI
  7. * Green Bay, Wisconsin
  8. * All rights reserved
  9. * (414) 468-6040
  10. *
  11. * $Header: D:/logfiles/mods/buildlst.mov 1.5 10 Mar 1991 15:25:16 coleb $
  12. *
  13. *)
  14. IMPORT AltKeys;
  15. IMPORT ErrorManager;
  16. IMPORT GenLists;
  17. IMPORT KbdInput;
  18. IMPORT M2Strings;
  19. IMPORT NdxBones;
  20. IMPORT NdxFiles;
  21. IMPORT NdxTypes;
  22. IMPORT PosUtils;
  23. IMPORT ScreenInput;
  24. IMPORT ScrnTypes;
  25. IMPORT ScrnUtl1;
  26. IMPORT StrEdit;
  27. IMPORT StrLogic;
  28. IMPORT VWindows;
  29. IMPORT WindowPrims;
  30. VAR
  31. Initialized : BOOLEAN;
  32. PROCEDURE Init();
  33. BEGIN
  34. IF Initialized THEN
  35. RETURN;
  36. ELSE
  37. Initialized := TRUE;
  38. END;
  39. AltKeys.Init();
  40. ErrorManager.Init();
  41. GenLists.Init();
  42. KbdInput.Init();
  43. M2Strings.Init();
  44. NdxBones.Init();
  45. NdxFiles.Init();
  46. NdxTypes.Init();
  47. PosUtils.Init();
  48. ScreenInput.Init();
  49. ScrnTypes.Init();
  50. ScrnUtl1.Init();
  51. StrEdit.Init();
  52. StrLogic.Init();
  53. VWindows.Init();
  54. WindowPrims.Init();
  55. END Init;
  56. PROCEDURE DeleteListRec( VAR TheList: GenLists.GenList);
  57. VAR
  58. dumc, BadOne: CARDINAL;
  59. BEGIN
  60. BadOne := GenLists.ScanList( ListStorageRec,
  61. TheList, 1, 65535, dumc);
  62. IF BadOne # 0 THEN
  63. GenLists.ListDelete( TheList, BadOne, 1);
  64. END;
  65. END DeleteListRec;
  66. PROCEDURE BuildList( NdxFile: NdxTypes.NdxFileType; TheFrame:
  67. ScrnTypes.DisplayFrame; FirstRuleField, LastRuleField: CARDINAL;
  68. LimitingListName: ARRAY OF CHAR; VAR ErrorField: CARDINAL; VAR
  69. OutList: GenLists.GenList);
  70. VAR
  71. LimitingList, TmpList, Criteria: GenLists.GenList;
  72. KeyHit, cnt: CARDINAL;
  73. dumbool: BOOLEAN;
  74. TmpFieldRec: ScrnTypes.InputFieldRecord;
  75. TmpExpression: ARRAY [0..79] OF CHAR;
  76. BEGIN
  77. (*BuildLists*)
  78. ErrorField := 0;
  79. FOR cnt := FirstRuleField TO LastRuleField DO
  80. (*First we make sure each non-empty field contains a
  81. valid search expression.*)
  82. ScrnUtl1.GetFieldText( TheFrame, cnt, TmpExpression);
  83. IF NOT PosUtils.IsBlank( TmpExpression ) THEN
  84. IF StrLogic.ExpressionTest( (*dummy string*) '',
  85. TmpExpression ) = 0 THEN
  86. (*do nothing*)
  87. END;
  88. IF StrLogic.StrLogicErrorLevel # 0 THEN
  89. (*something's wrong with this expression*)
  90. ErrorField := cnt;
  91. END;
  92. END;
  93. END;
  94. IF ErrorField # 0 THEN
  95. RETURN;
  96. END;
  97. IF M2Strings.Length(LimitingListName) > 0 THEN
  98. IF NOT GetRecNameList( NdxFile, LimitingListName,
  99. LimitingList) THEN
  100. WindowPrims.MsgBox( VWindows.SE,
  101. "List not stored. Press any key.",
  102. KbdInput.AnyKeyNum, KeyHit );
  103. GenLists.NewList( LimitingList );
  104. END;
  105. ELSE
  106. GenLists.NewList( LimitingList );
  107. END;
  108. GenLists.NewList( Criteria );
  109. FOR cnt := FirstRuleField TO LastRuleField DO
  110. ScrnUtl1.GetFieldText( TheFrame, cnt, TmpExpression);
  111. IF NOT PosUtils.IsBlank( TmpExpression ) THEN
  112. ScrnUtl1.GetFieldRec( TheFrame, cnt, TmpFieldRec );
  113. AltKeys.AddCriteria( Criteria, AltKeys.or, AltKeys.StrSelector,
  114. TmpExpression, TmpFieldRec.fnam );
  115. (*Means the field names in this screen have to be the
  116. same as the field names we plan to search.*)
  117. END;
  118. END;
  119. IF AltKeys.LoadAltList( NdxFile, LimitingList, 'KEY', Criteria ) THEN
  120. IF NOT AltKeys.GetAltList( NdxFile, 'KEY', TmpList ) THEN
  121. ErrorManager.WARN('Critical error in building list.');
  122. END;
  123. GenLists.CopyList( TmpList, OutList );
  124. AltKeys.DisposeAltList( NdxFile, 'KEY' );
  125. ELSE
  126. GenLists.NewList( OutList );
  127. END;
  128. GenLists.DisposeList( Criteria );
  129. END BuildList;
  130. PROCEDURE TypeCheck( TheList: GenLists.GenList; TheElmt: CARDINAL ):
  131. CARDINAL;
  132. (*This routine is described in section 6.9 of the manual.*)
  133. VAR
  134. TypeCode, DummySize: CARDINAL;
  135. DummyAddr: POINTER TO CARDINAL;
  136. BEGIN
  137. GenLists.GetElmtAdr( TheList, TheElmt, DummyAddr, DummySize,
  138. TypeCode );
  139. RETURN TypeCode;
  140. END TypeCheck;
  141. VAR
  142. LastSpot: CARDINAL;
  143. PROCEDURE GetNamedList( MainList: GenLists.GenList; ListName: ARRAY OF
  144. CHAR; VAR TheList: GenLists.GenList ): BOOLEAN;
  145. VAR
  146. TypeCode, lngth, cnt: CARDINAL;
  147. TmpStr: ARRAY [0..79] OF CHAR;
  148. NameList: GenLists.GenList;
  149. BEGIN
  150. IF GenLists.ListLength( MainList ) < 2 THEN
  151. RETURN FALSE;
  152. END;
  153. IF TypeCheck( MainList, 1 ) # GenLists.ListCode THEN
  154. RETURN FALSE;
  155. END;
  156. GenLists.GetChildList( MainList, 1, NameList );
  157. lngth := GenLists.ListLength( NameList );
  158. IF lngth # (GenLists.ListLength(MainList) -1) THEN
  159. (*Corrupted list.*)
  160. HALT();
  161. END;
  162. StrEdit.CrunchBlanks( ListName );
  163. FOR cnt := 1 TO lngth DO
  164. GenLists.GetElmt( NameList, cnt, TmpStr, TypeCode );
  165. StrEdit.CrunchBlanks( TmpStr );
  166. IF PosUtils.Equal(TmpStr, ListName) THEN
  167. LastSpot := cnt;
  168. GenLists.GetElmt( MainList, cnt + 1, TheList, TypeCode );
  169. RETURN TRUE;
  170. END;
  171. END;
  172. RETURN FALSE;
  173. END GetNamedList;
  174. PROCEDURE AddNamedList( MainList: GenLists.GenList; ListName: ARRAY OF
  175. CHAR; VAR TheList: GenLists.GenList );
  176. VAR
  177. NameList: GenLists.GenList;
  178. BEGIN
  179. IF GenLists.ListLength( MainList ) = 0 THEN
  180. GenLists.NewList( NameList );
  181. GenLists.ListInsert( NameList, GenLists.ListCode, MainList, 1 );
  182. END;
  183. StrEdit.CrunchBlanks( ListName );
  184. GenLists.GetChildList( MainList, 1, NameList );
  185. GenLists.ListInsert( ListName, GenLists.StrCode, NameList, GenLists.ListLength(NameList) + 1 );
  186. GenLists.ListInsert( TheList, GenLists.ListCode, MainList, GenLists.ListLength(MainList) + 1 );
  187. LastSpot := GenLists.ListLength(NameList) + 1;
  188. END AddNamedList;
  189. PROCEDURE DelNamedList( MainList: GenLists.GenList; ListName: ARRAY OF
  190. CHAR ): BOOLEAN;
  191. VAR
  192. NameList: GenLists.GenList;
  193. BEGIN
  194. StrEdit.CrunchBlanks( ListName );
  195. IF NOT GetNamedList( MainList, ListName, NameList ) THEN
  196. RETURN FALSE;
  197. END;
  198. GenLists.ListDelete( MainList, LastSpot + 1, 1 );
  199. GenLists.GetChildList( MainList, 1, NameList );
  200. GenLists.ListDelete( NameList, LastSpot, 1 );
  201. RETURN TRUE;
  202. END DelNamedList;
  203. PROCEDURE GetRecNameList( NdxFile: NdxTypes.NdxFileType; ListName: ARRAY
  204. OF CHAR; VAR TheList: GenLists.GenList ): BOOLEAN;
  205. VAR
  206. TypeCode: CARDINAL;
  207. TopList, TmpList, TmpList2: GenLists.GenList;
  208. BEGIN
  209. IF NOT NdxFiles.GetField( NdxFile, ListStorageRec, 'RECORD',
  210. TypeCode, TopList ) THEN
  211. RETURN FALSE;
  212. END;
  213. IF TypeCode # GenLists.ListCode THEN
  214. (*Something's wrong with this file.*)
  215. HALT();
  216. END;
  217. IF TypeCheck( TopList, 2 ) = GenLists.ListCode THEN
  218. GenLists.GetElmt( TopList, 2, TmpList, TypeCode );
  219. ELSE
  220. RETURN FALSE;
  221. END;
  222. IF NOT GetNamedList( TmpList, ListName, TmpList2 ) THEN
  223. RETURN FALSE;
  224. ELSE
  225. GenLists.CopyList( TmpList2, TheList );
  226. RETURN TRUE;
  227. END;
  228. END GetRecNameList;
  229. PROCEDURE StoreRecNameList( NdxFile: NdxTypes.NdxFileType; ListName: ARRAY
  230. OF CHAR; TheList: GenLists.GenList ): BOOLEAN;
  231. VAR
  232. TypeCode: CARDINAL;
  233. TopList, OldList: GenLists.GenList;
  234. (*A list of lists; structured just like the AltKey list
  235. in an NdxFileType record.*)
  236. BEGIN
  237. IF NOT NdxFiles.GetField( NdxFile, ListStorageRec, 'RECORD',
  238. TypeCode, TopList ) THEN
  239. IF GenLists.ListLength( NdxFile^.ListBuf ) = 0 THEN
  240. (*File has just been opened; ListBuf needs to be
  241. initialized. We'll do it by calling PutField.*)
  242. GenLists.NewList( TopList );
  243. IF NdxFiles.PutField( NdxFile, ListStorageRec,
  244. 'RECORD', GenLists.ListCode, TopList ) THEN
  245. (*This shouldn't happen; we're supposed to return
  246. false here.*)
  247. HALT();
  248. END;
  249. END;
  250. GenLists.CopyList( NdxFile^.ListBuf, TopList );
  251. END;
  252. IF TypeCheck( TopList, 2 ) = GenLists.ListCode THEN
  253. GenLists.GetElmt( TopList, 2, OldList, TypeCode );
  254. ELSE
  255. GenLists.NewList( OldList );
  256. END;
  257. IF DelNamedList( OldList, ListName ) THEN
  258. (*Do nothing; we do this just to make sure we don't have
  259. two lists with the same name.*)
  260. END;
  261. AddNamedList( OldList, ListName, TheList );
  262. GenLists.ListReplace( OldList, GenLists.ListCode, TopList, 2 );
  263. IF NOT NdxFiles.PutField( NdxFile, ListStorageRec,
  264. 'RECORD', GenLists.ListCode, TopList ) THEN
  265. RETURN FALSE;
  266. END;
  267. IF NOT NdxFiles.WriteRecord( NdxFile, ListStorageRec ) THEN
  268. RETURN FALSE;
  269. END;
  270. RETURN TRUE;
  271. END StoreRecNameList;
  272. PROCEDURE DelRecNameList( NdxFile: NdxTypes.NdxFileType; ListName: ARRAY
  273. OF CHAR ): BOOLEAN;
  274. VAR
  275. TmpList, TopList: GenLists.GenList;
  276. TypeCode: CARDINAL;
  277. BEGIN
  278. IF PosUtils.IsBlank( ListName) THEN
  279. RETURN FALSE;
  280. END;
  281. IF NOT NdxFiles.GetField( NdxFile, ListStorageRec, 'RECORD',
  282. TypeCode, TopList ) THEN
  283. RETURN FALSE;
  284. END;
  285. IF TypeCode # GenLists.ListCode THEN
  286. RETURN FALSE;
  287. END;
  288. IF TypeCheck( TopList, 2 ) = GenLists.ListCode THEN
  289. GenLists.GetElmt( TopList, 2, TmpList, TypeCode );
  290. ELSE
  291. RETURN FALSE;
  292. END;
  293. IF NOT DelNamedList( TmpList, ListName ) THEN
  294. RETURN FALSE;
  295. END;
  296. GenLists.ListReplace( TmpList, GenLists.ListCode, TopList, 2 );
  297. IF NOT NdxFiles.PutField( NdxFile, ListStorageRec,
  298. 'RECORD', GenLists.ListCode, TopList ) THEN
  299. RETURN FALSE;
  300. END;
  301. IF NOT NdxFiles.WriteRecord( NdxFile, ListStorageRec ) THEN
  302. RETURN FALSE;
  303. END;
  304. RETURN TRUE;
  305. END DelRecNameList;
  306. PROCEDURE GetListNames( NdxFile: NdxTypes.NdxFileType; VAR TheList:
  307. GenLists.GenList ): BOOLEAN;
  308. VAR
  309. TypeCode: CARDINAL;
  310. TopList, TmpList, TmpList2: GenLists.GenList;
  311. BEGIN
  312. IF NOT NdxFiles.GetField( NdxFile, ListStorageRec, 'RECORD',
  313. TypeCode, TopList ) THEN
  314. RETURN FALSE;
  315. END;
  316. IF TypeCode # GenLists.ListCode THEN
  317. (*Something's wrong with this file.*)
  318. HALT();
  319. END;
  320. IF TypeCheck( TopList, 2 ) = GenLists.ListCode THEN
  321. GenLists.GetElmt( TopList, 2, TmpList, TypeCode );
  322. ELSE
  323. RETURN FALSE;
  324. END;
  325. GenLists.GetChildList( TmpList, 1, TmpList2 );
  326. IF GenLists.Initialized(TmpList2) THEN
  327. GenLists.CopyList( TmpList2, TheList );
  328. RETURN TRUE;
  329. ELSE
  330. RETURN FALSE;
  331. END;
  332. END GetListNames;
  333. BEGIN
  334. Initialized := FALSE;
  335. Init();
  336. END BuildLst.