LIB.MOD 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236
  1. (* Release 3.10 *)
  2. (*-------------------------------------------------------------------------*
  3. * *
  4. * LIB.MOD - General library functions *
  5. * *
  6. * COPYRIGHT (C) 1987..1992 Clarion Software Corporation. *
  7. * All Rights Reserved *
  8. * *
  9. *--------------------------------------------------------------------------*)
  10. (*%F _fdata *)
  11. (*# call(seg_name => null) *)
  12. (*# data(seg_name => null) *)
  13. (*%E *)
  14. (*# module(implementation=>off) *)
  15. (*# call(o_a_copy => off) *)
  16. (*# check(stack=>off,
  17. index=>off,
  18. range=>off,
  19. overflow=>off,
  20. nil_ptr=>off) *)
  21. IMPLEMENTATION MODULE Lib;
  22. IMPORT SYSTEM,Str,SPAWN,CoreMain,CoreSig,CoreMath;
  23. (*%F _OS2 *)
  24. (*%T _WINDOWS*)
  25. IMPORT Windows;
  26. (*%E *)
  27. (*%E *)
  28. (*%T _OS2 *)
  29. FROM Dos IMPORT DATETIME,GetDateTime,SIGHANDLER,SetSigHandler,Sleep,
  30. SIG_CTRLC,SIG_CTRLBREAK,Beep,RESULTCODES,ExecPgm,
  31. SearchPath,GetMessage,GetEnv,EXEC_SYNC, SetDateTime, Write;
  32. (*%E *)
  33. CONST
  34. _DLLOVL = (_DLL OR _OVL) AND NOT _OS2;
  35. _NOTDLLORENV = (NOT _DLLOVL) OR _ENV;
  36. (* Implemented In AsmLib *)
  37. (*# save *)
  38. (*%T _DLL *)
  39. (*# call(seg_name=>LibDLL) *)
  40. (*%E *)
  41. PROCEDURE AddFarAddr(A: FarADDRESS; increment: CARDINAL) : FarADDRESS; IN AsmLib;
  42. PROCEDURE SubFarAddr(A: FarADDRESS; decrement: CARDINAL) : FarADDRESS; IN AsmLib;
  43. PROCEDURE IncFarAddr(VAR A: FarADDRESS; increment: CARDINAL); IN AsmLib;
  44. PROCEDURE DecFarAddr(VAR A: FarADDRESS; decrement: CARDINAL); IN AsmLib;
  45. (*%F _fdata *)
  46. PROCEDURE NearMove (Source,Dest:NearADDRESS;Count:CARDINAL); IN AsmLib;
  47. PROCEDURE NearFastMove(Source,Dest:NearADDRESS;Count:CARDINAL); IN AsmLib;
  48. PROCEDURE NearWordMove(Source,Dest:NearADDRESS;WordCount:CARDINAL); IN AsmLib;
  49. (*%E *)
  50. PROCEDURE Move (Source,Dest:ADDRESS;Count:CARDINAL); IN AsmLib;
  51. PROCEDURE FastMove(Source,Dest:ADDRESS;Count:CARDINAL); IN AsmLib;
  52. PROCEDURE WordMove(Source,Dest:ADDRESS;WordCount:CARDINAL); IN AsmLib;
  53. PROCEDURE FarMove (Source,Dest:FarADDRESS;Count:CARDINAL); IN AsmLib;
  54. PROCEDURE FarFastMove(Source,Dest:FarADDRESS;Count:CARDINAL); IN AsmLib;
  55. PROCEDURE FarWordMove(Source,Dest:FarADDRESS;WordCount:CARDINAL); IN AsmLib;
  56. PROCEDURE Fill(Dest: ADDRESS; Count: CARDINAL; Value: BYTE); IN AsmLib;
  57. PROCEDURE FarFill(Dest: FarADDRESS; Count: CARDINAL; Value: BYTE); IN AsmLib;
  58. PROCEDURE WordFill(Dest: ADDRESS; WordCount: CARDINAL; Value: WORD); IN AsmLib;
  59. PROCEDURE FarWordFill(Dest: FarADDRESS; WordCount: CARDINAL; Value: WORD); IN AsmLib;
  60. PROCEDURE HashString(S: ARRAY OF CHAR; Range: CARDINAL) : CARDINAL; IN AsmLib;
  61. PROCEDURE Terminate(P : PROC; VAR C: PROC); IN AsmLib;
  62. PROCEDURE SetReturnCode(code: SHORTCARD); IN AsmLib;
  63. PROCEDURE SetInProgramFlag(State: BOOLEAN); IN AsmLib;
  64. PROCEDURE GetInProgramFlag(): BOOLEAN; IN AsmLib;
  65. PROCEDURE CpuId ( VAR r : CpuRec ); IN AsmLib;
  66. PROCEDURE ScanR (Dest: ADDRESS; Count: CARDINAL; Value: BYTE) : CARDINAL; IN AsmLib;
  67. PROCEDURE ScanL (Dest: ADDRESS; Count: CARDINAL; Value: BYTE) : CARDINAL; IN AsmLib;
  68. PROCEDURE ScanNeR(Dest: ADDRESS; Count: CARDINAL; Value: BYTE) : CARDINAL; IN AsmLib;
  69. PROCEDURE ScanNeL(Dest: ADDRESS; Count: CARDINAL; Value: BYTE) : CARDINAL; IN AsmLib;
  70. PROCEDURE Compare(Source,Dest: ADDRESS; Len: CARDINAL) : CARDINAL; IN AsmLib;
  71. PROCEDURE UserBreak; IN AsmLib;
  72. PROCEDURE Sound(FreqHz: CARDINAL); IN AsmLib;
  73. PROCEDURE NoSound; IN AsmLib;
  74. PROCEDURE Dos(VAR R: SYSTEM.Registers); (* INT 21H Function Call *) IN AsmLib;
  75. PROCEDURE Intr(VAR R: SYSTEM.Registers; I: CARDINAL); IN AsmLib;
  76. PROCEDURE AddressOK ( A : ADDRESS ) : BOOLEAN; IN AsmLib;
  77. PROCEDURE SelectorLimit ( S : CARDINAL ) : CARDINAL; IN AsmLib;
  78. PROCEDURE ProtectedMode () : BOOLEAN; IN AsmLib;
  79. PROCEDURE SetJmp (VAR Lbl: LongLabel) : CARDINAL; IN AsmLib;
  80. PROCEDURE LongJmp(VAR Lbl: LongLabel; result: CARDINAL); IN AsmLib;
  81. (*%F _OS2 *)
  82. (*# save *)
  83. (*# call(near_call=>off, reg_param=>()) *)
  84. PROCEDURE DosExec(name: ARRAY OF CHAR; paramblock: FarADDRESS) : CARDINAL; IN AsmLib;
  85. (*# restore *)
  86. PROCEDURE InternalEnableBreakCheck; IN AsmLib;
  87. PROCEDURE InternalDisableBreakCheck; IN AsmLib;
  88. PROCEDURE InternalDelay(Time: CARDINAL); IN AsmLib;
  89. PROCEDURE InternalSound(Freq: CARDINAL); IN AsmLib;
  90. PROCEDURE InternalNoSound(); IN AsmLib;
  91. (*%E *)
  92. (*# restore *)
  93. PROCEDURE IsOfClass(Child, Parent: MTablePtr): BOOLEAN;
  94. VAR
  95. ThisObject: MTablePtr;
  96. BEGIN
  97. ThisObject:= Child;
  98. IF ThisObject = Parent THEN RETURN TRUE END;
  99. (*%T _fdata *)
  100. WHILE ThisObject^.Parent # FarNIL DO
  101. (*%E *)
  102. (*%F _fdata *)
  103. WHILE ThisObject^.Parent # NearNIL DO
  104. (*%E *)
  105. IF ThisObject^.Parent = Parent THEN RETURN TRUE END;
  106. ThisObject := ThisObject^.Parent;
  107. END;
  108. RETURN FALSE;
  109. END IsOfClass;
  110. PROCEDURE HSort(N: CARDINAL; Less: CompareProc; Swap: SwapProc);
  111. VAR
  112. i,j,k : CARDINAL;
  113. BEGIN
  114. IF N > 1 THEN
  115. i := N DIV 2;
  116. REPEAT
  117. j := i;
  118. LOOP (* Note that total repeats <= N/4 * 1 + N/8 * 2 + N/16 * 3 + .... *)
  119. k := j * 2;
  120. IF k > N THEN EXIT END;
  121. IF (k < N) AND Less(k,k+1) THEN INC(k) END;
  122. IF Less(j,k) THEN Swap(j,k) ELSE EXIT END;
  123. j := k;
  124. END;
  125. DEC(i);
  126. UNTIL i = 0;
  127. i := N;
  128. REPEAT
  129. j := 1;
  130. Swap(j,i);
  131. DEC(i);
  132. LOOP
  133. k := j * 2;
  134. IF k > i THEN EXIT END;
  135. IF ( k < i ) AND Less(k,k+1) THEN INC(k) END;
  136. Swap(j,k);
  137. j := k;
  138. END;
  139. LOOP
  140. k := j DIV 2;
  141. IF (k > 0) AND Less(k,j) THEN Swap(j,k); j := k ELSE EXIT END;
  142. END;
  143. UNTIL i = 0;
  144. END;
  145. END HSort;
  146. PROCEDURE QSort(N: CARDINAL; Less: CompareProc; Swap: SwapProc);
  147. PROCEDURE Sort(l,r: CARDINAL);
  148. VAR
  149. i,j:CARDINAL;
  150. BEGIN
  151. WHILE r > l DO
  152. i := l+1;
  153. j := r;
  154. WHILE i <= j DO
  155. WHILE (i <= j) AND NOT Less(l,i) DO INC(i) END;
  156. WHILE (i <= j) AND Less(l,j) DO DEC(j) END;
  157. IF i <= j THEN Swap(i,j); INC(i); DEC(j) END;
  158. END;
  159. IF j # l THEN Swap(j,l) END;
  160. IF j+j > r+l THEN (* small one recursively *)
  161. Sort(j+1,r);
  162. r := j-1;
  163. ELSE
  164. Sort(l,j-1);
  165. l := j+1;
  166. END;
  167. END;
  168. END Sort;
  169. BEGIN
  170. Sort(1,N);
  171. END QSort;
  172. PROCEDURE GetVector(Int:SHORTCARD):FarADDRESS;
  173. (*%F _OS2 *)
  174. VAR
  175. r : SYSTEM.Registers;
  176. BEGIN
  177. r.AH := 35H;
  178. r.AL := Int;
  179. Dos(r);
  180. RETURN [r.ES:r.BX];
  181. (*%E *)
  182. (*%T _OS2 *)
  183. BEGIN
  184. RETURN FarNIL;
  185. (*%E *)
  186. END GetVector;
  187. PROCEDURE SetVector(Int:SHORTCARD;Vector:FarADDRESS);
  188. (*%F _OS2 *)
  189. VAR
  190. r : SYSTEM.Registers;
  191. BEGIN
  192. r.AH := 25H;
  193. r.AL := Int;
  194. r.DS := Seg(Vector^);
  195. r.DX := Ofs(Vector^);
  196. Dos(r);
  197. (*%E *)
  198. END SetVector;
  199. (*%F _OS2 *)
  200. PROCEDURE Execute(Name : ARRAY OF CHAR;
  201. CommandLine : ARRAY OF CHAR;
  202. StoreAddr : FarADDRESS; (* storage to execute in *)
  203. StoreLen : CARDINAL (* length of store paragraphs *)
  204. ):CARDINAL;
  205. CONST
  206. MinHeapNeeded = 4;
  207. VAR
  208. fullpath : ARRAY[0..80] OF CHAR;
  209. cline : RECORD
  210. len : SHORTCARD;
  211. txt : ARRAY[0..255] OF CHAR;
  212. END; (*cline*)
  213. reply : CARDINAL;
  214. LoadRec : RECORD
  215. envseg : CARDINAL;
  216. comline : FarADDRESS;
  217. FCB1 : FarADDRESS;
  218. FCB2 : FarADDRESS;
  219. END; (*LoadRec*)
  220. Progbase : CARDINAL;
  221. MaxProgSize : CARDINAL;
  222. residue : CARDINAL;
  223. (*%T _NOTDLLORENV*)
  224. PROCEDURE GiveBackHeap(StoreAddr:FarADDRESS; (* storage to execute in *)
  225. StoreLen :CARDINAL); (* length of store paragraphs *)
  226. VAR
  227. R : SYSTEM.Registers;
  228. temp : CARDINAL;
  229. BEGIN
  230. Progbase := Seg(StoreAddr^);
  231. R.AH := 4AH;
  232. R.ES := PSP;
  233. R.BX := Seg(StoreAddr^)-PSP;
  234. Lib.Dos(R); (* modify so all after seg free *)
  235. R.BX := StoreLen-2;
  236. R.AH := 48H;
  237. Lib.Dos(R); (* allocate the seg we want *)
  238. temp := R.AX;
  239. R.BX := 0FFFFH; (* allocate all the rest *)
  240. R.AH := 48H;
  241. Lib.Dos(R); (* returns allocated in BX *)
  242. R.AH := 48H;
  243. Lib.Dos(R); (* do allocation *)
  244. residue := R.AX;
  245. R.AH := 49H;
  246. R.ES := temp;
  247. Lib.Dos(R); (* now free the bit we want *)
  248. END GiveBackHeap;
  249. PROCEDURE RetrieveHeap;
  250. VAR
  251. R : SYSTEM.Registers;
  252. BEGIN
  253. R.AH := 49H;
  254. R.ES := residue;
  255. Lib.Dos(R); (* now free the residue *)
  256. R.BX := 0FFFFH; (* now modify PSP back to full size *)
  257. R.AH := 4AH;
  258. R.ES := PSP;
  259. Lib.Dos(R); (* returns allocated in BX *)
  260. R.AH := 4AH;
  261. Lib.Dos(R); (* do modify *)
  262. END RetrieveHeap;
  263. (*%E *)
  264. (*%F _NOTDLLORENV*)
  265. PROCEDURE GiveBackHeap(StoreAddr:FarADDRESS;StoreLen:CARDINAL);
  266. BEGIN
  267. CoreMain._res_mem;
  268. END GiveBackHeap;
  269. PROCEDURE RetrieveHeap;
  270. BEGIN
  271. CoreMain._shr_mem;
  272. END RetrieveHeap;
  273. (*%E *)
  274. BEGIN
  275. GiveBackHeap(StoreAddr,StoreLen);
  276. cline.len := SHORTCARD(Str.Length(CommandLine));
  277. Str.Concat(cline.txt,CommandLine,CHR(13));
  278. Str.Copy(fullpath,Name);
  279. LoadRec.envseg := [PSP:2CH]^;
  280. LoadRec.comline := FarADR(cline);
  281. LoadRec.FCB1 := [PSP:5CH];
  282. LoadRec.FCB2 := [PSP:6CH];
  283. reply := DosExec(fullpath,FarADR(LoadRec));
  284. RetrieveHeap;
  285. RETURN reply;
  286. END Execute;
  287. (*%E *)
  288. (*%T _OS2 *)
  289. PROCEDURE Environment(N: CARDINAL): CommandType;
  290. VAR
  291. Ret: FarADDRESS;
  292. BEGIN
  293. Ret := FarADR(CoreMain._env_var[N]^);
  294. IF Ret = FarNIL THEN
  295. RETURN CommandType(FarADR(NilStr));
  296. ELSE
  297. RETURN CommandType(Ret);
  298. END;
  299. END Environment;
  300. (*%E *)
  301. PROCEDURE EnvironmentFind ( name : ARRAY OF CHAR;
  302. VAR result : ARRAY OF CHAR );
  303. (* Find a string in the DOS environment *)
  304. VAR
  305. n, p : CARDINAL;
  306. pi : ARRAY[0..14] OF CHAR;
  307. pp : Lib.CommandType;
  308. c: CHAR;
  309. BEGIN
  310. n := 0;
  311. LOOP
  312. pp := Lib.Environment(n);
  313. p := 0;
  314. REPEAT (* Don't use Str.Copy or it will stop after 126 chars *)
  315. c := pp^[p];
  316. result[p] := c;
  317. INC(p);
  318. UNTIL (c = 0C) OR (p > HIGH(result));
  319. IF result[0] = CHR(0) THEN
  320. RETURN;
  321. END;
  322. Str.ItemS(pi,result,' =',0);
  323. IF Str.Match(pi,name) THEN
  324. n := Str.CharPos(result, '=');
  325. IF n=MAX(CARDINAL) THEN
  326. n := Str.CharPos(result, ' ');
  327. IF n=MAX(CARDINAL) THEN
  328. result[0]:=0C;
  329. RETURN;
  330. END;
  331. END;
  332. Str.Delete(result, 0, n+1);
  333. RETURN;
  334. END;
  335. INC(n);
  336. END;
  337. END EnvironmentFind;
  338. (*%T _OS2 *)
  339. PROCEDURE Exec ( Path : ARRAY OF CHAR; Command : ARRAY OF CHAR; Env : ExecEnvPtr): CARDINAL;
  340. VAR
  341. ParamArray: ARRAY [0..2] OF ADDRESS;
  342. BEGIN
  343. ParamArray[0]:=ADR(Path);
  344. ParamArray[1]:=ADR(Command);
  345. ParamArray[2]:=NIL;
  346. RETURN SPAWN._beget(Path, ADR(ParamArray), Env, CARDINAL(ExecSearchPath));
  347. END Exec;
  348. (*%E *)
  349. (*%T _OS2 *)
  350. PROCEDURE ExecCmd(command:ARRAY OF CHAR):CARDINAL;
  351. VAR
  352. Path : ARRAY [0..80] OF CHAR;
  353. Params : ARRAY [0..3] OF ADDRESS;
  354. BEGIN
  355. EnvironmentFind('COMSPEC', Path);
  356. IF Path[0] = 0C THEN
  357. Str.Copy(Path, "\CMD.EXE");
  358. END; (*IF*)
  359. Params[0] := ADR(Path);
  360. Params[1] := ADR("/C");
  361. Params[2] := ADR(command);
  362. Params[3] := NIL;
  363. RETURN SPAWN._beget(Path,ADR(Params),NIL,0);
  364. END ExecCmd;
  365. (*%E *)
  366. CONST
  367. HistoryMax = 54;
  368. VAR
  369. HistoryPtr : CARDINAL;
  370. LowerPtr : CARDINAL;
  371. History : ARRAY [0..HistoryMax] OF CARDINAL;
  372. PROCEDURE SEED(v:CARDINAL);
  373. VAR
  374. x : LONGCARD;
  375. i : CARDINAL;
  376. BEGIN
  377. HistoryPtr := HistoryMax;
  378. LowerPtr := 23;
  379. x := LONGCARD(v);
  380. i := 0;
  381. REPEAT
  382. x := (x*3141592621+17);
  383. History[i] := CARDINAL(x DIV 10000H);
  384. INC(i);
  385. UNTIL i > HistoryMax;
  386. END SEED;
  387. PROCEDURE RANDOM(Range: CARDINAL) : CARDINAL;
  388. VAR res:CARDINAL;
  389. BEGIN
  390. IF HistoryPtr = 0 THEN
  391. IF LowerPtr = 0 THEN
  392. SEED(12345);
  393. ELSE
  394. HistoryPtr := HistoryMax;
  395. LowerPtr := LowerPtr-1;
  396. END;
  397. ELSE
  398. HistoryPtr := HistoryPtr-1;
  399. IF LowerPtr = 0 THEN
  400. LowerPtr := HistoryMax;
  401. ELSE
  402. LowerPtr := LowerPtr-1;
  403. END;
  404. END;
  405. res := History[HistoryPtr]+History[LowerPtr];
  406. History[HistoryPtr] := res;
  407. IF Range = 0 THEN
  408. RETURN res;
  409. ELSE
  410. RETURN res MOD Range;
  411. END;
  412. END RANDOM;
  413. PROCEDURE RANDOMIZE;
  414. (*%T _WINDOWS *)
  415. BEGIN
  416. SEED(CARDINAL(Windows.GetCurrentTime()));
  417. (*%E *)
  418. (*%F _WINDOWS *)
  419. (*%T _OS2 *)
  420. VAR d : DATETIME;
  421. r : CARDINAL;
  422. BEGIN
  423. r := GetDateTime(d);
  424. SEED(CARDINAL(d.hundredths)*CARDINAL(d.seconds));
  425. (*%E *)
  426. (*%F _OS2 *)
  427. VAR R : SYSTEM.Registers;
  428. BEGIN
  429. WITH R DO
  430. AH := 2CH;
  431. Lib.Dos(R);
  432. SEED(DX+CX);
  433. END;
  434. (*%E *)
  435. (*%E *)
  436. END RANDOMIZE;
  437. PROCEDURE RAND(): REAL;
  438. VAR
  439. x:RECORD low,high:CARDINAL END;
  440. BEGIN
  441. x.low := RANDOM(0);
  442. x.high := RANDOM(0);
  443. RETURN REAL(LONGCARD(x))/(REAL(MAX(LONGCARD))+1.1); (* NB Temp Fix *)
  444. END RAND;
  445. PROCEDURE ParamStr(VAR S: ARRAY OF CHAR; N: CARDINAL);
  446. BEGIN
  447. IF N >= CoreMain._argc THEN
  448. S[0] := 0C;
  449. ELSE
  450. Str.Copy(S,CoreMain._argv[N]^);
  451. END;
  452. END ParamStr;
  453. PROCEDURE ParamCount() : CARDINAL;
  454. BEGIN
  455. RETURN CoreMain._argc-1;
  456. END ParamCount;
  457. (*%T _OS2 *)
  458. VAR
  459. nullp[0:0] : SIGHANDLER;
  460. nullac[0:0] : CARDINAL;
  461. PROCEDURE EnableBreakCheck;
  462. BEGIN
  463. SetSigHandler(SIGHANDLER(0),nullp,nullac,0,SIG_CTRLC);
  464. SetSigHandler(SIGHANDLER(0),nullp,nullac,0,SIG_CTRLBREAK);
  465. END EnableBreakCheck;
  466. PROCEDURE DisableBreakCheck;
  467. BEGIN
  468. SetSigHandler(SIGHANDLER(0),nullp,nullac,1,SIG_CTRLC);
  469. SetSigHandler(SIGHANDLER(0),nullp,nullac,1,SIG_CTRLBREAK);
  470. END DisableBreakCheck;
  471. PROCEDURE Delay(t:CARDINAL);
  472. BEGIN
  473. Sleep(LONGCARD(t));
  474. END Delay;
  475. PROCEDURE Speaker(FreqHz,TimeMs: CARDINAL);
  476. BEGIN
  477. Beep(FreqHz,TimeMs);
  478. END Speaker;
  479. (*%E *)
  480. CONST
  481. MErr = 'Math Error : ';
  482. PROCEDURE MathError(R: LONGREAL; STR: ARRAY OF CHAR);
  483. VAR str : ARRAY[0..40] OF CHAR;
  484. BEGIN
  485. Str.Concat ( str,MErr,STR );
  486. RunTimeError(CoreSig._FatalErrorPos(), 0D0H, str);
  487. END MathError;
  488. PROCEDURE MathError2(R1,R2: LONGREAL; STR: ARRAY OF CHAR);
  489. VAR str : ARRAY[0..40] OF CHAR;
  490. BEGIN
  491. RunTimeError(CoreSig._FatalErrorPos(), 0D1H, str);
  492. END MathError2;
  493. (*%F _OS2 *)
  494. PROCEDURE EnableBreakCheck;
  495. BEGIN
  496. InternalEnableBreakCheck;
  497. END EnableBreakCheck;
  498. PROCEDURE DisableBreakCheck;
  499. BEGIN
  500. InternalDisableBreakCheck;
  501. END DisableBreakCheck;
  502. PROCEDURE Environment(N: CARDINAL): CommandType;
  503. TYPE
  504. (*# save *)
  505. (*# data(near_ptr=>off) *)
  506. CardPtr = POINTER TO CARDINAL;
  507. (*# restore *)
  508. VAR
  509. Ret: CommandType;
  510. c: CHAR;
  511. BEGIN
  512. Ret := [[PSP: 2CH CardPtr]^: 0];
  513. WHILE N # 0 DO
  514. IF Ret^[0] = 0C THEN
  515. RETURN FarNIL;
  516. END;
  517. REPEAT
  518. c := Ret^[0];
  519. INC(CARDINAL(Ret));
  520. UNTIL c = 0C;
  521. DEC(N);
  522. END;
  523. RETURN Ret;
  524. END Environment;
  525. PROCEDURE Delay(Time: CARDINAL);
  526. BEGIN
  527. InternalDelay(Time);
  528. END Delay;
  529. PROCEDURE Speaker(FreqHz,TimeMs: CARDINAL);
  530. BEGIN
  531. Sound(FreqHz);
  532. Delay(TimeMs);
  533. NoSound;
  534. END Speaker;
  535. PROCEDURE Exec(Path:ARRAY OF CHAR;Command:ARRAY OF CHAR;Env:ExecEnvPtr):CARDINAL;
  536. VAR
  537. Params: ARRAY [0..2] OF ADDRESS;
  538. BEGIN
  539. Params[0] := ADR(Path);
  540. Params[1] := ADR(Command);
  541. Params[2] := NIL;
  542. RETURN SPAWN._beget(Path,ADR(Params),Env,CARDINAL(ExecSearchPath));
  543. END Exec;
  544. PROCEDURE ExecCmd(command:ARRAY OF CHAR):CARDINAL;
  545. VAR
  546. Path : ARRAY [0..80] OF CHAR;
  547. ComLine : ARRAY [0..128] OF CHAR;
  548. p, n : CARDINAL;
  549. PBlock : CoreMain.ParamBlock;
  550. BEGIN
  551. (*%F _ENV*)
  552. IF CoreMain._fmemsetup THEN
  553. IF CoreMain._shr_mem() # 0 THEN
  554. RunTimeError(CoreSig._FatalErrorPos(),4AH,command);
  555. END; (*IF*)
  556. END; (*IF*)
  557. (*%E*)
  558. EnvironmentFind('COMSPEC',Path);
  559. IF Path[0] = 0C THEN
  560. Str.Copy(Path,"\COMMAND.COM");
  561. END; (*IF*)
  562. ComLine[1] := '/'; (* construct command line *)
  563. ComLine[2] := 'C';
  564. ComLine[3] := ' ';
  565. n := 4;
  566. p := 0;
  567. WHILE command[p] # 0C DO
  568. ComLine[n] := command[p];
  569. IF n > 127 THEN
  570. RunTimeError(CoreSig._FatalErrorPos(),4BH,command);
  571. END; (*IF*)
  572. INC(p);
  573. INC(n);
  574. END; (*WHILE*)
  575. ComLine[n] := CHR(0DH);
  576. ComLine[0] := CHR(n);
  577. PBlock.Com := FarADR(ComLine);
  578. PBlock.Env := 0;
  579. IF CoreMain._exec(Path,PBlock) # 0 THEN
  580. RunTimeError(CoreSig._FatalErrorPos(),4CH,command);
  581. END; (*IF*)
  582. IF (CoreMain._fmemsetup) THEN
  583. CoreMain._res_mem();
  584. END; (*IF*)
  585. RETURN CoreMain._get_retcode();
  586. END ExecCmd;
  587. PROCEDURE GetTime ( VAR Hrs,Mins,Secs,Hsecs : CARDINAL );
  588. VAR
  589. R : SYSTEM.Registers;
  590. BEGIN
  591. WITH R DO
  592. AH := 2CH;
  593. (*%T _WINDOWS *)
  594. DS := Seg(R);
  595. ES := Seg(R);
  596. (*%E *)
  597. Lib.Dos(R);
  598. Hrs := CARDINAL(CH);
  599. Mins := CARDINAL(CL);
  600. Secs := CARDINAL(DH);
  601. Hsecs := CARDINAL(DL);
  602. END;
  603. END GetTime;
  604. PROCEDURE SetTime(Hrs,Mins,Secs,Hsecs:CARDINAL):BOOLEAN;
  605. VAR
  606. R : SYSTEM.Registers;
  607. BEGIN
  608. WITH R DO
  609. AH := 2DH;
  610. CH := SHORTCARD(Hrs);
  611. CL := SHORTCARD(Mins);
  612. DH := SHORTCARD(Secs);
  613. DL := SHORTCARD(Hsecs);
  614. Lib.Dos(R);
  615. RETURN AX=0;
  616. END; (*WITH*)
  617. END SetTime;
  618. PROCEDURE GetDate(VAR Year,Month,Day : CARDINAL;
  619. VAR DayOfWeek : DayType );
  620. VAR
  621. R : SYSTEM.Registers;
  622. BEGIN
  623. WITH R DO
  624. AH := 2AH;
  625. (*%T _WINDOWS *)
  626. DS := Seg(R);
  627. ES := Seg(R);
  628. (*%E *)
  629. Lib.Dos(R);
  630. Year := CX;
  631. Month := CARDINAL(DH);
  632. Day := CARDINAL(DL);
  633. DayOfWeek := DayType(AL);
  634. END;
  635. END GetDate;
  636. PROCEDURE SetDate(Year,Month,Day:CARDINAL):BOOLEAN;
  637. VAR
  638. R : SYSTEM.Registers;
  639. BEGIN
  640. WITH R DO
  641. AX := 2B00H;
  642. CX := Year;
  643. DH := SHORTCARD(Month);
  644. DL := SHORTCARD(Day);
  645. (*%T _WINDOWS *)
  646. DS := Seg(R);
  647. ES := Seg(R);
  648. (*%E *)
  649. Lib.Dos(R);
  650. RETURN AX=0;
  651. END; (*WITH*)
  652. END SetDate;
  653. TYPE
  654. ErrStr = ARRAY [0..79] OF CHAR;
  655. ErrStrPtr = POINTER TO ErrStr;
  656. LA3 = ARRAY [0..2] OF SHORTCARD;
  657. CONST
  658. Ln = LA3(0DH, 0AH, 0);
  659. PROCEDURE WriteErrorString(Err: ErrStrPtr);
  660. VAR
  661. R: SYSTEM.Registers;
  662. BEGIN
  663. R.AH := 40H;
  664. R.BX := 1;
  665. R.CX := Str.Length(Err^);
  666. R.DX := Ofs(Err^);
  667. R.DS := Seg(Err^);
  668. Dos(R);
  669. END WriteErrorString;
  670. (*%E *)
  671. (*%T _OS2 *)
  672. VAR
  673. nullstr[0:0] : ARRAY[0..3] OF CHAR;
  674. PROCEDURE Execute (Name : ARRAY OF CHAR; (* full name of program *)
  675. CommandLine : ARRAY OF CHAR; (* command line for program *)
  676. StoreAddr : FarADDRESS; (* storage to execute in, MSDOS only *)
  677. StoreLen : CARDINAL (* length of store paragraphs, MSDOS only *)
  678. ) : CARDINAL; (* DOS reply (0=OK) *)
  679. CONST
  680. max = 299;
  681. VAR
  682. retcode:RESULTCODES; ObjNameBuf:ARRAY [0..49] OF CHAR;
  683. i,j:CARDINAL;
  684. cline:ARRAY [0..max] OF CHAR;
  685. Ret: CARDINAL;
  686. BEGIN
  687. Str.Concat(cline,Name,' ');
  688. i := Str.Length(cline)-1;
  689. Str.Append(cline,CommandLine);
  690. j := Str.Length(cline);
  691. IF j<max THEN cline[j+1] := 0C END;
  692. cline[i]:= 0C;
  693. CoreMath._FloatExecSave;
  694. Ret := ExecPgm(ObjNameBuf,SIZE(ObjNameBuf),EXEC_SYNC,cline,
  695. nullstr,retcode,Name);
  696. CoreMath._FloatExecRestore;
  697. RETURN Ret;
  698. END Execute;
  699. PROCEDURE OSErrorMessage ( N : CARDINAL; VAR S : ARRAY OF CHAR );
  700. CONST
  701. msgpath = 'OSO001.MSG';
  702. VAR
  703. dummy,len : CARDINAL;
  704. msg : ARRAY[0..255] OF CHAR;
  705. b : BOOLEAN;
  706. i,r : CARDINAL;
  707. path : ARRAY[0..64] OF CHAR;
  708. BEGIN
  709. IF ProtectedMode() THEN
  710. r := SearchPath(3,'DPATH',msgpath,FarADR(path),SIZE(path));
  711. ELSE
  712. Str.Copy(path,msgpath);
  713. r := 0;
  714. END;
  715. IF (r=0) AND (GetMessage(FarADR(dummy),0,msg,SIZE(msg)-1,N,path,len)=0) THEN
  716. IF len<SIZE(msg) THEN msg[len] := 0C END;
  717. Str.Concat(S,'Error: ',msg);
  718. ELSE
  719. i := 5;
  720. msg[i] := 0C;
  721. REPEAT
  722. DEC(i);
  723. msg[i] := CHR(ORD('0')+(N MOD 10));
  724. N := N DIV 10;
  725. UNTIL (N=0)OR(i=0);
  726. WHILE (i>0) DO DEC(i); msg[i] := ' ' END;
  727. Str.Concat(S,'OS/2 ERROR ',msg);
  728. END;
  729. END OSErrorMessage;
  730. PROCEDURE OSFatalError( S : ARRAY OF CHAR;
  731. N : CARDINAL );
  732. VAR
  733. msg : ARRAY[0..255] OF CHAR;
  734. BEGIN
  735. IF N=0 THEN RETURN END;
  736. OSErrorMessage(N,msg);
  737. Str.Concat(msg,' ',msg);
  738. Str.Concat(msg,S,msg);
  739. RunTimeError(CoreSig._FatalErrorPos(), 0D2H, msg);
  740. END OSFatalError;
  741. PROCEDURE GetTime ( VAR Hrs,Mins,Secs,Hsecs : CARDINAL );
  742. VAR d : DATETIME;
  743. r : CARDINAL;
  744. BEGIN
  745. r := GetDateTime(d);
  746. Hrs := CARDINAL(d.hours);
  747. Mins := CARDINAL(d.minutes);
  748. Secs := CARDINAL(d.seconds);
  749. Hsecs := CARDINAL(d.hundredths);
  750. END GetTime;
  751. PROCEDURE SetTime (Hrs,Mins,Secs,Hsecs : CARDINAL ): BOOLEAN;
  752. VAR d : DATETIME;
  753. r : CARDINAL;
  754. BEGIN
  755. r := GetDateTime(d);
  756. d.hours:=SHORTCARD(Hrs);
  757. d.minutes:=SHORTCARD(Mins);
  758. d.seconds:=SHORTCARD(Secs);
  759. d.hundredths:=SHORTCARD(Hsecs);
  760. r := SetDateTime(d);
  761. RETURN BOOLEAN(r);
  762. END SetTime;
  763. PROCEDURE GetDate ( VAR Year,Month,Day : CARDINAL;
  764. VAR DayOfWeek : DayType );
  765. VAR d : DATETIME;
  766. r : CARDINAL;
  767. BEGIN
  768. r := GetDateTime(d);
  769. Year := CARDINAL(d.year);
  770. Month := CARDINAL(d.month);
  771. Day := CARDINAL(d.day);
  772. DayOfWeek := DayType(d.weekday);
  773. END GetDate;
  774. PROCEDURE SetDate (Year,Month,Day : CARDINAL): BOOLEAN;
  775. VAR d : DATETIME;
  776. r : CARDINAL;
  777. BEGIN
  778. r := GetDateTime(d);
  779. d.year:=CARDINAL(Year);
  780. d.month:=SHORTCARD(Month);
  781. d.day:=SHORTCARD(Day);
  782. r := SetDateTime(d);
  783. RETURN BOOLEAN(r);
  784. END SetDate;
  785. TYPE
  786. ErrStr = ARRAY [0..79] OF CHAR;
  787. ErrStrPtr = POINTER TO ErrStr;
  788. LA3 = ARRAY [0..2] OF SHORTCARD;
  789. CONST
  790. Ln = LA3(0DH, 0AH, 0);
  791. PROCEDURE WriteErrorString(Err: ErrStrPtr);
  792. VAR
  793. NumWrit: CARDINAL;
  794. BEGIN
  795. IF Write(1, FarADR(Err^), Str.Length(Err^)+1, NumWrit) = 0 THEN END;
  796. END WriteErrorString;
  797. (*%E *)
  798. PROCEDURE FatalError(S : ARRAY OF CHAR);
  799. BEGIN
  800. WriteErrorString(ADR(S));
  801. WriteErrorString(ADR(Ln));
  802. HALT;
  803. END FatalError;
  804. PROCEDURE WrDosError ( ErrorNo : SHORTCARD );
  805. VAR
  806. EStr: ErrStrPtr;
  807. Temp: ARRAY [0..9] OF CHAR;
  808. OK: BOOLEAN;
  809. BEGIN
  810. CASE ErrorNo OF
  811. 0 : EStr := ADR('OK');
  812. | 1 : EStr := ADR('Invalid function number');
  813. | 2 : EStr := ADR('File not found');
  814. | 3 : EStr := ADR('Path not found');
  815. | 4 : EStr := ADR('Too many open files (no handles left)');
  816. | 5 : EStr := ADR('Access denied');
  817. | 6 : EStr := ADR('Invalid handle');
  818. | 7 : EStr := ADR('Memory control blocks destroyed');
  819. | 8 : EStr := ADR('Insufficient memory');
  820. | 9 : EStr := ADR('Invalid memory block address');
  821. | 10 : EStr := ADR('Invalid environment');
  822. | 11 : EStr := ADR('Invalid format');
  823. | 12 : EStr := ADR('Invalid access code');
  824. | 13 : EStr := ADR('Invalid data');
  825. (*14 : Reserved *)
  826. | 15 : EStr := ADR('Invalid drive was specified');
  827. | 16 : EStr := ADR('Attempt to remove the current directory');
  828. | 17 : EStr := ADR('Not same device');
  829. | 18 : EStr := ADR('No more files');
  830. | 19 : EStr := ADR('Attempt to write on write-protected diskette');
  831. | 20 : EStr := ADR('Unknown unit');
  832. | 21 : EStr := ADR('Drive not ready');
  833. | 22 : EStr := ADR('Unknown command');
  834. | 23 : EStr := ADR('Data error (CRC)');
  835. | 24 : EStr := ADR('Bad request structure length');
  836. | 25 : EStr := ADR('Seek error');
  837. | 26 : EStr := ADR('Unknown media type');
  838. | 27 : EStr := ADR('Sector not found');
  839. | 28 : EStr := ADR('Printer out of paper');
  840. | 29 : EStr := ADR('Write fault');
  841. | 30 : EStr := ADR('Read fault');
  842. | 31 : EStr := ADR('General failure');
  843. | 32 : EStr := ADR('Sharing Violation');
  844. | 33 : EStr := ADR('Lock Violation');
  845. | 34 : EStr := ADR('Invalid disk change');
  846. | 35 : EStr := ADR('FCB unavailable');
  847. (*36..79 : Reserved *)
  848. | 80 : EStr := ADR('File exists');
  849. (*81 : Reserved *)
  850. | 82 : EStr := ADR('Cannot Make');
  851. | 83 : EStr := ADR('Fail on INT 24');
  852. | 0F0H:EStr := ADR('Disk Full (write failed)'); (* JPI internal *)
  853. ELSE
  854. WriteErrorString(ADR('Unknown DOS Error : '));
  855. Str.CardToStr(LONGCARD(ErrorNo), Temp, 4, OK);
  856. WriteErrorString(ADR(Temp));
  857. RETURN;
  858. END;
  859. WriteErrorString(EStr);
  860. WriteErrorString(ADR(Ln));
  861. END WrDosError;
  862. (*%F _OS2 *)
  863. PROCEDURE OSErrorMessage ( N : CARDINAL; VAR S : ARRAY OF CHAR );
  864. VAR
  865. NS : ARRAY[0..5] OF CHAR;
  866. i : CARDINAL;
  867. EStr: POINTER TO ErrStr;
  868. BEGIN
  869. CASE N OF
  870. 0 : EStr := ADR('OK');
  871. | 1 : EStr := ADR('Invalid function number');
  872. | 2 : EStr := ADR('File not found');
  873. | 3 : EStr := ADR('Path not found');
  874. | 4 : EStr := ADR('Too many open files (no handles left)');
  875. | 5 : EStr := ADR('Access denied');
  876. | 6 : EStr := ADR('Invalid handle');
  877. | 7 : EStr := ADR('Memory control blocks destroyed');
  878. | 8 : EStr := ADR('Insufficient memory');
  879. | 9 : EStr := ADR('Invalid memory block address');
  880. | 10 : EStr := ADR('Invalid environment');
  881. | 11 : EStr := ADR('Invalid format');
  882. | 12 : EStr := ADR('Invalid access code');
  883. | 13 : EStr := ADR('Invalid data');
  884. (*14 : Reserved *)
  885. | 15 : EStr := ADR('Invalid drive was specified');
  886. | 16 : EStr := ADR('Attempt to remove the current directory');
  887. | 17 : EStr := ADR('Not same device');
  888. | 18 : EStr := ADR('No more files');
  889. | 19 : EStr := ADR('Attempt to write on write-protected diskette');
  890. | 20 : EStr := ADR('Unknown unit');
  891. | 21 : EStr := ADR('Drive not ready');
  892. | 22 : EStr := ADR('Unknown command');
  893. | 23 : EStr := ADR('Data error (CRC)');
  894. | 24 : EStr := ADR('Bad request structure length');
  895. | 25 : EStr := ADR('Seek error');
  896. | 26 : EStr := ADR('Unknown media type');
  897. | 27 : EStr := ADR('Sector not found');
  898. | 28 : EStr := ADR('Printer out of paper');
  899. | 29 : EStr := ADR('Write fault');
  900. | 30 : EStr := ADR('Read fault');
  901. | 31 : EStr := ADR('General failure');
  902. | 32 : EStr := ADR('Sharing Violation');
  903. | 33 : EStr := ADR('Lock Violation');
  904. | 34 : EStr := ADR('Invalid disk change');
  905. | 35 : EStr := ADR('FCB unavailable');
  906. (*36..79 : Reserved *)
  907. | 80 : EStr := ADR('File exists');
  908. (*81 : Reserved *)
  909. | 82 : EStr := ADR('Cannot Make');
  910. | 83 : EStr := ADR('Fail on INT 24');
  911. | 0F0H:EStr := ADR('Disk Full (write failed)'); (* JPI internal *)
  912. ELSE
  913. Str.Copy(S,'Unknown DOS Error : ');
  914. NS := ' ';
  915. i := 4;
  916. REPEAT
  917. NS[i] := CHR(48+N MOD 10);
  918. DEC(i);
  919. N := N DIV 10;
  920. UNTIL N=0;
  921. Str.Append(S,NS);
  922. RETURN;
  923. END;
  924. Str.Copy(S, EStr^);
  925. END OSErrorMessage;
  926. PROCEDURE OSFatalError ( S : ARRAY OF CHAR; N : CARDINAL );
  927. VAR
  928. S2:ARRAY[0..127] OF CHAR;
  929. BEGIN
  930. OSErrorMessage(N,S2);
  931. Str.Concat(S2,S,S2);
  932. WriteErrorString(ADR(S2));
  933. RunTimeError(CoreSig._FatalErrorPos(), 0D2H, S);
  934. END OSFatalError;
  935. (*%E *)
  936. PROCEDURE SysErrno(): CARDINAL;
  937. VAR
  938. EP: CoreSig.ErrnoPtr;
  939. BEGIN
  940. EP:=CoreSig._errno__();
  941. RETURN CARDINAL(EP^);
  942. END SysErrno;
  943. PROCEDURE RunTimeErrorHandler(ErrAdd: LONGCARD; Code: CARDINAL; Msg: ARRAY OF CHAR);
  944. BEGIN
  945. WriteErrorString(ADR(Msg));
  946. WriteErrorString(ADR(Ln));
  947. CoreSig._FatalError(ErrAdd, Code);
  948. END RunTimeErrorHandler;
  949. PROCEDURE MakeAllPath(VAR Path: ARRAY OF CHAR; Drive, Dir, Name, Ext: ARRAY OF CHAR);
  950. VAR
  951. Pos: CARDINAL;
  952. BEGIN
  953. Str.Copy(Path, Drive);
  954. IF Dir[0] # CHAR(0) THEN
  955. Str.Append(Path, Dir);
  956. Pos:=Str.Length(Path)-1;
  957. IF NOT((Path[Pos] = '\') OR (Path[Pos] = '/')) THEN
  958. Path[Pos+1]:='\';
  959. Path[Pos+2]:=CHAR(0);
  960. END;
  961. END;
  962. Str.Append(Path, Name);
  963. IF Ext[0] # CHAR(0) THEN
  964. IF Ext[0] # '.'THEN
  965. Pos:=Str.Length(Path);
  966. Path[Pos]:='.';
  967. Path[Pos+1]:=CHAR(0);
  968. END;
  969. Str.Append(Path, Ext);
  970. END;
  971. RETURN;
  972. END MakeAllPath;
  973. PROCEDURE SplitAllPath(Path: ARRAY OF CHAR; VAR Drive: ARRAY OF CHAR;
  974. VAR Dir: ARRAY OF CHAR; VAR Name: ARRAY OF CHAR; VAR Ext: ARRAY OF CHAR);
  975. VAR
  976. n, p: CARDINAL;
  977. Dir_start, Name_start, Ext_start, Path_end: CARDINAL;
  978. c: CHAR;
  979. BEGIN
  980. n := 0;
  981. IF (Path[0] # 0C) AND ((Path[1] = ':') OR (Path[2] = ':')) THEN
  982. REPEAT
  983. c := Path[n];
  984. Drive[n] := c;
  985. INC(n);
  986. UNTIL ((c = ':') OR (n > HIGH(Drive)));
  987. END;
  988. IF n <= HIGH(Drive) THEN
  989. Drive[n] := 0C;
  990. END;
  991. Dir_start := n;
  992. Name_start := n;
  993. Ext_start := MAX(CARDINAL);
  994. LOOP
  995. c := Path[n];
  996. IF c = 0C THEN EXIT END;
  997. CASE c OF
  998. | '.' :
  999. IF(NOT((Path[n+1] = '.') OR (Path[n+1] = '\') OR (Path[n+1] = '/'))) THEN
  1000. Ext_start := n;
  1001. END;
  1002. INC(n);
  1003. | '/', '\' :
  1004. INC(n);
  1005. Name_start := n;
  1006. ELSE
  1007. INC(n);
  1008. END;
  1009. END;
  1010. Path_end := n;
  1011. IF Ext_start = MAX(CARDINAL) THEN
  1012. Ext_start := n;
  1013. END;
  1014. n:= Dir_start;
  1015. p := 0;
  1016. WHILE ((n < Name_start) AND (p <= HIGH(Dir)) AND (n<Ext_start)) DO
  1017. Dir[p] := Path[n];
  1018. INC(p);
  1019. INC(n);
  1020. END;
  1021. IF p <= HIGH(Dir) THEN
  1022. Dir[p] := 0C;
  1023. END;
  1024. n := Name_start;
  1025. p := 0;
  1026. WHILE (n < Ext_start) AND (p <= HIGH(Name)) DO
  1027. Name[p] := Path[n];
  1028. INC(n);
  1029. INC(p);
  1030. END;
  1031. IF p <= HIGH(Name) THEN
  1032. Name[p] := 0C;
  1033. END;
  1034. p := 0;
  1035. IF(Ext_start >= Name_start) THEN
  1036. n := Ext_start;
  1037. WHILE (n < Path_end) AND (p <= HIGH(Ext)) DO
  1038. Ext[p] := Path[n];
  1039. INC(n);
  1040. INC(p);
  1041. END;
  1042. END;
  1043. IF p <= HIGH(Ext) THEN
  1044. Ext[p] := 0C;
  1045. END;
  1046. END SplitAllPath;
  1047. (*%F _OS2 *)
  1048. TYPE
  1049. (*# save,data(near_ptr=>off) *)
  1050. FarCharPtr = POINTER TO CHAR;
  1051. (*# restore *)
  1052. VAR
  1053. n: CARDINAL;
  1054. BEGIN
  1055. HistoryPtr := 0;
  1056. LowerPtr := 0;
  1057. ExecSearchPath := TRUE;
  1058. NilStr[0] := 0C;
  1059. (*%F _WINDLL *)
  1060. PSP := CoreMain._psp;
  1061. [PSP: 81H+CARDINAL([PSP:80H FarCharPtr]^) FarCharPtr]^ := 0C;
  1062. CommandLine := [PSP: 81H CommandType];
  1063. n := 0;
  1064. WHILE CommandLine^[n] = ' ' DO
  1065. INC(n);
  1066. END;
  1067. INC(CARDINAL(CommandLine),n);
  1068. (*%E *)
  1069. RunTimeError := RunTimeErrorHandler;
  1070. (*%E *)
  1071. (*%T _OS2 *)
  1072. (*# save *)
  1073. (*# data(near_ptr=>off) *)
  1074. TYPE bp=POINTER TO SHORTCARD;
  1075. wp=POINTER TO CARDINAL;
  1076. (*# restore *)
  1077. VAR
  1078. seg, ofs, lim, n : CARDINAL;
  1079. BEGIN
  1080. HistoryPtr := 0;
  1081. LowerPtr := 0;
  1082. ExecSearchPath := TRUE;
  1083. NilStr[0] := 0C;
  1084. IF (GetEnv(seg,ofs)=0) THEN END;
  1085. (*%F _XTD *)
  1086. lim := SelectorLimit(seg);
  1087. LOOP
  1088. INC(ofs);
  1089. IF ofs>lim THEN (* bug in 1.0/Codeview *)
  1090. ofs := 1;
  1091. [seg:0 wp]^ := 0;
  1092. [seg:2 wp]^ := 0;
  1093. EXIT;
  1094. END;
  1095. IF [seg:ofs-1 bp]^ = 0 THEN EXIT END;
  1096. END;
  1097. CommandLine := [seg:ofs];
  1098. IF CommandLine # FarNIL THEN
  1099. n := 0;
  1100. WHILE CommandLine^[n] = ' ' DO
  1101. INC(n);
  1102. END;
  1103. INC(CARDINAL(CommandLine), n);
  1104. END;
  1105. (*%E *)
  1106. (*%T _XTD*)
  1107. WHILE [seg:ofs bp]^ # 0 DO
  1108. INC(ofs);
  1109. END; (*WHILE*)
  1110. REPEAT
  1111. INC(ofs);
  1112. UNTIL [seg:ofs bp]^ # 20H;
  1113. CommandLine := [seg:ofs];
  1114. PSP := CoreMain._psp;
  1115. (*%E*)
  1116. RunTimeError:=RunTimeErrorHandler;
  1117. (*%E *)
  1118. END Lib.
  1119.