LibDelphi.pas 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. unit LibDelphi;
  2. interface
  3. uses
  4. Windows, SysUtils;
  5. function fprintf(stream: Pointer; format: Pointer; arguments: Pointer): Integer; cdecl;
  6. function sprintf(buffer: Pointer; format: Pointer; arguments: Pointer): Integer; cdecl;
  7. function fputs(s: Pointer; stream: Pointer): Integer; cdecl;
  8. function fputc(c: Integer; stream: Pointer): Integer; cdecl;
  9. function isprint(c: Integer): Integer; cdecl;
  10. procedure memset(a: Pointer; b: Integer; c: Cardinal); cdecl;
  11. function memcpy(dest: Pointer; const src: Pointer; count: Cardinal): Pointer; cdecl;
  12. function _ftol: Integer; cdecl;
  13. function malloc(s: Longint): Pointer; cdecl;
  14. procedure free(p: Pointer); cdecl;
  15. function _ltolower(ch: Integer): Integer; cdecl;
  16. function _ltoupper(ch: Integer): Integer; cdecl;
  17. function _ltowlower(ch: Integer): Integer; cdecl;
  18. function _ltowupper(ch: Integer): Integer; cdecl;
  19. function strcpy(dest: Pointer; src: Pointer): Pointer; cdecl;
  20. function sprintfsec(buffer: Pointer; format: Pointer; arguments: Pointer): Integer;
  21. var
  22. __turboFloat: LongBool = False;
  23. _streams: Integer;
  24. implementation
  25. {PODD}
  26. function fputc(c: Integer; stream: Pointer): Integer; cdecl;
  27. var
  28. m: array[0..1] of Char;
  29. n: Cardinal;
  30. o: Cardinal;
  31. begin
  32. if c=13 then
  33. begin
  34. m[0]:=#13;
  35. m[1]:=#10;
  36. n:=2;
  37. end
  38. else
  39. begin
  40. m[0]:=Char(c);
  41. n:=1;
  42. end;
  43. WriteFile(Cardinal(stream),m[0],n,o,nil);
  44. Result:=c;
  45. end;
  46. function isprint(c: Integer): Integer; cdecl;
  47. begin
  48. if (c<32) or (127<=c) then
  49. Result:=0
  50. else
  51. Result:=1;
  52. end;
  53. function fputs(s: Pointer; stream: Pointer): Integer; cdecl;
  54. var
  55. m: Integer;
  56. n: Pointer;
  57. o: Cardinal;
  58. begin
  59. m:=0;
  60. n:=s;
  61. while PByte(n)^<>0 do
  62. begin
  63. Inc(m);
  64. Inc(PByte(n));
  65. end;
  66. WriteFile(Cardinal(stream),s^,Cardinal(m),o,nil);
  67. Result:=1;
  68. end;
  69. function sprintf(buffer: Pointer; format: Pointer; arguments: Pointer): Integer; cdecl;
  70. begin
  71. sprintfsec(buffer,format,@arguments);
  72. end;
  73. function fprintf(stream: Pointer; format: Pointer; arguments: Pointer): Integer; cdecl;
  74. var
  75. m: Integer;
  76. n: Pointer;
  77. o: Cardinal;
  78. begin
  79. m:=sprintfsec(nil,format,@arguments);
  80. GetMem(n,m);
  81. sprintfsec(n,format,@arguments);
  82. WriteFile(Cardinal(stream),n^,Cardinal(m),o,nil);
  83. FreeMem(n);
  84. end;
  85. function strcpy(dest: Pointer; src: Pointer): Pointer; cdecl;
  86. var
  87. ma,mb: PByte;
  88. n: Integer;
  89. begin
  90. ma:=src;
  91. mb:=dest;
  92. while True do
  93. begin
  94. n:=ma^;
  95. mb^:=n;
  96. if n=0 then break;
  97. Inc(ma);
  98. Inc(mb);
  99. end;
  100. Result:=dest;
  101. end;
  102. function _ltolower(ch: Integer): Integer; cdecl;
  103. begin
  104. raise Exception.Create('LibDelphi - call to _ltolower - should presumably not occur');
  105. end;
  106. function _ltoupper(ch: Integer): Integer; cdecl;
  107. begin
  108. raise Exception.Create('LibDelphi - call to _ltoupper - should presumably not occur');
  109. end;
  110. function _ltowlower(ch: Integer): Integer; cdecl;
  111. begin
  112. raise Exception.Create('LibDelphi - call to _ltowlower - should presumably not occur');
  113. end;
  114. function _ltowupper(ch: Integer): Integer; cdecl;
  115. begin
  116. raise Exception.Create('LibDelphi - call to _ltowupper - should presumably not occur');
  117. end;
  118. function sprintfsec(buffer: Pointer; format: Pointer; arguments: Pointer): Integer;
  119. var
  120. Modifier: Integer;
  121. Width: Integer;
  122. m,ma: PByte;
  123. mb: Boolean;
  124. n: PByte;
  125. o: PByte;
  126. r: PByte;
  127. procedure Append(const p: String);
  128. var
  129. q: Integer;
  130. begin
  131. if Width>Length(p) then
  132. begin
  133. if buffer<>nil then
  134. begin
  135. for q:=0 to Width-Length(p)-1 do
  136. begin
  137. o^:=Ord('0');
  138. Inc(o);
  139. end;
  140. end
  141. else
  142. Inc(o,Width-Length(p));
  143. end;
  144. if buffer<>nil then CopyMemory(o,PChar(p),Length(p));
  145. Inc(o,Length(p));
  146. end;
  147. begin
  148. m:=format;
  149. n:=arguments;
  150. o:=buffer;
  151. while True do
  152. begin
  153. if m^=0 then break;
  154. if m^=Ord('%') then
  155. begin
  156. ma:=m;
  157. mb:=True;
  158. Inc(m);
  159. Width:=-1;
  160. Modifier:=0;
  161. {flags}
  162. case m^ of
  163. Ord('-'): mb:=False;
  164. Ord('+'): mb:=False;
  165. Ord(' '): mb:=False;
  166. Ord('#'): mb:=False;
  167. end;
  168. if mb then
  169. begin
  170. {width}
  171. case m^ of
  172. Ord('1')..Ord('9'):
  173. begin
  174. Width:=0;
  175. while True do
  176. begin
  177. if (m^<Ord('0')) or (Ord('9')<m^) then break;
  178. Width:=Width*10+m^-Ord('0');
  179. Inc(m);
  180. end;
  181. end;
  182. Ord('0'): mb:=False;
  183. Ord('*'): mb:=False;
  184. end;
  185. end;
  186. if mb then
  187. begin
  188. {prec}
  189. case m^ of
  190. Ord('.'): mb:=False;
  191. end;
  192. end;
  193. if mb then
  194. begin
  195. {modifier}
  196. case m^ of
  197. Ord('F'): mb:=False;
  198. Ord('N'): mb:=False;
  199. Ord('h'): mb:=False;
  200. Ord('l'):
  201. begin
  202. Modifier:=4;
  203. Inc(m);
  204. end;
  205. Ord('L'): mb:=False;
  206. end;
  207. end;
  208. if mb then
  209. begin
  210. {type}
  211. case m^ of
  212. Ord('d'):
  213. begin
  214. case Modifier of
  215. 0:
  216. begin
  217. Append(IntToStr(PInteger(n)^));
  218. Inc(m);
  219. Inc(n,SizeOf(Integer));
  220. end;
  221. else
  222. mb:=False;
  223. end;
  224. end;
  225. Ord('i'): mb:=False;
  226. Ord('o'): mb:=False;
  227. Ord('u'):
  228. begin
  229. case Modifier of
  230. 0,4:
  231. begin
  232. Append(IntToStr(PCardinal(n)^));
  233. Inc(m);
  234. Inc(n,SizeOf(Cardinal));
  235. end;
  236. else
  237. mb:=False;
  238. end;
  239. end;
  240. Ord('x'):
  241. begin
  242. case Modifier of
  243. 0,4:
  244. begin
  245. Append(IntToHex(PCardinal(n)^,8));
  246. Inc(m);
  247. Inc(n,SizeOf(Cardinal));
  248. end;
  249. else
  250. mb:=False;
  251. end;
  252. end;
  253. Ord('X'): mb:=False;
  254. Ord('f'): mb:=False;
  255. Ord('e'): mb:=False;
  256. Ord('g'):
  257. begin
  258. case Modifier of
  259. 0:
  260. begin
  261. Append(FloatToStr(PSingle(n)^));
  262. Inc(m);
  263. Inc(n,SizeOf(Single));
  264. end;
  265. else
  266. mb:=False;
  267. end;
  268. end;
  269. Ord('E'): mb:=False;
  270. Ord('G'): mb:=False;
  271. Ord('c'): mb:=False;
  272. Ord('s'):
  273. begin
  274. r:=PPointer(n)^;
  275. while r^<>0 do
  276. begin
  277. if buffer<>nil then o^:=r^;
  278. Inc(o);
  279. Inc(r);
  280. end;
  281. Inc(n,SizeOf(Pointer));
  282. Inc(m);
  283. end;
  284. Ord('%'): mb:=False;
  285. Ord('n'): mb:=False;
  286. Ord('p'): mb:=False;
  287. else
  288. raise Exception.Create('LibDelphi');
  289. end;
  290. end;
  291. if mb=False then
  292. begin
  293. m:=ma;
  294. if buffer<>nil then o^:=m^;
  295. Inc(o);
  296. Inc(m);
  297. end;
  298. end
  299. else if m^=10 then
  300. begin
  301. if buffer<>nil then o^:=13;
  302. Inc(o);
  303. if buffer<>nil then o^:=10;
  304. Inc(o);
  305. Inc(m);
  306. end
  307. else
  308. begin
  309. if buffer<>nil then o^:=m^;
  310. Inc(o);
  311. Inc(m);
  312. end;
  313. end;
  314. if buffer<>nil then o^:=0;
  315. Inc(o);
  316. Result:=(Cardinal(o)-Cardinal(buffer));
  317. end;
  318. procedure free(p: Pointer); cdecl;
  319. var
  320. m: TMemoryManager;
  321. begin
  322. GetMemoryManager(m);
  323. m.FreeMem(p);
  324. end;
  325. function malloc(s: Longint): Pointer; cdecl;
  326. var
  327. m: TMemoryManager;
  328. begin
  329. GetMemoryManager(m);
  330. Result:=m.GetMem(s);
  331. end;
  332. function _ftol: Integer; cdecl;
  333. var
  334. f: double;
  335. begin
  336. asm
  337. lea eax, f // BC++ passes floats on the FPU stack
  338. fstp qword ptr [eax] // Delphi passes floats on the CPU stack
  339. end;
  340. Result := Trunc(f);
  341. end;
  342. function memcpy(dest: Pointer; const src: Pointer; count: Cardinal): Pointer; cdecl;
  343. begin
  344. CopyMemory(dest,src,count);
  345. Result:=dest;
  346. end;
  347. procedure memset(a: Pointer; b: Integer; c: Cardinal); cdecl;
  348. begin
  349. FillMemory(a,c,b);
  350. end;
  351. end.