FIO.MOD 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137
  1. (* Release 3.10 *)
  2. (*-------------------------------------------------------------------------*
  3. * *
  4. * FIO.MOD - File input/output *
  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. (*# call(o_a_copy => off) *)
  15. (*# check(stack=>off,index=>off,range=>off,overflow=>off,nil_ptr=>off) *)
  16. IMPLEMENTATION MODULE FIO;
  17. IMPORT CoreFile,CoreIO,CoreMain,CoreSig,Lib,Str,SYSTEM;
  18. (*%T _OS2 *)
  19. IMPORT Dos,Err;
  20. FROM Dos IMPORT QCurDisk, FindFirst, FindNext;
  21. (*%E *)
  22. (*%T _mthread *)
  23. IMPORT Process, CoreProc;
  24. (*%E *)
  25. CONST
  26. TrueStr = 'TRUE';
  27. VAR
  28. (* CoreFile.BufInf : ARRAY[0..MaxHandle] OF FileInf; *) (* NB in CoreFile *)
  29. (*%T _mthread *)
  30. IOR: ARRAY [1..Process.MaxProcess] OF CARDINAL;
  31. OKTable: ARRAY [1..Process.MaxProcess] OF BOOLEAN;
  32. EOFTable: ARRAY [1..Process.MaxProcess] OF BOOLEAN;
  33. (*%E *)
  34. (*%F _mthread *)
  35. IOR: CARDINAL;
  36. (*%E *)
  37. TYPE
  38. Str80 = ARRAY[0..79] OF CHAR;
  39. (*%T _mthread *)
  40. PROCEDURE SetIOR(Num: CARDINAL);
  41. BEGIN
  42. IOR[CoreProc._getTID()] := Num;
  43. END SetIOR;
  44. PROCEDURE SetThreadOK( b : BOOLEAN);
  45. BEGIN
  46. OKTable[CoreProc._getTID()] := b;
  47. END SetThreadOK;
  48. PROCEDURE SetThreadEOF( b : BOOLEAN);
  49. BEGIN
  50. EOFTable[CoreProc._getTID()] := b;
  51. END SetThreadEOF;
  52. (*%E *)
  53. PROCEDURE ErrorCheck(Code: CARDINAL; ErrNum: CARDINAL; Msg, Name: ARRAY OF CHAR);
  54. VAR
  55. ErrMsg: ARRAY [0..119] OF CHAR;
  56. NumStr: ARRAY [0..19] OF CHAR;
  57. OK: BOOLEAN;
  58. BEGIN
  59. IF ErrNum = 0 THEN
  60. ErrNum := Lib.SysErrno();
  61. END;
  62. IF IOcheck THEN
  63. Str.Copy(ErrMsg, Msg);
  64. Str.Append(ErrMsg, Name);
  65. Str.Append(ErrMsg, '. Dos Error Code ');
  66. Str.CardToStr(LONGCARD(ErrNum), NumStr, 10, OK);
  67. Str.Append(ErrMsg, NumStr);
  68. (* Lib.WrDosError(SHORTCARD(ErrNum)); *)
  69. Lib.RunTimeError(CoreSig._FatalErrorPos(), Code+0A0H, ErrMsg);
  70. END;
  71. (*%T _mthread *)
  72. SetIOR(ErrNum);
  73. (*%E *)
  74. (*%F _mthread *)
  75. IOR := ErrNum;
  76. (*%E *)
  77. END ErrorCheck;
  78. PROCEDURE IOresult () : CARDINAL;
  79. BEGIN
  80. (*%T _mthread *)
  81. RETURN IOR[CoreProc._getTID()];
  82. (*%E *)
  83. (*%F _mthread *)
  84. RETURN IOR;
  85. (*%E *)
  86. END IOresult;
  87. (*%T _OS2 *)
  88. (*%T _mthread *)
  89. PROCEDURE StreamLock(F: FileInf);
  90. VAR
  91. ThisThread: SHORTCARD;
  92. BEGIN
  93. ThisThread := SHORTCARD(CoreProc._getTID());
  94. IF F^.Ctrl # ThisThread THEN
  95. IF Dos.SemRequest(ADR(F^.Sem), -1) # 0 THEN ErrorCheck(18H, 0, 'StreamLock : ', Lib.NilStr) END;
  96. F^.Ctrl := ThisThread;
  97. END;
  98. INC(F^.SCnt);
  99. END StreamLock;
  100. PROCEDURE StreamUnlock(F: FileInf);
  101. BEGIN
  102. DEC(F^.SCnt);
  103. IF F^.SCnt = 0 THEN
  104. IF Dos.SemClear(ADR(F^.Sem)) # 0 THEN ErrorCheck(19H, 0, 'StreamUnlock : ', Lib.NilStr) END;
  105. F^.Ctrl := 0;
  106. END;
  107. END StreamUnlock;
  108. (*%E *)
  109. (*%E *)
  110. PROCEDURE FlsBuf(F: FileInf): INTEGER;
  111. VAR
  112. Wnum : CARDINAL;
  113. nr,sr : INTEGER;
  114. Pos : LONGINT;
  115. zbuf : ARRAY [0..127] OF CHAR;
  116. BEGIN
  117. WITH F^ DO
  118. IF (Flag = {}) OR ((Flag * (CoreIO._F_ERR + CoreIO._F_EOF + CoreIO._F_IN)) # {}) THEN
  119. RETURN -1;
  120. END; (*IF*)
  121. IF (Flag >= CoreIO._F_RST) THEN (* set up reset buffer for output *)
  122. Flag := Flag - CoreIO._F_RST;
  123. Flag := Flag + CoreIO._F_OUT;
  124. Cnt := Size;
  125. Ptr := Base;
  126. RETURN 1; (* return - buffer wasn't full *)
  127. END; (*IF*)
  128. IF Cnt < 0 THEN
  129. Cnt := 0;
  130. END; (*IF*)
  131. Wnum := Size - Cnt;
  132. IF Wnum = 0 THEN
  133. RETURN 0;
  134. END; (*IF*)
  135. IF (Flag >= CoreIO._F_APP) THEN
  136. Pos := CoreIO.lseek(Handle,-128,CoreIO.SEEK_END); (* append *)
  137. IF Pos < 0 THEN
  138. CoreIO.lseek(Handle,0,CoreIO.SEEK_SET);
  139. END; (*IF*)
  140. nr := CoreIO._read(Handle,ADR(zbuf),128);
  141. sr := nr;
  142. IF nr = -1 THEN
  143. RETURN -1;
  144. END; (*IF*)
  145. REPEAT
  146. DEC(sr);
  147. UNTIL (sr < 0) OR (zbuf[sr] # 26C);
  148. Pos := LONGINT(sr) - LONGINT(nr) + 1;
  149. CoreIO.lseek(Handle,Pos,CoreIO.SEEK_END); (* append after first cltZ *)
  150. END; (*IF*)
  151. IF CoreIO._write(Handle,Base,Wnum) # INTEGER(Wnum) THEN
  152. Flag := Flag + CoreIO._F_ERR;
  153. Cnt := 0;
  154. RETURN -1;
  155. END; (*IF*)
  156. Cnt := Size; (* set buffer pointers *)
  157. Ptr := Base;
  158. Flag := Flag + CoreIO._F_OUT; (* set output flag *)
  159. RETURN Wnum;
  160. END; (*WITH*)
  161. END FlsBuf;
  162. PROCEDURE FilBuf(F: FileInf): INTEGER;
  163. VAR
  164. NumRead: INTEGER;
  165. BEGIN
  166. WITH F^ DO
  167. IF (Flag = {}) OR ((Flag * (CoreIO._F_ERR + CoreIO._F_OUT)) # {}) THEN
  168. RETURN -1;
  169. END;
  170. IF (Flag >= CoreIO._F_EOF) THEN
  171. RETURN 0;
  172. END;
  173. IF (Flag >= CoreIO._F_RST) THEN
  174. Flag := Flag - CoreIO._F_RST;
  175. END;
  176. NumRead := CoreIO._read(Handle, Base, Size);
  177. Ptr := Base;
  178. IF (NumRead = -1) AND (NumRead # Size) THEN
  179. Flag := Flag + CoreIO._F_ERR;
  180. Cnt := 0;
  181. RETURN -1;
  182. END;
  183. Cnt := NumRead; (* reset pointers *)
  184. Flag := Flag + CoreIO._F_IN; (* set input flag *)
  185. IF NumRead = 0 THEN
  186. Flag := Flag + CoreIO._F_EOF; (* end of file *)
  187. (*%T _mthread *)
  188. SetThreadEOF(TRUE);
  189. (*%E *)
  190. EOF := TRUE;
  191. RETURN 0;
  192. END;
  193. RETURN NumRead;
  194. END;
  195. END FilBuf;
  196. PROCEDURE WrBin(F:File;Buf:ARRAY OF BYTE;Count:CARDINAL);
  197. VAR
  198. NumWrit : INTEGER;
  199. NumToWrite : INTEGER;
  200. NumLeft : CARDINAL;
  201. ST : POINTER TO CoreFile.CStream;
  202. Buffer : CoreFile.StreamPtr;
  203. BEGIN
  204. (*%T _mthread *)
  205. SetIOR(0);
  206. SetThreadOK(TRUE);
  207. (*%E *)
  208. (*%F _mthread *)
  209. IOR := 0;
  210. (*%E *)
  211. OK := TRUE;
  212. NumWrit := 0;
  213. IF Count # 0 THEN
  214. IF (F <= CoreFile._open_max) & (CoreFile.BufInf[F] # NIL) THEN
  215. WITH CoreFile.BufInf[F]^ DO
  216. IF (Flag = {}) OR ((Flag * (CoreIO._F_ERR + CoreIO._F_EOF)) # {}) THEN
  217. ErrorCheck(6, CoreIO.EBADF, 'WrBin : ', Lib.NilStr);
  218. (*%T _mthread *)
  219. SetThreadOK(FALSE);
  220. (*%E *)
  221. OK := FALSE;
  222. RETURN;
  223. END; (*IF*)
  224. IF ((Flag * CoreIO._F_WRIT) = {}) OR (Flag >= CoreIO._F_IN) THEN
  225. Flag := Flag + CoreIO._F_ERR;
  226. ErrorCheck(6, CoreIO.EACCES, 'WrBin : ', Lib.NilStr);
  227. (*%T _mthread *)
  228. SetThreadOK(FALSE);
  229. (*%E *)
  230. OK := FALSE;
  231. RETURN;
  232. END;
  233. (*%T _mthread *)
  234. (*%F _OS2 *)
  235. Process.Lock();
  236. (*%E *)
  237. (*%T _OS2 *)
  238. StreamLock(CoreFile.BufInf[F]);
  239. (*%E *)
  240. (*%E *)
  241. Flag := Flag + CoreIO._F_OUT;
  242. IF Flag * CoreIO._F_RST # {} THEN
  243. IF FlsBuf(CoreFile.BufInf[F]) <= 0 THEN
  244. ErrorCheck(6, 0, 'WrBin : ', Lib.NilStr);
  245. (*%T _mthread *)
  246. SetThreadOK(FALSE);
  247. (*%E *)
  248. OK := FALSE;
  249. (*%T _mthread *)
  250. (*%F _OS2 *)
  251. Process.Unlock();
  252. (*%E *)
  253. (*%T _OS2 *)
  254. StreamUnlock(CoreFile.BufInf[F]);
  255. (*%E *)
  256. (*%E *)
  257. RETURN;
  258. END; (*IF*)
  259. END; (*IF*)
  260. NumLeft := Count;
  261. Buffer := CoreFile.StreamPtr(ADR(Buf));
  262. LOOP
  263. IF(CARDINAL(Cnt) >= NumLeft) THEN (* write entire item *)
  264. NumToWrite := INTEGER(NumLeft);
  265. ELSE
  266. NumToWrite := Cnt; (* write entire buffer *)
  267. END; (*IF*)
  268. IF NumToWrite > 0 THEN
  269. Lib.Move(Buffer,Ptr,NumToWrite);
  270. DEC(Cnt,NumToWrite);
  271. INC(CARDINAL(Buffer),NumToWrite);
  272. INC(CARDINAL(Ptr),NumToWrite);
  273. DEC(NumLeft,CARDINAL(NumToWrite));
  274. INC(NumWrit,NumToWrite);
  275. END; (*IF*)
  276. IF (Cnt = 0) & (FlsBuf(CoreFile.BufInf[F]) <= 0) THEN (* flush full buffer *)
  277. EXIT; (* error or EOF *)
  278. END; (*IF*)
  279. IF NumLeft = 0 THEN
  280. EXIT;
  281. END; (*IF*)
  282. END; (*LOOP*)
  283. IF (Flag >= CoreIO._F_LBUF) & (FlsBuf(CoreFile.BufInf[F]) < 0) THEN
  284. ErrorCheck(6, 0, 'WrBin : ', Lib.NilStr);
  285. (*%T _mthread *)
  286. SetThreadOK(FALSE);
  287. (*%E *)
  288. OK := FALSE;
  289. END; (*IF*)
  290. END; (*WITH*)
  291. (*%T _mthread *)
  292. (*%F _OS2 *)
  293. Process.Unlock();
  294. (*%E *)
  295. (*%T _OS2 *)
  296. StreamUnlock(CoreFile.BufInf[F]);
  297. (*%E *)
  298. (*%E *)
  299. ELSE
  300. (*%T _mthread *)
  301. (*%F _OS2 *)
  302. Process.Lock();
  303. (*%E *)
  304. (*%E *)
  305. IF CoreFile._openfd[F] >= CoreIO.O_APPEND THEN
  306. CoreIO.lseek(F, 0, CoreIO.SEEK_END);
  307. END; (*IF*)
  308. NumWrit := CoreIO._write(F,CoreFile.StreamPtr(ADR(Buf)),Count);
  309. (*%T _mthread *)
  310. (*%F _OS2 *)
  311. Process.Unlock();
  312. (*%E *)
  313. (*%E *)
  314. END; (*IF*)
  315. IF CARDINAL(NumWrit) # Count THEN
  316. ErrorCheck(6, CoreIO.EDISKFUL, 'WrBin : ', Lib.NilStr);
  317. OK := FALSE;
  318. (*%T _mthread *)
  319. SetThreadOK(FALSE);
  320. (*%E *)
  321. END; (*IF*)
  322. END; (*IF*)
  323. END WrBin;
  324. PROCEDURE Flush(F: File);
  325. VAR
  326. ret: INTEGER;
  327. BEGIN
  328. (*%T _mthread *)
  329. SetIOR(0);
  330. (*%E *)
  331. (*%F _mthread *)
  332. IOR := 0;
  333. (*%E *)
  334. IF (F > CoreFile._open_max) OR (CoreFile.BufInf[F] = NIL) THEN RETURN END;
  335. WITH CoreFile.BufInf[F]^ DO
  336. IF (Flag = {}) OR ((Flag * (CoreIO._F_ERR + CoreIO._F_EOF)) # {}) THEN
  337. RETURN;
  338. END;
  339. (*%T _mthread *)
  340. (*%F _OS2 *)
  341. Process.Lock();
  342. (*%E *)
  343. (*%T _OS2 *)
  344. StreamLock(CoreFile.BufInf[F]);
  345. (*%E *)
  346. (*%E *)
  347. IF (Flag >= CoreIO._F_OUT) THEN
  348. ret :=FlsBuf(CoreFile.BufInf[F]); (* flush output buffer *)
  349. IF ret < 0 THEN
  350. ErrorCheck(8, 0, 'Flush : ', Lib.NilStr);
  351. END;
  352. ELSIF (Flag * CoreIO._F_DEV = {}) THEN
  353. Seek(F, GetPos(F));
  354. END;
  355. WITH CoreFile.BufInf[F]^ DO
  356. Pback := 0; (* reset buffer *)
  357. Cnt := 0;
  358. Flag := Flag + CoreIO._F_RST;
  359. Flag := Flag - (CoreIO._F_OUT + CoreIO._F_IN);
  360. END;
  361. (*%T _mthread *)
  362. (*%F _OS2 *)
  363. Process.Unlock();
  364. (*%E *)
  365. (*%T _OS2 *)
  366. StreamUnlock(CoreFile.BufInf[F]);
  367. (*%E *)
  368. (*%E *)
  369. END;
  370. RETURN;
  371. END Flush;
  372. (*%F _OS2 *)
  373. PROCEDURE Truncate(F: File);
  374. BEGIN
  375. (*%T _mthread *)
  376. SetIOR(0);
  377. (*%E *)
  378. (*%F _mthread *)
  379. IOR := 0;
  380. (*%E *)
  381. (*%T _mthread *)
  382. Process.Lock();
  383. (*%E *)
  384. Flush( F );
  385. IF CoreIO._write(F, NIL, 0) = -1 THEN
  386. ErrorCheck(0CH, 0, 'Truncate : ', Lib.NilStr);
  387. END;
  388. (*%T _mthread *)
  389. Process.Unlock();
  390. (*%E *)
  391. END Truncate;
  392. (*%E *)
  393. (*%T _OS2 *)
  394. PROCEDURE Truncate(F: File);
  395. VAR IOR, r : CARDINAL; l : LONGCARD;
  396. BEGIN
  397. Flush(F);
  398. IOR := Dos.ChgFilePtr(F,0,1,l);
  399. IF IOR = 0 THEN IOR := Dos.NewSize(F,l) END;
  400. IF IOR # 0 THEN ErrorCheck(0CH, IOR, 'Truncate : ', Lib.NilStr) END;
  401. END Truncate;
  402. (*%E *)
  403. PROCEDURE RdBin(F: File; VAR Buf: ARRAY OF BYTE; Count: CARDINAL) : CARDINAL;
  404. VAR
  405. NumRead : CARDINAL;
  406. NumToRead : CARDINAL;
  407. NumLeft : LONGCARD;
  408. Buffer : CoreFile.StreamPtr;
  409. Res : INTEGER;
  410. BEGIN
  411. (*%T _mthread *)
  412. SetIOR(0);
  413. (*%E *)
  414. (*%F _mthread *)
  415. IOR := 0;
  416. (*%E *)
  417. OK := TRUE;
  418. (*%T _mthread *)
  419. SetThreadOK(TRUE);
  420. SetThreadEOF(FALSE);
  421. (*%E *)
  422. EOF := FALSE;
  423. Res := 0;
  424. NumRead := 0;
  425. IF Count = 0 THEN RETURN 0 END;
  426. IF (F <= CoreFile._open_max) AND (CoreFile.BufInf[F] # NIL) THEN
  427. WITH CoreFile.BufInf[F]^ DO
  428. IF (Flag = {}) OR ((Flag * (CoreIO._F_ERR + CoreIO._F_EOF)) # {}) THEN
  429. ErrorCheck(7, CoreIO.EBADF, 'RdBin : ', Lib.NilStr);
  430. OK := FALSE;
  431. (*%T _mthread *)
  432. SetThreadOK(FALSE);
  433. (*%E *)
  434. RETURN MAX(CARDINAL);
  435. END;
  436. IF (Flag >= CoreIO._F_OUT) OR ((Flag * CoreIO._F_READ) = {} ) THEN
  437. Flag := Flag + CoreIO._F_ERR;
  438. ErrorCheck(7, CoreIO.EACCES, 'RdBin : ', Lib.NilStr);
  439. OK := FALSE;
  440. (*%T _mthread *)
  441. SetThreadOK(FALSE);
  442. (*%E *)
  443. RETURN MAX(CARDINAL);
  444. END;
  445. (*%T _mthread *)
  446. (*%F _OS2 *)
  447. Process.Lock();
  448. (*%E *)
  449. (*%T _OS2 *)
  450. StreamLock(CoreFile.BufInf[F]);
  451. (*%E *)
  452. (*%E *)
  453. Flag := Flag + CoreIO._F_IN;
  454. NumLeft := LONGCARD(Count);
  455. NumRead := 0;
  456. Buffer := CoreFile.StreamPtr(ADR(Buf));
  457. LOOP
  458. IF Cnt = 0 THEN (* fill empty buffer *)
  459. Res := FilBuf(CoreFile.BufInf[F]);
  460. IF (INTEGER(Res) = -1)OR(Res = 0) THEN
  461. EXIT; (* error or EOF *)
  462. END;
  463. END;
  464. IF(LONGCARD(Cnt) >= NumLeft) THEN (* read entire item *)
  465. NumToRead := CARDINAL(NumLeft);
  466. ELSE
  467. NumToRead := Cnt; (* read entire buffer *)
  468. END;
  469. Lib.Move(Ptr, Buffer, NumToRead);
  470. DEC(Cnt,NumToRead);
  471. INC(CARDINAL(Buffer), NumToRead);
  472. INC(CARDINAL(Ptr), NumToRead);
  473. NumLeft := NumLeft - LONGCARD(NumToRead);
  474. INC(NumRead, NumToRead);
  475. IF NumLeft = 0 THEN EXIT END;
  476. END;
  477. END;
  478. (*%T _mthread *)
  479. (*%F _OS2 *)
  480. Process.Unlock();
  481. (*%E *)
  482. (*%T _OS2 *)
  483. StreamUnlock(CoreFile.BufInf[F]);
  484. (*%E *)
  485. (*%E *)
  486. ELSE
  487. (*%T _mthread *)
  488. (*%F _OS2 *)
  489. Process.Lock();
  490. (*%E *)
  491. (*%E *)
  492. NumRead := CoreIO._read(F, CoreFile.StreamPtr(ADR(Buf)), Count);
  493. IF NumRead=MAX(CARDINAL) THEN Res := -1 END;
  494. (*%T _mthread *)
  495. (*%F _OS2 *)
  496. Process.Unlock();
  497. (*%E *)
  498. (*%E *)
  499. END;
  500. IF NumRead # Count THEN
  501. (*%T _mthread *)
  502. SetThreadOK(FALSE);
  503. (*%E *)
  504. OK := FALSE;
  505. IF Res = -1 THEN
  506. ErrorCheck(7, 0, 'RbBin : ', Lib.NilStr);
  507. NumRead := 0;
  508. ELSE
  509. (*%T _mthread *)
  510. SetThreadEOF(TRUE);
  511. (*%E *)
  512. EOF := TRUE;
  513. END;
  514. END;
  515. RETURN NumRead;
  516. END RdBin;
  517. PROCEDURE WrStr(F: File; Buf: ARRAY OF CHAR);
  518. BEGIN
  519. WrBin( F,Buf,Str.Length( Buf ) );
  520. END WrStr;
  521. PROCEDURE WrLn(F: File);
  522. TYPE a = ARRAY [ 0..1 ] OF CHAR;
  523. BEGIN
  524. WrBin( F, a( CHR( 13 ),CHR( 10 ) ), 2 )
  525. END WrLn;
  526. PROCEDURE RdChar(F: File ) : CHAR;
  527. VAR c : CHAR;
  528. BEGIN
  529. (*%T _mthread *)
  530. SetIOR(0);
  531. (*%E *)
  532. (*%F _mthread *)
  533. IOR := 0;
  534. (*%E *)
  535. OK := TRUE;
  536. (*%T _mthread *)
  537. SetThreadOK(TRUE);
  538. (*%E *)
  539. IF (F <= CoreFile._open_max) AND (CoreFile.BufInf[F] # NIL) THEN
  540. (*%T _mthread *)
  541. (*%F _OS2 *)
  542. Process.Lock();
  543. (*%E *)
  544. (*%T _OS2 *)
  545. StreamLock(CoreFile.BufInf[F]);
  546. (*%E *)
  547. (*%E *)
  548. WITH CoreFile.BufInf[F]^ DO
  549. DEC(Cnt);
  550. IF Cnt < 0 THEN
  551. IF FilBuf(CoreFile.BufInf[F]) <= 0 THEN;
  552. (*%T _mthread *)
  553. SetThreadEOF((Flag >= CoreIO._F_EOF));
  554. (*%E *)
  555. EOF := (Flag >= CoreIO._F_EOF);
  556. (*%T _mthread *)
  557. SetThreadOK(FALSE);
  558. (*%E *)
  559. OK := FALSE;
  560. (*%T _mthread *)
  561. (*%F _OS2 *)
  562. Process.Unlock();
  563. (*%E *)
  564. (*%T _OS2 *)
  565. StreamUnlock(CoreFile.BufInf[F]);
  566. (*%E *)
  567. (*%E *)
  568. RETURN CHR(26);
  569. END;
  570. DEC(Cnt);
  571. END;
  572. c := Ptr^;
  573. INC(CARDINAL(Ptr), 1);
  574. (*%T _mthread *)
  575. SetThreadEOF((Flag >= CoreIO._F_EOF) OR (c = CHR(26)));
  576. (*%E *)
  577. EOF := ((Flag >= CoreIO._F_EOF) OR (c = CHR(26)));
  578. (*%T _mthread *)
  579. (*%F _OS2 *)
  580. Process.Unlock();
  581. (*%E *)
  582. (*%T _OS2 *)
  583. StreamUnlock(CoreFile.BufInf[F]);
  584. (*%E *)
  585. (*%E *)
  586. RETURN c;
  587. END;
  588. END;
  589. (*%T _mthread *)
  590. (*%F _OS2 *)
  591. Process.Lock();
  592. (*%E *)
  593. (*%E *)
  594. IF CoreIO._read(F, CoreFile.StreamPtr(ADR(c)), 1) <= 0 THEN
  595. OK := FALSE;
  596. (*%T _mthread *)
  597. SetThreadOK(FALSE);
  598. (*%E *)
  599. c := CHR(26);
  600. END;
  601. (*%T _mthread *)
  602. SetThreadEOF((c = CHR(26)));
  603. (*%E *)
  604. EOF := (c = CHR(26));
  605. (*%T _mthread *)
  606. (*%F _OS2 *)
  607. Process.Unlock();
  608. (*%E *)
  609. (*%E *)
  610. RETURN c;
  611. END RdChar;
  612. PROCEDURE RdStr(F: File; VAR Buf: ARRAY OF CHAR);
  613. VAR
  614. i,h : CARDINAL;
  615. c : CHAR;
  616. BEGIN
  617. i := 0;
  618. h := HIGH( Buf );
  619. (*%T _mthread *)
  620. SetThreadOK(TRUE);
  621. (*%E *)
  622. OK := TRUE;
  623. LOOP
  624. IF i > h THEN RETURN END;
  625. c := RdChar( F );
  626. IF c = CHR( 26 ) THEN
  627. Buf[ i ] := CHR(0);
  628. (*%T _mthread *)
  629. SetThreadEOF((i = 0));
  630. (*%E *)
  631. EOF := (i = 0);
  632. RETURN;
  633. ELSIF c = EOL THEN
  634. Buf[ i ] := CHR(0);
  635. RETURN;
  636. ELSIF (c # CHR( 10 )) AND (c # CHR( 13 )) THEN
  637. Buf[ i ] := c;
  638. INC( i );
  639. END;
  640. END;
  641. END RdStr;
  642. PROCEDURE RdItem( F : File; VAR S : ARRAY OF CHAR );
  643. VAR c : CHAR; i,L : CARDINAL;
  644. BEGIN
  645. i := 0;
  646. LOOP
  647. c := RdChar( F );
  648. IF NOT (*%T _mthread *) ThreadOK() (*%E *) (*%F _mthread *) OK (*%E *)
  649. OR NOT (c IN Separators) THEN EXIT; END;
  650. END;
  651. L := HIGH( S );
  652. LOOP
  653. IF NOT (*%T _mthread *) ThreadOK() (*%E *) (*%F _mthread *) OK (*%E *)
  654. OR ( c IN Separators ) THEN EXIT; END;
  655. S[i] := c;
  656. INC( i );
  657. IF i > L THEN
  658. EXIT;
  659. ELSE
  660. c := RdChar( F );
  661. IF c = CHR(26) THEN
  662. (*%T _mthread *)
  663. SetThreadOK(TRUE);
  664. (*%E *)
  665. OK := TRUE;
  666. EXIT;
  667. ELSIF c = CHR(13) THEN
  668. c := RdChar(F);
  669. EXIT;
  670. END;
  671. END;
  672. END;
  673. IF i <= L THEN S[i] := 0C; END;
  674. END RdItem;
  675. (*# save,
  676. call(o_a_copy => on) *)
  677. PROCEDURE WrStrAdj(F: File; S: ARRAY OF CHAR; Length: INTEGER);
  678. VAR
  679. L : CARDINAL;
  680. a : INTEGER;
  681. BEGIN
  682. (*%T _mthread *)
  683. SetThreadOK(TRUE);
  684. (*%E *)
  685. OK := TRUE;
  686. L := Str.Length( S );
  687. a := ABS( Length ) - INTEGER( L );
  688. IF (a < 0) AND ChopOff THEN
  689. L := CARDINAL(ABS(Length));
  690. IF L>HIGH(S) THEN
  691. L := HIGH(S)+1;
  692. ELSE
  693. S[L] := CHR(0);
  694. END;
  695. WHILE (L>0) DO DEC(L) ; S[L] := '?'; END;
  696. (*%T _mthread *)
  697. SetThreadOK(FALSE);
  698. (*%E *)
  699. OK := FALSE;
  700. a := 0;
  701. END;
  702. IF (Length > 0) AND (a > 0) THEN WrCharRep( F, PrefixChar, a ); END;
  703. WrStr( F,S );
  704. IF (Length < 0) AND (a > 0) THEN WrCharRep( F, SuffixChar, a ); END;
  705. END WrStrAdj;
  706. (*# restore *)
  707. PROCEDURE WrChar(F: File; V: CHAR);
  708. BEGIN
  709. (*%T _mthread *)
  710. SetThreadOK(TRUE);
  711. (*%E *)
  712. OK := TRUE;
  713. IF (F <= CoreFile._open_max) AND (CoreFile.BufInf[F] # NIL) THEN
  714. (*%T _mthread *)
  715. (*%F _OS2 *)
  716. Process.Lock();
  717. (*%E *)
  718. (*%T _OS2 *)
  719. StreamLock(CoreFile.BufInf[F]);
  720. (*%E *)
  721. (*%E *)
  722. WITH CoreFile.BufInf[F]^ DO
  723. DEC(Cnt);
  724. IF Cnt < 0 THEN
  725. IF FlsBuf(CoreFile.BufInf[F]) <= 0 THEN
  726. (*%T _mthread *)
  727. SetThreadOK(FALSE);
  728. (*%E *)
  729. OK := FALSE;
  730. (*%T _mthread *)
  731. (*%F _OS2 *)
  732. Process.Unlock();
  733. (*%E *)
  734. (*%T _OS2 *)
  735. StreamUnlock(CoreFile.BufInf[F]);
  736. (*%E *)
  737. (*%E *)
  738. RETURN;
  739. END;
  740. DEC(Cnt);
  741. END;
  742. Ptr^ := V;
  743. INC(CARDINAL(Ptr), 1);
  744. RETURN;
  745. END;
  746. END;
  747. (*%T _mthread *)
  748. (*%F _OS2 *)
  749. Process.Lock();
  750. (*%E *)
  751. (*%E *)
  752. IF CoreIO._write(F, CoreFile.StreamPtr(ADR(V)), 1) = 0 THEN
  753. (*%T _mthread *)
  754. SetThreadOK(FALSE);
  755. (*%E *)
  756. OK := FALSE;
  757. END;
  758. (*%T _mthread *)
  759. (*%F _OS2 *)
  760. Process.Unlock();
  761. (*%E *)
  762. (*%E *)
  763. RETURN;
  764. END WrChar;
  765. PROCEDURE WrCharRep(F: File; V: CHAR ; Count: CARDINAL);
  766. VAR
  767. S : Str80;
  768. i,j : CARDINAL;
  769. BEGIN
  770. WHILE Count>0 DO
  771. i := SIZE(S);
  772. IF i > Count THEN i := Count END;
  773. DEC(Count,i);
  774. FOR j := 0 TO i-1 DO S[j] := V END;
  775. WrBin( F,S,i );
  776. IF NOT (*%T _mthread *) ThreadOK() (*%E *) (*%F _mthread *) OK (*%E *) THEN RETURN END ;
  777. END;
  778. END WrCharRep;
  779. PROCEDURE WrBool(F: File; V: BOOLEAN; Length: INTEGER);
  780. BEGIN
  781. IF V THEN
  782. WrStrAdj( F,TrueStr,Length );
  783. ELSE
  784. WrStrAdj( F,'FALSE',Length );
  785. END;
  786. END WrBool;
  787. PROCEDURE WrShtInt(F: File; V: SHORTINT; Length: INTEGER);
  788. VAR
  789. S : Str80;
  790. b : BOOLEAN;
  791. BEGIN
  792. Str.IntToStr( LONGINT(V),S,10,b);
  793. (*%T _mthread *)
  794. SetThreadOK(b);
  795. (*%E *)
  796. IF b THEN
  797. WrStrAdj(F,S,Length );
  798. END;
  799. OK := b;
  800. END WrShtInt;
  801. PROCEDURE WrInt(F: File; V: INTEGER; Length: INTEGER);
  802. VAR
  803. S : Str80;
  804. b : BOOLEAN;
  805. BEGIN
  806. Str.IntToStr( LONGINT(V),S,10,b);
  807. (*%T _mthread *)
  808. SetThreadOK(b);
  809. (*%E *)
  810. IF b THEN
  811. WrStrAdj(F,S,Length );
  812. END;
  813. OK := b;
  814. END WrInt;
  815. PROCEDURE WrLngInt(F: File; V: LONGINT; Length: INTEGER);
  816. VAR
  817. S : Str80;
  818. b : BOOLEAN;
  819. BEGIN
  820. Str.IntToStr( V,S,10,b);
  821. (*%T _mthread *)
  822. SetThreadOK(b);
  823. (*%E *)
  824. IF b THEN
  825. WrStrAdj(F,S,Length );
  826. END;
  827. OK := b;
  828. END WrLngInt;
  829. PROCEDURE WrShtCard(F: File; V: SHORTCARD; Length: INTEGER);
  830. VAR S : Str80;
  831. b : BOOLEAN;
  832. BEGIN
  833. Str.CardToStr(LONGCARD(V),S,10,b);
  834. (*%T _mthread *)
  835. SetThreadOK(b);
  836. (*%E *)
  837. IF b THEN
  838. WrStrAdj(F,S,Length );
  839. END;
  840. OK := b;
  841. END WrShtCard;
  842. PROCEDURE WrCard(F: File; V: CARDINAL; Length: INTEGER);
  843. VAR
  844. S : Str80;
  845. b : BOOLEAN;
  846. BEGIN
  847. Str.CardToStr(LONGCARD(V),S,10,b);
  848. (*%T _mthread *)
  849. SetThreadOK(b);
  850. (*%E *)
  851. IF b THEN
  852. WrStrAdj(F,S,Length );
  853. END;
  854. OK := b;
  855. END WrCard;
  856. PROCEDURE WrLngCard(F: File; V: LONGCARD; Length: INTEGER);
  857. VAR
  858. S : Str80;
  859. b : BOOLEAN;
  860. BEGIN
  861. Str.CardToStr(V,S,10,b);
  862. (*%T _mthread *)
  863. SetThreadOK(b);
  864. (*%E *)
  865. IF b THEN
  866. WrStrAdj(F,S,Length );
  867. END;
  868. OK := b;
  869. END WrLngCard;
  870. PROCEDURE WrShtHex(F: File; V: SHORTCARD; Length: INTEGER);
  871. VAR
  872. S : Str80;
  873. b : BOOLEAN;
  874. BEGIN
  875. Str.CardToStr(LONGCARD(V),S,16,b);
  876. (*%T _mthread *)
  877. SetThreadOK(b);
  878. (*%E *)
  879. IF b THEN
  880. WrStrAdj(F,S,Length );
  881. END;
  882. OK := b;
  883. END WrShtHex;
  884. PROCEDURE WrHex(F: File; V: CARDINAL; Length: INTEGER);
  885. VAR
  886. S : Str80;
  887. b : BOOLEAN;
  888. BEGIN
  889. Str.CardToStr(LONGCARD(V),S,16,b);
  890. (*%T _mthread *)
  891. SetThreadOK(b);
  892. (*%E *)
  893. IF b THEN
  894. WrStrAdj(F,S,Length );
  895. END;
  896. OK := b;
  897. END WrHex;
  898. PROCEDURE WrLngHex(F: File; V: LONGCARD; Length: INTEGER);
  899. VAR S : Str80;
  900. b : BOOLEAN;
  901. BEGIN
  902. Str.CardToStr(V,S,16,b);
  903. (*%T _mthread *)
  904. SetThreadOK(b);
  905. (*%E *)
  906. IF b THEN
  907. WrStrAdj(F,S,Length );
  908. END;
  909. OK := b;
  910. END WrLngHex;
  911. PROCEDURE WrReal(F: File; V: REAL; Precision: CARDINAL; Length: INTEGER);
  912. VAR
  913. S : Str80;
  914. b : BOOLEAN;
  915. BEGIN
  916. Str.RealToStr( LONGREAL ( V ),Precision,Eng,S,b);
  917. (*%T _mthread *)
  918. SetThreadOK(b);
  919. (*%E *)
  920. IF b THEN
  921. WrStrAdj(F,S,Length );
  922. END;
  923. OK := b;
  924. END WrReal;
  925. PROCEDURE WrFixReal(F: File; V: REAL; Precision: CARDINAL; Length: INTEGER);
  926. VAR
  927. S : Str80;
  928. b : BOOLEAN;
  929. BEGIN
  930. Str.FixRealToStr( LONGREAL ( V ),Precision,S,b );
  931. (*%T _mthread *)
  932. SetThreadOK(b);
  933. (*%E *)
  934. IF b THEN
  935. WrStrAdj(F,S,Length );
  936. END;
  937. OK := b;
  938. END WrFixReal;
  939. PROCEDURE WrLngReal(F: File; V : LONGREAL; Precision: CARDINAL; Length: INTEGER);
  940. VAR
  941. S : Str80;
  942. b : BOOLEAN;
  943. BEGIN
  944. Str.RealToStr( V,Precision,Eng,S,b);
  945. (*%T _mthread *)
  946. SetThreadOK(b);
  947. (*%E *)
  948. IF b THEN
  949. WrStrAdj(F,S,Length );
  950. END;
  951. OK := b;
  952. END WrLngReal;
  953. PROCEDURE WrFixLngReal(F: File; V: LONGREAL; Precision: CARDINAL; Length: INTEGER);
  954. VAR
  955. S : Str80;
  956. b : BOOLEAN;
  957. BEGIN
  958. Str.FixRealToStr(V,Precision,S,b );
  959. (*%T _mthread *)
  960. SetThreadOK(b);
  961. (*%E *)
  962. IF b THEN
  963. WrStrAdj(F,S,Length );
  964. END;
  965. OK := b;
  966. END WrFixLngReal;
  967. PROCEDURE RdBool(F: File): BOOLEAN;
  968. VAR s : Str80;
  969. BEGIN
  970. RdItem( F,s );
  971. RETURN Str.Compare( s,TrueStr )=0;
  972. END RdBool;
  973. PROCEDURE RdShtInt(F: File) : SHORTINT;
  974. VAR
  975. S : Str80;
  976. i : LONGINT;
  977. b : BOOLEAN;
  978. BEGIN
  979. RdItem(F,S );
  980. i := Str.StrToInt( S,10,b );
  981. (*%T _mthread *)
  982. SetThreadOK(b AND (i >= -80H) AND (i < 80H));
  983. (*%E *)
  984. OK := b AND (i >= -80H) AND (i < 80H);
  985. RETURN SHORTINT( i );
  986. END RdShtInt;
  987. PROCEDURE RdInt(F: File) : INTEGER;
  988. VAR
  989. S : Str80;
  990. i : LONGINT;
  991. b : BOOLEAN;
  992. BEGIN
  993. RdItem(F,S);
  994. i := Str.StrToInt( S,10,b );
  995. (*%T _mthread *)
  996. SetThreadOK(b AND (i >= -8000H) AND (i < 8000H));
  997. (*%E *)
  998. OK := b AND (i >= -8000H) AND (i < 8000H);
  999. RETURN INTEGER(i);
  1000. END RdInt;
  1001. PROCEDURE RdLngInt(F: File) : LONGINT;
  1002. VAR
  1003. S : Str80;
  1004. i : LONGINT;
  1005. b : BOOLEAN;
  1006. BEGIN
  1007. RdItem(F,S);
  1008. i := Str.StrToInt( S,10,b );
  1009. (*%T _mthread *)
  1010. SetThreadOK(b);
  1011. (*%E *)
  1012. OK := b;
  1013. RETURN i;
  1014. END RdLngInt;
  1015. PROCEDURE RdShtCard(F: File) : SHORTCARD;
  1016. VAR
  1017. S : Str80;
  1018. i : LONGCARD;
  1019. b : BOOLEAN;
  1020. BEGIN
  1021. RdItem(F,S);
  1022. i := Str.StrToCard( S,10,b );
  1023. (*%T _mthread *)
  1024. SetThreadOK(b AND (i < 100H));
  1025. (*%E *)
  1026. OK := b AND (i < 100H);
  1027. RETURN SHORTCARD( i );
  1028. END RdShtCard;
  1029. PROCEDURE RdShtHex(F: File) : SHORTCARD;
  1030. VAR
  1031. S : Str80;
  1032. i : LONGCARD;
  1033. b : BOOLEAN;
  1034. BEGIN
  1035. RdItem(F,S);
  1036. i := Str.StrToCard( S,16,b );
  1037. (*%T _mthread *)
  1038. SetThreadOK(b AND (i < 100H));
  1039. (*%E *)
  1040. OK := b AND (i < 100H);
  1041. RETURN SHORTCARD( i );
  1042. END RdShtHex;
  1043. PROCEDURE RdCard(F: File) : CARDINAL;
  1044. VAR
  1045. S : Str80;
  1046. i : LONGCARD;
  1047. b : BOOLEAN;
  1048. BEGIN
  1049. RdItem(F,S);
  1050. i := Str.StrToCard( S,10,b );
  1051. (*%T _mthread *)
  1052. SetThreadOK(b AND (i < 10000H));
  1053. (*%E *)
  1054. OK := b AND (i < 10000H);
  1055. RETURN CARDINAL( i );
  1056. END RdCard;
  1057. PROCEDURE RdHex(F: File) : CARDINAL;
  1058. VAR
  1059. S : Str80;
  1060. i : LONGCARD;
  1061. b : BOOLEAN;
  1062. BEGIN
  1063. RdItem(F,S);
  1064. i := Str.StrToCard( S,16,b );
  1065. (*%T _mthread *)
  1066. SetThreadOK(b AND (i < 10000H));
  1067. (*%E *)
  1068. OK := b AND (i < 10000H);
  1069. RETURN CARDINAL( i );
  1070. END RdHex;
  1071. PROCEDURE RdLngCard(F: File) : LONGCARD;
  1072. VAR
  1073. S : Str80;
  1074. i : LONGCARD;
  1075. b : BOOLEAN;
  1076. BEGIN
  1077. RdItem(F,S);
  1078. i := Str.StrToCard( S,10,b );
  1079. (*%T _mthread *)
  1080. SetThreadOK(b);
  1081. (*%E *)
  1082. OK := b;
  1083. RETURN i;
  1084. END RdLngCard;
  1085. PROCEDURE RdLngHex(F: File) : LONGCARD;
  1086. VAR
  1087. S : Str80;
  1088. i : LONGCARD;
  1089. b : BOOLEAN;
  1090. BEGIN
  1091. RdItem(F,S);
  1092. i := Str.StrToCard( S,16,b );
  1093. (*%T _mthread *)
  1094. SetThreadOK(b);
  1095. (*%E *)
  1096. OK := b;
  1097. RETURN i;
  1098. END RdLngHex ;
  1099. PROCEDURE RdReal(F: File) : REAL;
  1100. VAR
  1101. S : Str80;
  1102. r : LONGREAL;
  1103. b : BOOLEAN;
  1104. BEGIN
  1105. RdItem(F,S );
  1106. r := Str.StrToReal( S,b);
  1107. (*%T _mthread *)
  1108. SetThreadOK(b AND (ABS(r) <= 3.4E38 ));
  1109. (*%E *)
  1110. OK := b AND (ABS(r) <= 3.4E38 );
  1111. RETURN REAL ( r );
  1112. END RdReal;
  1113. PROCEDURE RdLngReal(F: File) : LONGREAL;
  1114. VAR
  1115. S : Str80;
  1116. r : LONGREAL;
  1117. b : BOOLEAN;
  1118. BEGIN
  1119. RdItem(F,S);
  1120. r := Str.StrToReal( S,b);
  1121. (*%T _mthread *)
  1122. SetThreadOK(b);
  1123. (*%E *)
  1124. OK := b;
  1125. RETURN r;
  1126. END RdLngReal;
  1127. PROCEDURE GetName(name: ARRAY OF CHAR; VAR fn: PathStr);
  1128. (* Makes Null terminated filename, also sets IOR to 0 *)
  1129. BEGIN
  1130. Str.Copy(fn,name);
  1131. fn[HIGH(fn)] := CHR(0);
  1132. (*%T _mthread *)
  1133. SetIOR(0);
  1134. (*%E *)
  1135. (*%F _mthread *)
  1136. IOR := 0;
  1137. (*%E *)
  1138. END GetName;
  1139. PROCEDURE Open(Name: ARRAY OF CHAR) : File;
  1140. VAR
  1141. fn: PathStr;
  1142. H: File;
  1143. BEGIN
  1144. GetName(Name,fn);
  1145. (*%F _OS2 *)
  1146. H := CoreIO._open(fn, CARDINAL(CoreIO.O_RDWR + ShareMode));
  1147. (*%E *)
  1148. (*%T _OS2 *)
  1149. H := CoreIO._os2_open(fn, CARDINAL(CoreIO.O_RDWR + ShareMode), 0, 1);
  1150. (*%E *)
  1151. IF H <> MAX(CARDINAL) THEN
  1152. CoreFile._openfd[H] := (CoreIO.O_RDWR+CoreIO.O_BINARY);
  1153. IF CoreIO.isatty(H) # 0 THEN
  1154. CoreFile._openfd[H] := CoreFile._openfd[H] + CoreIO.O_DEVICE;
  1155. END;
  1156. ELSE
  1157. ErrorCheck(2, 0, 'Open : ', fn);
  1158. END;
  1159. RETURN H;
  1160. END Open;
  1161. PROCEDURE OpenRead( Name: ARRAY OF CHAR) : File;
  1162. VAR
  1163. fn: PathStr;
  1164. H: File;
  1165. BEGIN
  1166. GetName(Name,fn);
  1167. (*%F _OS2 *)
  1168. H := CoreIO._open(fn, CARDINAL(CoreIO.O_RDONLY + ShareMode));
  1169. (*%E *)
  1170. (*%T _OS2 *)
  1171. H := CoreIO._os2_open(fn, CARDINAL(CoreIO.O_RDONLY + ShareMode), 1, 1);
  1172. (*%E *)
  1173. IF H <> MAX(CARDINAL) THEN
  1174. CoreFile._openfd[H] := (CoreIO.O_RDONLY+CoreIO.O_BINARY);
  1175. IF CoreIO.isatty(H) # 0 THEN
  1176. CoreFile._openfd[H] := CoreFile._openfd[H] + CoreIO.O_DEVICE;
  1177. END;
  1178. ELSE
  1179. ErrorCheck(3, 0, 'OpenRead : ', fn);
  1180. END;
  1181. RETURN H;
  1182. END OpenRead;
  1183. (*%F _OS2 *)
  1184. PROCEDURE Exists(Name: ARRAY OF CHAR) : BOOLEAN;
  1185. VAR
  1186. r : SYSTEM.Registers ;
  1187. fn: PathStr;
  1188. BEGIN
  1189. GetName(Name,fn);
  1190. r.AX := 4300H ; (* get file attr *)
  1191. r.DS := Seg(fn);
  1192. r.DX := Ofs(fn);
  1193. Lib.Dos(r);
  1194. RETURN NOT(SYSTEM.CarryFlag IN r.Flags);
  1195. END Exists;
  1196. (*%E *)
  1197. (*%T _OS2 *)
  1198. PROCEDURE Exists(Name: ARRAY OF CHAR) : BOOLEAN;
  1199. VAR a : CARDINAL ;
  1200. fn: PathStr;
  1201. BEGIN
  1202. GetName(Name,fn);
  1203. RETURN Dos.QFileMode(fn,a,0)=0;
  1204. END Exists;
  1205. (*%E *)
  1206. PROCEDURE Append(Name: ARRAY OF CHAR) : File;
  1207. VAR
  1208. fn: PathStr;
  1209. H: File;
  1210. BEGIN
  1211. GetName(Name,fn);
  1212. (*%F _OS2 *)
  1213. H := CoreIO._open(fn, CARDINAL(CoreIO.O_RDWR));
  1214. (*%E *)
  1215. (*%T _OS2 *)
  1216. H := CoreIO._os2_open(fn, CARDINAL(CoreIO.O_RDWR), 0, 1H);
  1217. (*%E *)
  1218. IF H <> MAX(CARDINAL) THEN
  1219. CoreFile._openfd[H] := (CoreIO.O_RDWR+CoreIO.O_BINARY+CoreIO.O_APPEND);
  1220. Seek(H, Size(H));
  1221. IF CoreIO.isatty(H) # 0 THEN
  1222. CoreFile._openfd[H] := CoreFile._openfd[H] + CoreIO.O_DEVICE;
  1223. END;
  1224. ELSE
  1225. ErrorCheck(4, 0, 'Append : ', fn);
  1226. END;
  1227. RETURN H;
  1228. END Append;
  1229. PROCEDURE Create(Name: ARRAY OF CHAR) : File;
  1230. VAR
  1231. fn: PathStr;
  1232. H: File;
  1233. BEGIN
  1234. GetName(Name,fn);
  1235. (*%F _OS2 *)
  1236. H := CoreIO._creat_trunc(fn, 0);
  1237. (*%E *)
  1238. (*%T _OS2 *)
  1239. H := CoreIO._os2_open(fn, CARDINAL(CoreIO.O_RDWR), 0, 12H);
  1240. (*%E *)
  1241. IF H <> MAX(CARDINAL) THEN
  1242. CoreFile._openfd[H] := (CoreIO.O_RDWR+CoreIO.O_BINARY);
  1243. ELSE
  1244. ErrorCheck(5, 0, 'Create : ', Name);
  1245. END;
  1246. RETURN H;
  1247. END Create;
  1248. PROCEDURE Close(F: File);
  1249. VAR
  1250. x : FileInf;
  1251. BEGIN
  1252. (*%T _mthread *)
  1253. SetIOR(0);
  1254. (*%E *)
  1255. (*%F _mthread *)
  1256. IOR := 0;
  1257. (*%E *)
  1258. IF F <= CoreFile._open_max THEN
  1259. IF CoreFile.BufInf[F] # NIL THEN
  1260. (*%T _mthread *)
  1261. (*%F _OS2 *)
  1262. Process.Lock();
  1263. (*%E *)
  1264. (*%T _OS2 *)
  1265. StreamLock(CoreFile.BufInf[F]);
  1266. (*%E *)
  1267. (*%E *)
  1268. Flush( F );
  1269. CoreFile.BufInf[F]^.Flag := {};
  1270. (*%T _mthread *)
  1271. (*%T _OS2 *)
  1272. x := CoreFile.BufInf[F];
  1273. (*%E *)
  1274. (*%E *)
  1275. CoreFile.BufInf[F] := NIL;
  1276. (*%T _mthread *)
  1277. (*%F _OS2 *)
  1278. Process.Unlock();
  1279. (*%E *)
  1280. (*%T _OS2 *)
  1281. StreamUnlock(x);
  1282. (*%E *)
  1283. (*%E *)
  1284. END;
  1285. CoreFile._openfd[F] := {};
  1286. END;
  1287. IF CoreIO._close(F) = -1 THEN
  1288. ErrorCheck(0, 0, 'Close : ', Lib.NilStr);
  1289. END;
  1290. RETURN;
  1291. END Close;
  1292. PROCEDURE GetPos(F: File) : LONGCARD;
  1293. VAR
  1294. Ret, Pos: LONGCARD;
  1295. BEGIN
  1296. (*%T _mthread *)
  1297. SetIOR(0);
  1298. (*%E *)
  1299. (*%F _mthread *)
  1300. IOR := 0;
  1301. (*%E *)
  1302. OK := TRUE;
  1303. (*%T _mthread *)
  1304. OKTable[CoreProc._getTID()] := TRUE;
  1305. (*%E *)
  1306. (*%T _mthread *)
  1307. (*%F _OS2 *)
  1308. Process.Lock();
  1309. (*%E *)
  1310. (*%E *)
  1311. IF (F > CoreFile._open_max) OR (CoreFile.BufInf[F] = NIL) OR (CoreFile.BufInf[F]^.Flag >= CoreIO._F_RST) THEN
  1312. Ret := CoreIO.tell(F);
  1313. ELSE
  1314. (*%T _mthread *)
  1315. (*%T _OS2 *)
  1316. StreamLock(CoreFile.BufInf[F]);
  1317. (*%E *)
  1318. (*%E *)
  1319. IF ( CoreFile.BufInf[F]^.Flag = {}) OR (CoreFile.BufInf[F]^.Flag >= CoreIO._F_ERR) THEN
  1320. ErrorCheck(9, CoreIO.EBADF, 'GetPos : ', Lib.NilStr);
  1321. Ret := MAX(LONGCARD);
  1322. END;
  1323. IF (CoreFile.BufInf[F]^.Flag >= CoreIO._F_OUT) THEN
  1324. IF FlsBuf(CoreFile.BufInf[F]) # -1 THEN (* flush stream *)
  1325. Ret := CoreIO.tell(F);
  1326. ELSE
  1327. Ret := MAX(LONGCARD);
  1328. END;
  1329. ELSE
  1330. Pos := CoreIO.tell(F); (* input stream *)
  1331. IF CoreFile.BufInf[F]^.Pback # 0 THEN
  1332. DEC(Pos);
  1333. END;
  1334. Ret := Pos-LONGCARD(CoreFile.BufInf[F]^.Cnt);
  1335. END;
  1336. (*%T _mthread *)
  1337. (*%T _OS2 *)
  1338. StreamUnlock(CoreFile.BufInf[F]);
  1339. (*%E *)
  1340. (*%E *)
  1341. END;
  1342. (*%T _mthread *)
  1343. (*%F _OS2 *)
  1344. Process.Unlock();
  1345. (*%E *)
  1346. (*%E *)
  1347. IF Ret = MAX(LONGCARD) THEN
  1348. ErrorCheck(9, 0, 'GetPos : ', Lib.NilStr);
  1349. OK := FALSE;
  1350. (*%T _mthread *)
  1351. OKTable[CoreProc._getTID()] := FALSE;
  1352. (*%E *)
  1353. END;
  1354. RETURN Ret;
  1355. END GetPos;
  1356. PROCEDURE Seek( F : File; pos:LONGCARD );
  1357. VAR Ret: LONGINT;
  1358. BEGIN
  1359. (*%T _mthread *)
  1360. SetIOR(0);
  1361. (*%E *)
  1362. (*%F _mthread *)
  1363. IOR := 0;
  1364. (*%E *)
  1365. (*%T _mthread *)
  1366. (*%F _OS2 *)
  1367. Process.Lock();
  1368. (*%E *)
  1369. (*%E *)
  1370. IF (F > CoreFile._open_max) OR (CoreFile.BufInf[F] = NIL) THEN
  1371. Ret := CoreIO.lseek(F, pos, CoreIO.SEEK_SET);
  1372. ELSE
  1373. (*%T _mthread *)
  1374. (*%T _OS2 *)
  1375. StreamLock(CoreFile.BufInf[F]);
  1376. (*%E *)
  1377. (*%E *)
  1378. WITH CoreFile.BufInf[F]^ DO
  1379. IF (Flag = {}) OR (Flag >= CoreIO._F_ERR) THEN
  1380. Ret := -1;
  1381. ELSE
  1382. IF (Flag >= CoreIO._F_OUT) THEN (* flush output buffer *)
  1383. IF FlsBuf(CoreFile.BufInf[F]) = -1 THEN
  1384. Ret := -1;
  1385. END;
  1386. END;
  1387. Pback := 0; (* reset buffer *)
  1388. Cnt := 0;
  1389. Flag := Flag + CoreIO._F_RST;
  1390. Ret := CoreIO.lseek(F, pos, CoreIO.SEEK_SET);
  1391. Flag := Flag - (CoreIO._F_IN + CoreIO._F_OUT +CoreIO._F_EOF +CoreIO._F_CTZ);
  1392. END;
  1393. END;
  1394. (*%T _mthread *)
  1395. (*%T _OS2 *)
  1396. StreamUnlock(CoreFile.BufInf[F]);
  1397. (*%E *)
  1398. (*%E *)
  1399. END;
  1400. CoreFile._openfd[F] := CoreFile._openfd[F] - (CoreIO._O_EOF);
  1401. (*%T _mthread *)
  1402. (*%F _OS2 *)
  1403. Process.Unlock();
  1404. (*%E *)
  1405. (*%E *)
  1406. IF Ret = -1 THEN
  1407. ErrorCheck(0AH, 0, 'Seek : ', Lib.NilStr);
  1408. END;
  1409. END Seek;
  1410. PROCEDURE Size(F: File) : LONGCARD;
  1411. VAR
  1412. Ret: LONGCARD;
  1413. CurPos: LONGCARD;
  1414. BEGIN
  1415. (*%T _mthread *)
  1416. Process.Lock();
  1417. (*%E *)
  1418. CurPos := GetPos(F);
  1419. IF NOT (*%T _mthread *) ThreadOK() (*%E *) (*%F _mthread *) OK (*%E *) THEN RETURN 0 END;
  1420. Ret := CoreIO.lseek(F, 0, CoreIO.SEEK_END);
  1421. Seek(F, CurPos);
  1422. (*%T _mthread *)
  1423. Process.Unlock();
  1424. (*%E *)
  1425. RETURN Ret;
  1426. END Size;
  1427. PROCEDURE Erase(Name:ARRAY OF CHAR);
  1428. VAR
  1429. fn : PathStr;
  1430. BEGIN
  1431. GetName(Name,fn);
  1432. IF(CoreIO.unlink(fn) = -1) THEN
  1433. ErrorCheck(0EH, 0, 'Erase : ', fn);
  1434. END;
  1435. END Erase;
  1436. PROCEDURE Rename(Name,newname: ARRAY OF CHAR);
  1437. VAR
  1438. fn: PathStr;
  1439. fn2: PathStr;
  1440. BEGIN
  1441. GetName(Name,fn);
  1442. GetName(newname,fn2);
  1443. IF(CoreIO.rename(fn, fn2) = -1) THEN
  1444. ErrorCheck(0FH, 0, 'Rename : ', fn);
  1445. END;
  1446. END Rename;
  1447. (*%F _OS2 *)
  1448. PROCEDURE ReadFirstEntry ( DirName : ARRAY OF CHAR;
  1449. Attr : FileAttr;
  1450. VAR D : DirEntry) : BOOLEAN;
  1451. VAR
  1452. r : SYSTEM.Registers;
  1453. fn : PathStr;
  1454. BEGIN
  1455. GetName(DirName,fn);
  1456. WITH r DO
  1457. AH := 1AH;
  1458. DS := Seg(D);
  1459. DX := Ofs(D);
  1460. Lib.Dos(r); (* set DTA *)
  1461. AH := 4EH;
  1462. DS := Seg(fn);
  1463. DX := Ofs(fn);
  1464. CL := SHORTCARD(Attr);
  1465. CH := SHORTCARD(0);
  1466. Lib.Dos(r);
  1467. IF (BITSET{SYSTEM.CarryFlag} * Flags) # BITSET{} THEN
  1468. IF (AX <> 18) THEN
  1469. ErrorCheck(14H, AX, 'ReadFirstEntry : ', DirName);
  1470. END;
  1471. RETURN FALSE;
  1472. END;
  1473. END;
  1474. RETURN TRUE;
  1475. END ReadFirstEntry;
  1476. PROCEDURE ReadNextEntry(VAR D: DirEntry) : BOOLEAN;
  1477. VAR
  1478. r : SYSTEM.Registers;
  1479. BEGIN
  1480. (*%T _mthread *)
  1481. SetIOR(0);
  1482. (*%E *)
  1483. (*%F _mthread *)
  1484. IOR := 0;
  1485. (*%E *)
  1486. WITH r DO
  1487. AH := 1AH;
  1488. DS := Seg(D);
  1489. DX := Ofs(D);
  1490. Lib.Dos(r); (* set DTA *)
  1491. AH := 4FH;
  1492. Lib.Dos(r);
  1493. IF (BITSET{SYSTEM.CarryFlag} * Flags) # BITSET{} THEN
  1494. IF (AX <> 18) THEN
  1495. ErrorCheck(15H, AX, 'ReadNextEntry : ', Lib.NilStr);
  1496. END;
  1497. RETURN FALSE;
  1498. END;
  1499. END;
  1500. RETURN TRUE;
  1501. END ReadNextEntry;
  1502. (*%E *)
  1503. (*%T _OS2 *)
  1504. CONST
  1505. GuardHandle = MAX(CARDINAL)-1;
  1506. PROCEDURE CopyResult(VAR D: DirEntry; VAR d: Dos.FILEFINDBUF);
  1507. BEGIN
  1508. D.attr:=FileAttr(d.attrFile);
  1509. D.time:=d.ftimeCreation;
  1510. D.date:=d.fdateCreation;
  1511. D.size:=d.fileSize;
  1512. Str.Copy(D.Name, d.name);
  1513. END CopyResult;
  1514. PROCEDURE ReadFirstEntry ( DirName : ARRAY OF CHAR;
  1515. Attr : FileAttr;
  1516. VAR D : DirEntry) : BOOLEAN;
  1517. PROCEDURE WildInName(): BOOLEAN;
  1518. BEGIN
  1519. RETURN (Str.CharPos(DirName, '*') # MAX(CARDINAL))
  1520. OR (Str.CharPos(DirName, '?') # MAX(CARDINAL));
  1521. END WildInName;
  1522. VAR
  1523. b : Dos.FILEFINDBUF;
  1524. fn : PathStr;
  1525. status: CARDINAL;
  1526. Handle, Count: CARDINAL;
  1527. BEGIN
  1528. GetName(DirName,fn);
  1529. Handle:=MAX(CARDINAL);
  1530. Count:=1;
  1531. status:=FindFirst(fn, Handle, CARDINAL(SHORTCARD(Attr)), b, SIZE(b), Count, LONGCARD(0));
  1532. IF status # 0 THEN
  1533. IF status <> Err.ERROR_NO_MORE_FILES THEN
  1534. ErrorCheck(14H, status, 'ReadFirstEntry : ', fn);
  1535. END;
  1536. RETURN FALSE;
  1537. END;
  1538. IF WildInName() THEN
  1539. D.Reserved_Handle:=Handle;
  1540. ELSE
  1541. D.Reserved_Handle:=GuardHandle;
  1542. Dos.FindClose(Handle);
  1543. END;
  1544. CopyResult(D, b);
  1545. RETURN TRUE;
  1546. END ReadFirstEntry;
  1547. PROCEDURE ReadNextEntry(VAR D: DirEntry) : BOOLEAN;
  1548. VAR
  1549. b : Dos.FILEFINDBUF;
  1550. status: CARDINAL;
  1551. Handle, Count: CARDINAL;
  1552. BEGIN
  1553. Handle:=(D.Reserved_Handle);
  1554. (*%T _mthread *)
  1555. SetIOR(0);
  1556. (*%E *)
  1557. (*%F _mthread *)
  1558. IOR := 0;
  1559. (*%E *)
  1560. IF Handle = GuardHandle THEN
  1561. RETURN FALSE;
  1562. END;
  1563. Count:=1;
  1564. status:=FindNext(Handle, b, SIZE(b), Count);
  1565. IF status # 0 THEN
  1566. Dos.FindClose(Handle);
  1567. IF status <> Err.ERROR_NO_MORE_FILES THEN
  1568. ErrorCheck(15H, status, 'ReadNextEntry : ', Lib.NilStr);
  1569. END;
  1570. RETURN FALSE;
  1571. END;
  1572. CopyResult(D, b);
  1573. RETURN TRUE;
  1574. END ReadNextEntry;
  1575. (*%E *)
  1576. PROCEDURE ChDir(Name: ARRAY OF CHAR);
  1577. VAR
  1578. fn : PathStr;
  1579. BEGIN
  1580. (*%T _mthread *)
  1581. SetIOR(0);
  1582. (*%E *)
  1583. (*%F _mthread *)
  1584. IOR := 0;
  1585. (*%E *)
  1586. GetName(Name,fn);
  1587. IF CoreIO.chdir(fn) = -1 THEN
  1588. ErrorCheck(10H, 0, 'ChDir : ', Name);
  1589. RETURN;
  1590. END;
  1591. IF (Str.Length(Name) > 1) AND (Name[1] = ':') THEN
  1592. IF SetDrive(SHORTCARD(CAP(Name[0]) - 'A') + 1) = 0 THEN
  1593. ErrorCheck(10H, 0, 'ChDir : ', Name);
  1594. END;
  1595. END;
  1596. END ChDir;
  1597. PROCEDURE MkDir(Name: ARRAY OF CHAR);
  1598. VAR
  1599. fn : PathStr;
  1600. BEGIN
  1601. (*%T _mthread *)
  1602. SetIOR(0);
  1603. (*%E *)
  1604. (*%F _mthread *)
  1605. IOR := 0;
  1606. (*%E *)
  1607. GetName(Name,fn);
  1608. IF CoreIO.mkdir(fn) = -1 THEN
  1609. ErrorCheck(11H, 0, 'MkDir : ', Name);
  1610. END;
  1611. END MkDir;
  1612. PROCEDURE RmDir(Name: ARRAY OF CHAR);
  1613. VAR
  1614. fn : PathStr;
  1615. BEGIN
  1616. (*%T _mthread *)
  1617. SetIOR(0);
  1618. (*%E *)
  1619. (*%F _mthread *)
  1620. IOR := 0;
  1621. (*%E *)
  1622. GetName(Name,fn);
  1623. IF CoreIO.rmdir(fn) = -1 THEN
  1624. ErrorCheck(12H, 0, 'RmDir : ', Name);
  1625. END;
  1626. END RmDir;
  1627. PROCEDURE GetDir(drive: SHORTCARD; VAR Name: ARRAY OF CHAR);
  1628. VAR
  1629. fn : PathStr;
  1630. BEGIN
  1631. (*%T _mthread *)
  1632. SetIOR(0);
  1633. (*%E *)
  1634. (*%F _mthread *)
  1635. IOR := 0;
  1636. (*%E *)
  1637. IF CoreIO.getcurdir(CARDINAL(drive), fn) = -1 THEN
  1638. ErrorCheck(13H, 0, 'GetDir : ', Lib.NilStr);
  1639. END;
  1640. Str.Concat(Name,'\',fn);
  1641. END GetDir;
  1642. PROCEDURE AssignBuffer(F:File;VAR Buf:ARRAY OF BYTE);
  1643. PROCEDURE FindFreeStream():FileInf;
  1644. VAR
  1645. n : CARDINAL;
  1646. BEGIN
  1647. n := 0;
  1648. (*%T _mthread *)
  1649. Process.Lock();
  1650. (*%E *)
  1651. WHILE n < CoreFile._open_max DO
  1652. IF CoreFile._iob[n].Flag = {} THEN
  1653. (*%T _mthread *)
  1654. Process.Unlock();
  1655. (*%E *)
  1656. RETURN FileInf(ADR(CoreFile._iob[n]));
  1657. END; (*IF*)
  1658. INC(n);
  1659. END; (*WHILE*)
  1660. (*%T _mthread *)
  1661. Process.Unlock();
  1662. (*%E *)
  1663. RETURN NIL;
  1664. END FindFreeStream;
  1665. BEGIN
  1666. (*%T _mthread *)
  1667. SetIOR(0);
  1668. (*%E *)
  1669. (*%F _mthread *)
  1670. IOR := 0;
  1671. (*%E *)
  1672. IF (F > CoreFile._open_max) (*%F _WINDOWS *) OR (CoreFile._openfd[F] = {}) (*%E *) THEN
  1673. ErrorCheck(19H,CoreIO.EBADF,'AssignBuffer : ',Lib.NilStr);
  1674. RETURN;
  1675. END; (*IF*)
  1676. IF (HIGH(Buf) = 0) OR (HIGH(Buf) > MAX(INTEGER)) THEN
  1677. ErrorCheck(1AH,CoreIO.EINVAL,'AssignBuffer : ',Lib.NilStr);
  1678. RETURN;
  1679. END; (*IF*)
  1680. (*%T _WINDOWS *)
  1681. IF (CoreFile._openfd[F] = {}) THEN
  1682. CoreFile._openfd[F] := (CoreIO.O_RDWR + CoreIO.O_BINARY);
  1683. END; (*IF*)
  1684. (*%E *)
  1685. IF CoreFile.BufInf[F] # NIL THEN
  1686. RETURN;
  1687. END; (*IF*)
  1688. CoreFile.BufInf[F] := FindFreeStream();
  1689. IF CoreFile.BufInf[F] = NIL THEN
  1690. ErrorCheck(1BH,CoreIO.EMFILE,'AssignBuffer : ',Lib.NilStr);
  1691. RETURN;
  1692. END; (*IF*)
  1693. WITH CoreFile.BufInf[F]^ DO
  1694. Ptr := CoreFile.StreamPtr(ADR(Buf));
  1695. Base := Ptr;
  1696. Size := HIGH(Buf) + 1;
  1697. Cnt := 0;
  1698. Pback := 0;
  1699. Handle := F;
  1700. IF (CoreFile._openfd[F] >= CoreIO.O_DEVICE) THEN
  1701. Flag := CoreIO._F_DEV;
  1702. ELSE
  1703. Flag := {};
  1704. END; (*IF*)
  1705. IF (CoreFile._openfd[F] * CoreIO.O_RDWR # {}) OR (CoreFile._openfd[F] * CoreIO.O_WRONLY # {}) THEN
  1706. Flag := Flag + CoreIO._F_RDWR;
  1707. ELSE
  1708. Flag := Flag + CoreIO._F_READ;
  1709. END; (*IF*)
  1710. IF CoreFile._openfd[F] >= CoreIO.O_APPEND THEN
  1711. Flag := Flag + CoreIO._F_APP;
  1712. END; (*IF*)
  1713. Flag := Flag + (CoreIO._F_BIN + CoreIO._F_UBUF + CoreIO._F_RST);
  1714. END; (*WITH*)
  1715. END AssignBuffer;
  1716. PROCEDURE AppendHandle(F: File; ReadOnly: BOOLEAN);
  1717. BEGIN
  1718. IF F < CoreFile._open_max THEN
  1719. IF ReadOnly THEN
  1720. CoreFile._openfd[F] := (CoreIO.O_RDONLY+CoreIO.O_BINARY);
  1721. ELSE
  1722. CoreFile._openfd[F] := (CoreIO.O_RDWR+CoreIO.O_BINARY);
  1723. END;
  1724. IF CoreIO.isatty(F) # 0 THEN
  1725. CoreFile._openfd[F] := CoreFile._openfd[F] + CoreIO.O_DEVICE;
  1726. END;
  1727. END;
  1728. END AppendHandle;
  1729. PROCEDURE AppendStream(St: FileInf): File;
  1730. VAR
  1731. F: File;
  1732. BEGIN
  1733. F := St^.Handle;
  1734. CoreFile.BufInf[F] := St;
  1735. RETURN F;
  1736. END AppendStream;
  1737. PROCEDURE GetStreamPointer(F: File): FileInf;
  1738. BEGIN
  1739. RETURN CoreFile.BufInf[F];
  1740. END GetStreamPointer;
  1741. (*%F _OS2 *)
  1742. PROCEDURE GetDrive() : SHORTCARD ;
  1743. (* Returns the currently selected drive *)
  1744. (* A=1,B=2,C=3 etc *)
  1745. VAR
  1746. r : SYSTEM.Registers;
  1747. BEGIN
  1748. (*%T _mthread *)
  1749. SetIOR(0);
  1750. (*%E *)
  1751. (*%F _mthread *)
  1752. IOR := 0;
  1753. (*%E *)
  1754. r.AH := 19H ;
  1755. Lib.Dos(r);
  1756. RETURN r.AL+1 ;
  1757. END GetDrive ;
  1758. PROCEDURE SetDrive(Drive: SHORTCARD): SHORTCARD;
  1759. (* Sets the default drive *)
  1760. (* A=1,B=2,C=3 etc *)
  1761. VAR
  1762. r : SYSTEM.Registers;
  1763. BEGIN
  1764. (*%T _mthread *)
  1765. SetIOR(0);
  1766. (*%E *)
  1767. (*%F _mthread *)
  1768. IOR := 0;
  1769. (*%E *)
  1770. r.AH := 0EH ;
  1771. r.DL := Drive-1;
  1772. Lib.Dos(r);
  1773. RETURN r.AL;
  1774. END SetDrive ;
  1775. PROCEDURE GetCurrentDate () : LONGCARD ;
  1776. VAR r : SYSTEM.Registers;
  1777. l : RECORD
  1778. CASE : BOOLEAN OF
  1779. TRUE : fl,fh : CARDINAL; |
  1780. FALSE : l : LONGCARD;
  1781. END;
  1782. END;
  1783. BEGIN
  1784. WITH r DO
  1785. AH := 2CH;
  1786. Lib.Dos(r);
  1787. l.fl := (VAL(CARDINAL,CH) << 11)+(VAL(CARDINAL,CL) << 5)+(VAL(CARDINAL,DH)>>1);
  1788. AH := 2AH ;
  1789. Lib.Dos(r);
  1790. l.fh := ((CX-1980)<< 9)+(VAL(CARDINAL,DH)<<5)+VAL(CARDINAL,DL);
  1791. END;
  1792. RETURN l.l;
  1793. END GetCurrentDate ;
  1794. PROCEDURE GetFileDate( f : File) : LONGCARD;
  1795. VAR r : SYSTEM.Registers;
  1796. l : RECORD
  1797. CASE : BOOLEAN OF
  1798. TRUE : fl,fh : CARDINAL; |
  1799. FALSE : l : LONGCARD;
  1800. END;
  1801. END;
  1802. BEGIN
  1803. WITH r DO
  1804. AX := 5700H;
  1805. BX := f;
  1806. Lib.Dos(r);
  1807. l.fl := CX;
  1808. l.fh := DX;
  1809. END;
  1810. RETURN l.l;
  1811. END GetFileDate;
  1812. PROCEDURE SetFileDate( f : File ; d : LONGCARD ) ;
  1813. VAR r : SYSTEM.Registers;
  1814. l : RECORD
  1815. CASE : BOOLEAN OF
  1816. TRUE : fl,fh : CARDINAL; |
  1817. FALSE : l : LONGCARD;
  1818. END;
  1819. END;
  1820. BEGIN
  1821. WITH r DO
  1822. l.l := d ;
  1823. AX := 5701H;
  1824. BX := f;
  1825. CX := l.fl ;
  1826. DX := l.fh ;
  1827. Lib.Dos(r);
  1828. END;
  1829. END SetFileDate;
  1830. (*%E *)
  1831. (*%T _OS2 *)
  1832. PROCEDURE GetDrive() : SHORTCARD ;
  1833. (* Returns the currently selected drive *)
  1834. (* A=1,B=2,C=3 etc *)
  1835. VAR
  1836. Dr : CARDINAL;
  1837. BitMap: LONGCARD;
  1838. BEGIN
  1839. SYSTEM.Eval(QCurDisk(Dr, BitMap));
  1840. RETURN SHORTCARD(Dr);
  1841. END GetDrive ;
  1842. PROCEDURE SetDrive(Drive: SHORTCARD): SHORTCARD;
  1843. (* Sets the default drive *)
  1844. (* A=1,B=2,C=3 etc *)
  1845. BEGIN
  1846. SYSTEM.Eval(Dos.SelectDisk(CARDINAL(Drive)));
  1847. RETURN MAX(SHORTCARD);
  1848. END SetDrive ;
  1849. PROCEDURE GetCurrentDate () : LONGCARD ;
  1850. VAR
  1851. l : RECORD
  1852. CASE : BOOLEAN OF
  1853. TRUE : fl,fh : CARDINAL; |
  1854. FALSE : l : LONGCARD;
  1855. END;
  1856. END;
  1857. Info: Dos.DATETIME;
  1858. BEGIN
  1859. SYSTEM.Eval(Dos.GetDateTime(Info));
  1860. l.fl := (CARDINAL(Info.hours) << 11)+(CARDINAL(Info.minutes) << 5)+(CARDINAL(Info.seconds)>>1);
  1861. l.fh := ((Info.year-1980)<< 9)+(CARDINAL(Info.month)<<5)+CARDINAL(Info.day);
  1862. RETURN l.l;
  1863. END GetCurrentDate ;
  1864. TYPE
  1865. FileInfo = RECORD
  1866. CDate, CTime, ADate, ATime, WDate, WTime: CARDINAL;
  1867. CBFile, CGFileA: LONGCARD;
  1868. Attr: SHORTCARD;
  1869. cchName: SHORTCARD;
  1870. achName: ARRAY [0..12] OF CHAR;
  1871. END;
  1872. DT = RECORD
  1873. CASE : BOOLEAN OF
  1874. TRUE : fl,fh : CARDINAL; |
  1875. FALSE : l : LONGCARD;
  1876. END;
  1877. END;
  1878. PROCEDURE GetFileDate( f : File) : LONGCARD;
  1879. VAR
  1880. Buffer: FileInfo;
  1881. T: DT;
  1882. BEGIN
  1883. IF Dos.QFileInfo(f, CARDINAL(1), FarADR(Buffer), SIZE(Buffer)) # 0 THEN
  1884. RETURN MAX(LONGCARD);
  1885. END;
  1886. T.fh := Buffer.WDate;
  1887. T.fl := Buffer.WTime;
  1888. RETURN T.l;
  1889. END GetFileDate;
  1890. PROCEDURE SetFileDate( f : File ; d : LONGCARD ) ;
  1891. VAR
  1892. Buffer: FileInfo;
  1893. T: DT;
  1894. BEGIN
  1895. IF Dos.QFileInfo(f, CARDINAL(1), FarADR(Buffer), SIZE(Buffer)) # 0 THEN RETURN END;
  1896. T.l:= d;
  1897. Buffer.WDate := T.fh;
  1898. Buffer.WTime := T.fl;
  1899. IF Dos.SetFileInfo(f, CARDINAL(1), FarADR(Buffer), SIZE(Buffer)) # 0 THEN END;
  1900. END SetFileDate;
  1901. (*%E *)
  1902. PROCEDURE ThreadEOF(): BOOLEAN;
  1903. BEGIN
  1904. (*%T _mthread *)
  1905. RETURN EOFTable[CoreProc._getTID()];
  1906. (*%E *)
  1907. (*%F _mthread *)
  1908. RETURN EOF;
  1909. (*%E *)
  1910. END ThreadEOF;
  1911. PROCEDURE ThreadOK(): BOOLEAN;
  1912. BEGIN
  1913. (*%T _mthread *)
  1914. RETURN OKTable[CoreProc._getTID()];
  1915. (*%E *)
  1916. (*%F _mthread *)
  1917. RETURN OK;
  1918. (*%E *)
  1919. END ThreadOK;
  1920. PROCEDURE GetFileStamp(f : File ; VAR b: FileStamp) : BOOLEAN;
  1921. VAR
  1922. DT : RECORD
  1923. CASE : BOOLEAN OF
  1924. TRUE : ft,fd : CARDINAL; |
  1925. FALSE : l : LONGCARD;
  1926. END;
  1927. END;
  1928. BEGIN
  1929. DT.l := GetFileDate(f);
  1930. IF DT.l = MAX(LONGCARD) THEN
  1931. RETURN FALSE;
  1932. ELSE
  1933. b.Year := SHORTCARD(DT.fd>>9+80) ;
  1934. b.Month := SHORTCARD((DT.fd>>5) MOD 16) ;
  1935. b.Day := SHORTCARD(DT.fd MOD 32) ;
  1936. b.Hour := SHORTCARD(DT.ft>>11) ;
  1937. b.Min := SHORTCARD((DT.ft>>5) MOD 64) ;
  1938. b.Sec := SHORTCARD(DT.ft MOD 32) ;
  1939. RETURN TRUE;
  1940. END;
  1941. END GetFileStamp;
  1942. (*# save,call(c_conv=>on) *)
  1943. PROCEDURE Cleanup();
  1944. VAR
  1945. n : CARDINAL;
  1946. BEGIN
  1947. FOR n := 0 TO CoreFile._open_max - 1 DO
  1948. IF CoreFile._iob[n].Flag # {} THEN
  1949. CoreFile.BufInf[n] := ADR(CoreFile._iob[n]);
  1950. Flush(n);
  1951. END; (*IF*)
  1952. END; (*FOR*)
  1953. END Cleanup;
  1954. (*# restore *)
  1955. (*%T _mthread *)
  1956. VAR
  1957. n : [1..Process.MaxProcess];
  1958. (*%E *)
  1959. BEGIN
  1960. (*%T _mthread *)
  1961. n := 1;
  1962. WHILE n <= Process.MaxProcess DO
  1963. IOR[n] := 0;
  1964. EOFTable[n] := FALSE;
  1965. OKTable[n] := TRUE;
  1966. INC(n);
  1967. END;
  1968. (*%E *)
  1969. (*%F _mthread *)
  1970. IOR := 0;
  1971. (*%E *)
  1972. Eng := FALSE;
  1973. IOcheck := TRUE;
  1974. OK := TRUE;
  1975. ChopOff := FALSE;
  1976. EOF := FALSE;
  1977. EOL := CHR (10);
  1978. PrefixChar := ' ';
  1979. SuffixChar := ' ';
  1980. ShareMode := ShareCompat;
  1981. Separators := Str.CHARSET{CHR(9),CHR(10),CHR(13),CHR(26),' '};
  1982. CoreFile.BufInf[StandardInput] := ADR(CoreFile._iob[StandardInput]);
  1983. CoreFile.BufInf[StandardOutput] := ADR(CoreFile._iob[StandardOutput]);
  1984. CoreMain._exit_io := Cleanup;
  1985. END FIO.
  1986.