SNR.MOD 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. MODULE snr;
  2. (*
  3. * REPERTOIRE
  4. * Release 1.6
  5. * By Charles Bradford and Cole Brecheen
  6. * (c) Copyright 1985-1990 PMI
  7. * Green Bay WI
  8. * All rights reserved
  9. * (414) 468-6040
  10. *
  11. *)
  12. (*
  13. IMPORT EMS;
  14. *)
  15. FROM BigSets IMPORT AppendSet, ExclSet, InitSet, ChSetArray;
  16. FROM Drectory IMPORT FileInfoRec, FindFirstFile, FindNextFile,
  17. GetDrivePathAndName, GetFileDateAndTime, SetFileDateAndTime;
  18. FROM Editor IMPORT DoCounting, EntryBox, ExitBox, ScrnEdit;
  19. FROM EnvironUtils IMPORT ParsedParam;
  20. FROM ErrorManager IMPORT StraightToDOS;
  21. FROM HandleIO IMPORT OpenFile, CloseHandle;
  22. FROM GenLists IMPORT DisposeList, GenList, GetElmt, ListInsert, ListLength,
  23. ListDelete, ListReplace, NewList, ScanList, StrCode;
  24. FROM KbdInput IMPORT KeyNumSet, CAPkey, KeyHit, YorN;
  25. FROM ListUtils IMPORT TextFileToList, TextListToFile;
  26. FROM M2Strings IMPORT CompareStr, Copy, Delete, Insert, Length;
  27. FROM PosUtils IMPORT Equal, Present, PresentPos;
  28. FROM ScrnTypes IMPORT DisplayFrame;
  29. FROM SmartScreen IMPORT ClearScreen;
  30. FROM StrConv IMPORT AppendDecoded, StrToCardinal;
  31. FROM StrEdit IMPORT Append, AssignStr, CrunchBlanks, CutTrailingChars,
  32. DeleteChar, ReplaceStr, SetLength, InsertTabs, ReplaceTabs;
  33. FROM StringIO IMPORT NoError, inp, outp, PrintMessage, ReadStr,
  34. WriteEol, WriteStr;
  35. FROM UserOps IMPORT FieldExitKeySet;
  36. (*
  37. IMPORT InitJPI;
  38. *)
  39. CONST
  40. TAB = 11C;
  41. VAR
  42. DirHandle, SavedMessage: CARDINAL;
  43. fname, FileSpec, CodeStr, PathName, PromptStr: ARRAY [0..80] OF CHAR;
  44. MeansDelete, EOFmark, Dumstr: ARRAY [0..0] OF CHAR;
  45. SearchFor, x, ReplaceWith: ARRAY [0..255] OF CHAR;
  46. FileInfo: FileInfoRec;
  47. PatternList, ReplaceList, TheList: GenList;
  48. PatternCount, spot, ExitCode, CursorRow, LstLngth, StrLngth, LineNum,
  49. StartingAt, FoundSpot, TypeCode, month, day, year, hours,
  50. minutes, seconds, ParamCount: CARDINAL;
  51. DriveLetter, CodeChar: CHAR;
  52. editing, EditsMade, stripping, preserving, confirming, ChangesMade:
  53. BOOLEAN;
  54. DummyFrame: DisplayFrame;
  55. entabbing, detabbing: BOOLEAN;
  56. tabInterval: CARDINAL;
  57. PROCEDURE GetStamp( fname: ARRAY OF CHAR );
  58. VAR
  59. tmphandle: CARDINAL;
  60. BEGIN
  61. PrintMessage( OpenFile( tmphandle, fname ) );
  62. GetFileDateAndTime( tmphandle, month, day, year, hours,
  63. minutes, seconds );
  64. PrintMessage( CloseHandle( tmphandle ) );
  65. END GetStamp;
  66. PROCEDURE SetStamp( fname: ARRAY OF CHAR );
  67. VAR
  68. tmphandle: CARDINAL;
  69. BEGIN
  70. PrintMessage( OpenFile( tmphandle, fname ) );
  71. SetFileDateAndTime( tmphandle, month, day, year, hours,
  72. minutes, seconds );
  73. PrintMessage( CloseHandle( tmphandle ) );
  74. END SetStamp;
  75. PROCEDURE GetTabInfo(VAR entabbing, detabbing: BOOLEAN;
  76. VAR tabInterval: CARDINAL);
  77. VAR
  78. DigitKeySet: KeyNumSet;
  79. EDNQ : KeyNumSet;
  80. tmpkey: CARDINAL;
  81. BEGIN
  82. InitSet(DigitKeySet);
  83. AppendSet(DigitKeySet, "{'0'..'9'}");
  84. InitSet( EDNQ );
  85. AppendSet( EDNQ, "{'e', 'E', 'd', 'D', 'n', 'N', 'q', 'Q'}" );
  86. WriteEol( outp, '' );
  87. WriteStr( outp, 'Entab, Detab or Neither? ' );
  88. tmpkey := CAPkey( KeyHit( EDNQ ) );
  89. entabbing := tmpkey = ORD('E');
  90. detabbing := tmpkey = ORD('D');
  91. IF entabbing THEN
  92. WriteStr( outp, 'entab' );
  93. ELSIF detabbing THEN
  94. WriteStr( outp, 'detab' );
  95. ELSIF ORD('Q') = tmpkey THEN
  96. StraightToDOS('');
  97. END;
  98. IF entabbing OR detabbing THEN
  99. WriteEol( outp, '' );
  100. WriteStr( outp, 'Tab interval [0-9]? ' );
  101. tmpkey := KeyHit( DigitKeySet );
  102. tabInterval := tmpkey - ORD('0');
  103. ELSE
  104. tabInterval := 0;
  105. END;
  106. END GetTabInfo;
  107. PROCEDURE yes( TheQuestion: ARRAY OF CHAR ): BOOLEAN;
  108. VAR
  109. tmpkey: CARDINAL;
  110. BEGIN
  111. WriteEol( outp, '' );
  112. WriteStr( outp, TheQuestion );
  113. tmpkey := CAPkey( KeyHit( YorN ) );
  114. IF ORD('Y') = tmpkey THEN
  115. WriteStr( outp, 'yes' );
  116. RETURN TRUE;
  117. ELSIF ORD('Q') = tmpkey THEN
  118. StraightToDOS('');
  119. END;
  120. WriteStr( outp, 'no' );
  121. RETURN FALSE;
  122. END yes;
  123. PROCEDURE NextParam(): CARDINAL;
  124. BEGIN
  125. INC(ParamCount);
  126. RETURN ParamCount;
  127. END NextParam;
  128. BEGIN
  129. ParamCount := 0;
  130. EOFmark[0] := CHR(26);
  131. MeansDelete[0] := CHR(255);
  132. AppendSet( YorN, "{'q', 'Q'}" );
  133. IF NOT ParsedParam( NextParam(), FileSpec ) THEN
  134. WriteStr( outp, "FileSpec: " );
  135. ReadStr( inp, FileSpec );
  136. IF Length( FileSpec ) = 0 THEN
  137. RETURN;
  138. END;
  139. END;
  140. IF ParsedParam( NextParam(), CodeStr ) THEN
  141. CodeChar := CodeStr[0];
  142. ELSE
  143. WriteStr( outp, 'CodeChar: ' );
  144. ReadStr( inp, CodeStr );
  145. CrunchBlanks( CodeStr );
  146. IF Length( CodeStr ) = 0 THEN
  147. CodeChar := '#';
  148. WriteEol( outp, 'Assumed #' );
  149. ELSE
  150. CodeChar := CodeStr[0];
  151. END;
  152. END;
  153. NewList(PatternList);
  154. NewList(ReplaceList);
  155. SetLength( SearchFor, 0 );
  156. IF ParsedParam( NextParam(), x ) THEN
  157. AppendDecoded( SearchFor, CodeChar, x );
  158. ELSE
  159. WriteStr( outp, 'SearchFor: ' );
  160. ReadStr( inp, x );
  161. IF Length( x ) = 0 THEN
  162. RETURN;
  163. ELSE
  164. AppendDecoded( SearchFor, CodeChar, x );
  165. END;
  166. END;
  167. IF SearchFor[0] = '@' THEN
  168. (*They've given us a file name.*)
  169. Delete( SearchFor, 0, 1 );
  170. NewList( PatternList );
  171. PrintMessage( TextFileToList( SearchFor, PatternList ) );
  172. PatternCount := 1;
  173. WHILE PatternCount <= ListLength(PatternList) DO
  174. SetLength( ReplaceWith, 0 );
  175. GetElmt( PatternList, PatternCount, SearchFor, TypeCode );
  176. IF PresentPos( '=', SearchFor, spot ) THEN
  177. Copy( SearchFor, spot + 1, Length(SearchFor) - spot - 1, x );
  178. AppendDecoded( ReplaceWith, CodeChar, x );
  179. Delete( SearchFor, spot, Length(SearchFor) - spot );
  180. ListReplace( SearchFor, StrCode, PatternList,
  181. PatternCount );
  182. ListInsert( ReplaceWith, StrCode, ReplaceList,
  183. ListLength(ReplaceList) + 1 );
  184. INC( PatternCount );
  185. ELSE
  186. ListDelete( PatternList, PatternCount, 1 );
  187. END;
  188. END;
  189. ELSE
  190. SetLength( ReplaceWith, 0 );
  191. IF ParsedParam( NextParam(), x ) THEN
  192. AppendDecoded( ReplaceWith, CodeChar, x );
  193. ELSE
  194. WriteStr( outp, 'ReplaceWith: ' );
  195. ReadStr( inp, x );
  196. IF Length( x ) = 0 THEN
  197. RETURN;
  198. ELSE
  199. AppendDecoded( ReplaceWith, CodeChar, x );
  200. END;
  201. END;
  202. ListInsert( SearchFor, StrCode, PatternList, 1 );
  203. ListInsert( ReplaceWith, StrCode, ReplaceList, 1 );
  204. END;
  205. IF NOT ParsedParam( NextParam(), Dumstr ) THEN
  206. confirming := yes( 'Confirm replacements? ');
  207. ELSE
  208. confirming := Dumstr[0] = 'Y';
  209. END;
  210. IF NOT ParsedParam( NextParam(), Dumstr ) THEN
  211. EntryBox := 0;
  212. ExitBox := 0;
  213. DoCounting := FALSE;
  214. editing := yes( 'Invoke editor? ');
  215. ELSE
  216. editing := Dumstr[0] = 'Y';
  217. END;
  218. IF NOT ParsedParam( NextParam(), Dumstr ) THEN
  219. stripping := yes( 'Strip trailing blanks and EOFs? ');
  220. ELSE
  221. stripping := Dumstr[0] = 'Y';
  222. END;
  223. IF NOT ParsedParam( NextParam(), Dumstr ) THEN
  224. preserving := yes( 'Preserve file date/time stamps? ');
  225. ELSE
  226. preserving := Dumstr[0] = 'Y';
  227. END;
  228. IF NOT ParsedParam( NextParam(), Dumstr ) THEN
  229. GetTabInfo(entabbing, detabbing, tabInterval);
  230. ELSE
  231. entabbing := Dumstr[0] = 'E';
  232. detabbing := Dumstr[0] = 'D';
  233. IF entabbing OR detabbing THEN
  234. IF NOT StrToCardinal(Dumstr, 1, tabInterval) THEN
  235. tabInterval := 8;
  236. END;
  237. ELSE
  238. tabInterval := 0;
  239. END;
  240. END;
  241. IF (NOT Present( EOFmark, SearchFor )) AND (NOT Present(
  242. EOFmark, ReplaceWith )) THEN
  243. WriteEol( outp, '' );
  244. WriteStr( outp, 'Searching for "');
  245. WriteStr( outp, SearchFor );
  246. WriteStr( outp, '" and replacing it with "' );
  247. WriteStr( outp, ReplaceWith );
  248. WriteStr( outp, '" in "');
  249. WriteStr( outp, FileSpec );
  250. WriteEol( outp, '".' );
  251. END;
  252. DirHandle := 0FFFFH;
  253. SavedMessage := FindFirstFile( FileSpec, DirHandle, FileInfo );
  254. PrintMessage( SavedMessage );
  255. GetDrivePathAndName( FileSpec, DriveLetter, PathName, fname );
  256. ExclSet( FieldExitKeySet, 328 );
  257. ExclSet( FieldExitKeySet, 331 );
  258. ExclSet( FieldExitKeySet, 333 );
  259. ExclSet( FieldExitKeySet, 336 );
  260. (*Arrow keys are now removed from FieldExitKeySet.*)
  261. WHILE SavedMessage = NoError DO
  262. AssignStr( FileInfo.name, fname );
  263. IF (CompareStr( '.', fname ) # 0)
  264. AND (CompareStr('..', fname )#0) THEN
  265. ChangesMade := FALSE;
  266. IF Length(PathName) > 0 THEN
  267. Insert( PathName, fname, 0 );
  268. END;
  269. Insert( ':', fname, 0 );
  270. Insert( DriveLetter, fname, 0 );
  271. NewList( TheList );
  272. IF TextFileToList( fname, TheList ) # NoError THEN
  273. WriteStr( outp, 'Could not open ' );
  274. WriteEol( outp, fname );
  275. ELSE
  276. IF preserving THEN
  277. GetStamp( fname );
  278. END;
  279. LstLngth := ListLength( TheList );
  280. WriteEol( outp, '' );
  281. WriteEol( outp,
  282. '===============================================================================');
  283. WriteEol( outp, fname );
  284. PatternCount := 1;
  285. WHILE PatternCount <= ListLength(PatternList) DO
  286. GetElmt( PatternList, PatternCount, SearchFor, TypeCode );
  287. GetElmt( ReplaceList, PatternCount, ReplaceWith, TypeCode );
  288. StartingAt := 1;
  289. LOOP
  290. LineNum := ScanList( SearchFor, TheList, StartingAt,
  291. LstLngth, FoundSpot );
  292. IF LineNum = 0 THEN
  293. EXIT;
  294. ELSE
  295. GetElmt( TheList, LineNum, x, TypeCode );
  296. IF confirming THEN
  297. WriteEol( outp, '' );
  298. WriteEol( outp, '-------------------------------------------' );
  299. WriteEol( outp, x );
  300. WriteStr( outp, 'Replace "' );
  301. WriteStr( outp, SearchFor );
  302. WriteStr( outp, '" ' );
  303. AssignStr( ' with "', PromptStr );
  304. Append( PromptStr, ReplaceWith );
  305. Append( PromptStr, '"? ' );
  306. IF yes(PromptStr) THEN
  307. IF Equal( ReplaceWith, MeansDelete ) THEN
  308. ListDelete( TheList, LineNum, 1 );
  309. DEC( LineNum );
  310. ELSE
  311. ReplaceStr( SearchFor, ReplaceWith, x );
  312. ListReplace( x, StrCode, TheList, LineNum );
  313. END;
  314. ChangesMade := TRUE;
  315. ELSIF editing AND yes('Edit? ') THEN
  316. CursorRow := 1;
  317. INC( FoundSpot );
  318. IF 0 # ScrnEdit( 1,1, 80,25, TheList, LineNum,
  319. FoundSpot, CursorRow, EditsMade, FALSE,
  320. DummyFrame ) THEN
  321. END;
  322. ClearScreen();
  323. ChangesMade := EditsMade AND yes('Save? ');
  324. END;
  325. ELSE
  326. IF Equal( ReplaceWith, MeansDelete ) THEN
  327. ListDelete( TheList, LineNum, 1 );
  328. DEC( LineNum );
  329. ELSE
  330. ReplaceStr( SearchFor, ReplaceWith, x );
  331. ListReplace( x, StrCode, TheList, LineNum );
  332. END;
  333. WriteStr( outp, "|");
  334. ChangesMade := TRUE;
  335. END;
  336. IF LineNum = LstLngth THEN
  337. EXIT;
  338. ELSE
  339. StartingAt := LineNum + 1;
  340. END;
  341. END;
  342. END;
  343. INC( PatternCount );
  344. END;
  345. IF stripping OR entabbing OR detabbing THEN
  346. LineNum := 1;
  347. WHILE LineNum <= LstLngth DO
  348. GetElmt( TheList, LineNum, x, TypeCode );
  349. IF entabbing THEN
  350. IF Present(' ', x) THEN
  351. ChangesMade := TRUE;
  352. InsertTabs(x, tabInterval, TRUE); (* TRUE for LeadingOnly *)
  353. ListReplace( x, StrCode, TheList, LineNum );
  354. END;
  355. END;
  356. IF detabbing THEN
  357. IF Present(TAB, x) THEN
  358. ChangesMade := TRUE;
  359. ReplaceTabs(x, tabInterval);
  360. ListReplace( x, StrCode, TheList, LineNum );
  361. END;
  362. END;
  363. StrLngth := Length(x);
  364. IF stripping AND (StrLngth > 0) AND (x[ StrLngth - 1 ] = ' ') THEN
  365. ChangesMade := TRUE;
  366. WriteStr( outp, ".");
  367. CutTrailingChars( ' ', x );
  368. ListReplace( x, StrCode, TheList, LineNum );
  369. INC( LineNum );
  370. ELSIF stripping AND Present( EOFmark, x ) THEN
  371. ChangesMade := TRUE;
  372. WriteStr( outp, ",");
  373. DeleteChar( EOFmark[0], x );
  374. IF x[0] # 0C THEN
  375. ListReplace( x, StrCode, TheList, LineNum );
  376. INC( LineNum );
  377. ELSE
  378. ListDelete( TheList, LineNum, 1 );
  379. DEC( LstLngth );
  380. END;
  381. ELSE
  382. INC( LineNum );
  383. END;
  384. END;
  385. END;
  386. IF ChangesMade THEN
  387. PrintMessage( TextListToFile( TheList, fname ) );
  388. IF preserving THEN
  389. SetStamp( fname );
  390. END;
  391. END;
  392. END;
  393. DisposeList( TheList );
  394. END;
  395. SavedMessage := FindNextFile( DirHandle, FileInfo );
  396. END;
  397. WriteEol( outp, '' );
  398. WriteStr( outp, 'Done.' );
  399. WriteStr( outp, CHR(7) );
  400. END snr.