FIELDTYP.MOD 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. IMPLEMENTATION MODULE FieldTypes;
  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/fieldtyp.mov 1.7 10 Mar 1991 15:27:30 coleb $
  12. *
  13. *)
  14. (*EntryDiag:
  15. IMPORT Diagnostics;
  16. :EntryDiag*)
  17. IMPORT Hash;
  18. IMPORT GenLists;
  19. IMPORT LowLevel;
  20. IMPORT M2Strings;
  21. IMPORT Numbers;
  22. IMPORT ScrnTypes;
  23. IMPORT StrConv;
  24. IMPORT StrEdit;
  25. IMPORT SYSTEM;
  26. IMPORT ErrorManager;
  27. IMPORT VStorage;
  28. VAR
  29. Initialized : BOOLEAN;
  30. CONST
  31. AfterLast = 65535;
  32. gotoConst = 'GOTO';
  33. stringConst = 'STRING';
  34. integerConst = 'INTEGER';
  35. realConst = 'REAL';
  36. groupConst = 'GROUP';
  37. choiceConst = 'CHOICE';
  38. editorConst = 'EDITOR';
  39. displayConst = 'DISPLAY';
  40. displayonlyConst = 'DISPLAYONLY';
  41. dateConst = 'DATE';
  42. booleanConst = 'BOOLEAN';
  43. TYPE
  44. APromptTable = ARRAY [0..255] OF CARDINAL;
  45. VAR
  46. TableHandle: VStorage.MemHandle;
  47. TablePointer: POINTER TO APromptTable;
  48. FieldTypeCodes : Hash.HashTable;
  49. TableInitialized : BOOLEAN;
  50. PromptList: GenLists.GenList;
  51. CharConstSize: CARDINAL;
  52. PROCEDURE DisposeTable();
  53. BEGIN
  54. Hash.Dispose( FieldTypeCodes );
  55. GenLists.DisposeList( PromptList );
  56. END DisposeTable;
  57. PROCEDURE SetPrompts();
  58. VAR
  59. tmpstr: ARRAY [0..79] OF CHAR;
  60. BEGIN
  61. SetDefaultPrompt( editorConst,
  62. 'Alt-D deletes lines; Alt-U undeletes; Shift-F7 toggles wrapping.' );
  63. StrEdit.AssignStr( 'Enter selects the highlighted choice.',
  64. tmpstr );
  65. StrConv.AppendDecoded( tmpstr, '#',
  66. 'Use #024 or #025 to move to another choice.');
  67. SetDefaultPrompt( gotoConst, tmpstr );
  68. StrEdit.SetLength(tmpstr, 0);
  69. StrConv.AppendDecoded(tmpstr, '#',
  70. 'Use #017#196 or #196#016 to change the highlighted choice, or');
  71. StrConv.AppendDecoded(tmpstr, '#',
  72. ' #024#025 to move to another field.');
  73. SetDefaultPrompt( choiceConst, tmpstr );
  74. StrEdit.AssignStr('Fill in the blank and press',tmpstr);
  75. StrConv.AppendDecoded(tmpstr, '#',
  76. ' #024 or #025 to change fields, or F10 if finished.');
  77. SetDefaultPrompt( stringConst, tmpstr );
  78. StrEdit.AssignStr( 'Enter a number between MIN and MAX.',tmpstr);
  79. (* MAX and MIN are replaced with the true values at
  80. runtime. *)
  81. SetDefaultPrompt( integerConst, tmpstr );
  82. SetDefaultPrompt( realConst, tmpstr );
  83. SetDefaultPrompt( booleanConst,
  84. 'Press space bar to select or deselect choice.' );
  85. SetDefaultPrompt( dateConst,
  86. 'Enter a date in the form 12/25/88 or 12-25-1988.' );
  87. END SetPrompts;
  88. PROCEDURE FilledAssign( s1: ARRAY OF CHAR; VAR s2: ARRAY OF CHAR );
  89. VAR
  90. len : CARDINAL;
  91. BEGIN
  92. LowLevel.Fill( SYSTEM.ADR(s2), HIGH(s2) + 1, 0C );
  93. len := M2Strings.Length( s1 );
  94. IF len <= HIGH(s2) THEN
  95. LowLevel.Move( SYSTEM.ADR(s1), SYSTEM.ADR(s2), len );
  96. ELSE
  97. M2Strings.Assign( s1, s2 );
  98. END;
  99. END FilledAssign;
  100. PROCEDURE InitTableIfNecessary();
  101. (* We can't call this in the module's initialization block
  102. because it does dynamic memory allocation, and Repertoire
  103. doesn't know where dynamic memory comes from until after
  104. the initialization sequence is over. *)
  105. VAR
  106. TmpTypeName: ARRAY [0..15] OF CHAR;
  107. BEGIN
  108. IF TableInitialized THEN
  109. RETURN;
  110. END;
  111. TableInitialized := TRUE;
  112. Hash.Define( FieldTypeCodes, 10, CharConstSize );
  113. FilledAssign( gotoConst, TmpTypeName );
  114. Hash.Insert( FieldTypeCodes, TmpTypeName, 'J' );
  115. FilledAssign( stringConst, TmpTypeName );
  116. Hash.Insert( FieldTypeCodes, TmpTypeName, 'S' );
  117. FilledAssign( integerConst, TmpTypeName );
  118. Hash.Insert( FieldTypeCodes, TmpTypeName, 'I' );
  119. FilledAssign( realConst, TmpTypeName );
  120. Hash.Insert( FieldTypeCodes, TmpTypeName, 'R' );
  121. FilledAssign( groupConst, TmpTypeName );
  122. Hash.Insert( FieldTypeCodes, TmpTypeName, 'C' );
  123. FilledAssign( choiceConst, TmpTypeName );
  124. Hash.Insert( FieldTypeCodes, TmpTypeName, 'C' );
  125. FilledAssign( editorConst, TmpTypeName );
  126. Hash.Insert( FieldTypeCodes, TmpTypeName, 'E' );
  127. FilledAssign( displayConst, TmpTypeName );
  128. Hash.Insert( FieldTypeCodes, TmpTypeName, 'D' );
  129. FilledAssign( displayonlyConst, TmpTypeName );
  130. Hash.Insert( FieldTypeCodes, TmpTypeName, 'D' );
  131. FilledAssign( dateConst, TmpTypeName );
  132. Hash.Insert( FieldTypeCodes, TmpTypeName, 'T' );
  133. FilledAssign( booleanConst, TmpTypeName );
  134. Hash.Insert( FieldTypeCodes, TmpTypeName, 'B' );
  135. IF NOT VStorage.AllocMem( TableHandle, SYSTEM.TSIZE(APromptTable) ) THEN
  136. END;
  137. TablePointer := VStorage.LockMem( TableHandle );
  138. LowLevel.Fill( TablePointer, SYSTEM.TSIZE(APromptTable), 0C );
  139. VStorage.UnLockMem( TableHandle );
  140. GenLists.NewList( PromptList );
  141. SetPrompts();
  142. ErrorManager.AddTermProc( DisposeTable );
  143. END InitTableIfNecessary;
  144. PROCEDURE TypeCode( TypeName:
  145. ARRAY OF CHAR ): CHAR;
  146. VAR
  147. TmpTypeName: ARRAY [0..15] OF CHAR;
  148. tmpch : CHAR;
  149. hash1, hash2, hash3 : CARDINAL;
  150. BEGIN
  151. InitTableIfNecessary();
  152. FilledAssign( TypeName, TmpTypeName );
  153. (* We try to first spot the standard ones by simple string
  154. comparison for speed purposes. *)
  155. IF 0 = M2Strings.CompareStr( stringConst, TmpTypeName ) THEN
  156. RETURN 'S';
  157. ELSIF 0 = M2Strings.CompareStr( integerConst, TmpTypeName ) THEN
  158. RETURN 'I';
  159. ELSIF 0 = M2Strings.CompareStr( realConst, TmpTypeName ) THEN
  160. RETURN 'R';
  161. ELSIF 0 = M2Strings.CompareStr( editorConst, TmpTypeName ) THEN
  162. RETURN 'E';
  163. ELSIF 0 = M2Strings.CompareStr( dateConst, TmpTypeName ) THEN
  164. RETURN 'T';
  165. ELSIF 0 = M2Strings.CompareStr( gotoConst, TmpTypeName ) THEN
  166. RETURN 'J';
  167. ELSIF 0 = M2Strings.CompareStr( groupConst, TmpTypeName ) THEN
  168. RETURN 'C';
  169. ELSIF 0 = M2Strings.CompareStr( choiceConst, TmpTypeName ) THEN
  170. RETURN 'C';
  171. ELSIF 0 = M2Strings.CompareStr( displayConst, TmpTypeName ) THEN
  172. RETURN 'D';
  173. ELSIF 0 = M2Strings.CompareStr( displayonlyConst, TmpTypeName ) THEN
  174. RETURN 'D';
  175. ELSIF 0 = M2Strings.CompareStr( booleanConst, TmpTypeName ) THEN
  176. RETURN 'B';
  177. ELSIF Hash.KeyFind( FieldTypeCodes, TmpTypeName ) THEN
  178. Hash.GetData( FieldTypeCodes, tmpch );
  179. ELSE
  180. Hash.Compute( TmpTypeName, hash1, hash2, hash3 );
  181. IF Numbers.CardIsBetween( ORD('['), hash2, 255 ) THEN
  182. tmpch := CHR( hash2 );
  183. ELSE
  184. tmpch := CHR( (hash2 MOD (255 - 91)) + 91 );
  185. (*Force value into range 91 to 255.*)
  186. END;
  187. Hash.Insert( FieldTypeCodes, TmpTypeName, tmpch );
  188. END;
  189. RETURN tmpch;
  190. END TypeCode;
  191. PROCEDURE SetDefaultPrompt( TypeName: ARRAY OF CHAR;
  192. TheStr: ARRAY OF CHAR );
  193. VAR
  194. OrdOfType: CARDINAL;
  195. BEGIN
  196. InitTableIfNecessary();
  197. StrEdit.CAPstr( TypeName );
  198. TablePointer := VStorage.LockMem( TableHandle );
  199. OrdOfType := ORD( TypeCode( TypeName ) );
  200. VStorage.UnLockMem( TableHandle );
  201. IF TablePointer^[ OrdOfType ] = 0 THEN
  202. GenLists.ListInsert( TheStr, GenLists.StrCode,
  203. PromptList, AfterLast );
  204. TablePointer := VStorage.LockMem( TableHandle );
  205. TablePointer^[ OrdOfType ] := GenLists.ListLength( PromptList );
  206. VStorage.UnLockMem( TableHandle );
  207. ELSE
  208. TablePointer := VStorage.LockMem( TableHandle );
  209. GenLists.ListReplace( TheStr, GenLists.StrCode,
  210. PromptList, TablePointer^[ OrdOfType ] );
  211. VStorage.UnLockMem( TableHandle );
  212. END;
  213. END SetDefaultPrompt;
  214. PROCEDURE GetDefaultPrompt( TypeCode: CHAR; VAR TheStr: ARRAY
  215. OF CHAR );
  216. VAR
  217. DumType, ListSpot : CARDINAL;
  218. BEGIN
  219. InitTableIfNecessary();
  220. StrEdit.SetLength( TheStr, 0 );
  221. TablePointer := VStorage.LockMem( TableHandle );
  222. VStorage.UnLockMem( TableHandle );
  223. ListSpot := TablePointer^[ ORD(TypeCode) ];
  224. IF ListSpot = 0 THEN
  225. RETURN;
  226. END;
  227. GenLists.GetElmt( PromptList, ListSpot, TheStr, DumType );
  228. END GetDefaultPrompt;
  229. PROCEDURE GetCharConstSize(theChar: ARRAY OF CHAR): CARDINAL;
  230. (* We don't know how many bytes a character constant really
  231. occupies. Stony Brook now has an implicit null at the end
  232. of a char const. JPI doesn't. *)
  233. BEGIN
  234. RETURN HIGH(theChar) + 1;
  235. END GetCharConstSize;
  236. PROCEDURE Init();
  237. BEGIN
  238. IF Initialized THEN
  239. RETURN;
  240. ELSE
  241. Initialized := TRUE;
  242. END;
  243. (*EntryDiag:
  244. Diagnostics.Init();
  245. :EntryDiag*)
  246. Hash.Init();
  247. GenLists.Init();
  248. LowLevel.Init();
  249. M2Strings.Init();
  250. Numbers.Init();
  251. ScrnTypes.Init();
  252. StrConv.Init();
  253. StrEdit.Init();
  254. ErrorManager.Init();
  255. VStorage.Init();
  256. (*EntryDiag:
  257. Diagnostics.diagS( 'Entering FieldTypes', '' );
  258. :EntryDiag*)
  259. CharConstSize := GetCharConstSize('A');
  260. TableInitialized := FALSE;
  261. GenLists.NilList( PromptList );
  262. VStorage.NilHandle( TableHandle );
  263. TablePointer := NIL;
  264. (*EntryDiag:
  265. Diagnostics.diagS( 'Exiting FieldTypes', '' );
  266. :EntryDiag*)
  267. END Init;
  268. BEGIN
  269. Initialized := FALSE;
  270. Init();
  271. END FieldTypes.