![]() |
登录 用户中心() [退出] 后台管理 注册 |
热门搜索: |
您的位置:首页 >> 马上代码 >> 马上代码 >> 主题: [delphi/pascal/c]c.pas -- 自己的 C 语言常用函数翻译 |
标题 | [delphi/pascal/c]c.pas -- 自己的 C 语言常用函数翻译 |
clq |
浏览(2255)
2008-06-12 16:35:22 发表
编辑
关键字: [delphi/pascal/c]c.pas -- 自己的 C 语言常用函数翻译 会持继发布演进的版本. |
clq |
2008-6-12 16:35:38 发表
编辑
附件[暂不开放下载] unit c; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const NULL:pchar = nil; type u8 = byte; u16 = word; u32 = longword; float = Single; int32 = Longint; int = Longint; time_t = u32; TFILE = file of byte;//文件指针 //_FILE = ^_TFILE; P_PASCAL_FILE = ^TFILE;//pascal 传统的文件指针实现 _FILE = record ftype:integer;//用什么样的接口// pfile:P_PASCAL_FILE;//传统 pascal 文件指针 wfile:integer;//win32 接口//THandle;//不对,有 -1 的情况,所以要用 integer end; //内存 procedure memset(X:pchar; Value: Byte; Count: Integer); function strcpy(des:pchar; const src:pchar):pchar; function memcpy(des:pchar; const src:pchar; n:integer):pchar; function malloc(size:integer):pchar; procedure free(p:pchar); //文件 //function fopen(const path:string; const mode:string):_FILE; //默认用 win32 的接口来实现//win32 的实现是不会产生异常,而传统 pascal 的文件在文件不存在时会抛出异常 function fopen(const path:string; const mode:string; const ftype:integer = 1):_FILE; function fread(ptr:pchar; size:integer; nmemb:integer; stream:_FILE):integer; function fwrite(const ptr:pchar; size:integer; nmemb:integer; stream:_FILE):integer; function fclose(stream:_FILE):integer;//返回值 若关文件动作成功则返回0,有错误发生时则返回EOF并把错误代码存到errno。 implementation function fclose(stream:_FILE):integer; begin result:=0; if stream.ftype = 0 then begin closefile(stream.pfile^); free(pchar(stream.pfile)); end; if stream.ftype = 1 then begin closehandle(stream.wfile); end; end; function fread(ptr:pchar; size:integer; nmemb:integer; stream:_FILE):integer; begin result:=0; if stream.ftype = 0 then begin blockread(stream.pfile^, ptr^, size*nmemb, result); end; if stream.ftype = 1 then begin //result := fileread(stream.wfile, ptr^, size*nmemb); if not ReadFile(stream.wfile, ptr^, size*nmemb, LongWord(Result), nil) then Result := 0; end; if result>0 then result:=trunc(result/size);//size 是一个结构占用的字节数, fread 的返回值是读取到的结构的个数,而不是字节数 end; function fwrite(const ptr:pchar; size:integer; nmemb:integer; stream:_FILE):integer; begin result:=0; if stream.ftype = 0 then begin blockwrite(stream.pfile^, ptr^, size*nmemb, result); end; if stream.ftype = 1 then begin //result := fileread(stream.wfile, ptr^, size*nmemb); if not WriteFile(stream.wfile, ptr^, size*nmemb, LongWord(Result), nil) then Result := 0; end; if result>0 then result:=trunc(result/size)//size 是一个结构占用的字节数, fread 的返回值是读取到的结构的个数,而不是字节数 else result := 0; end; function fseek(stream:_FILE; offset:integer; whence:integer):integer;//当前实现只支持从最前面向后移动 begin if stream.ftype = 1 then begin //SetFilePointer(stream.wfile, offset, 0, whence); SetFilePointer(stream.wfile, offset, 0, FILE_BEGIN); end; if stream.ftype = 0 then begin Seek(stream.pfile^, offset); end; result:=0; end; function _fopen(const path:string; const mode:string):P_PASCAL_FILE; var f:P_PASCAL_FILE; begin f := P_PASCAL_FILE(malloc(sizeof(TFILE))); memset(pchar(f), 0, sizeof(TFILE)); AssignFile(f^, path); //"rb", "wb", "a+" 是比较常见的模式 if (mode = 'rb') then reset(f^) else rewrite(f^); seek(f^, 0); result:=f; end; //默认用 win32 的接口来实现 function fopen(const path:string; const mode:string; const ftype:integer = 1):_FILE; var f:_FILE; r:integer; begin //TFileStream //参考它的实现 { //打开存在的 r := Integer(CreateFile(PChar(path), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)); if r = -1 then begin//失败的话新建立一个 r := Integer(CreateFile(PChar(path), GENERIC_READ or GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)); end; } if ftype = 1 then begin //OPEN_ALWAYS 表示不存在的话就建立一个 r := Integer(CreateFile(PChar(path), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)); //返回值为 INVALID_HANDLE_VALUE 即为错误 f.ftype := ftype;//1; f.wfile := r; result:=f; end; if ftype = 0 then begin f.pfile := P_PASCAL_FILE(malloc(sizeof(TFILE))); memset(pchar(f.pfile), 0, sizeof(TFILE)); AssignFile(f.pfile^, path); //"rb", "wb", "a+" 是比较常见的模式 if (mode = 'rb') then reset(f.pfile^) else rewrite(f.pfile^); seek(f.pfile^, 0); end; result:=f; end; function malloc(size:integer):pchar; begin result := AllocMem(size); end; procedure free(p:pchar); begin FreeMem(p); end; procedure memset(X:pchar; Value: Byte; Count: Integer); begin FillChar(X^, Count, Value); end; function strcpy(des:pchar; const src:pchar):pchar; begin strcopy(des, src); end; function memcpy(des:pchar; const src:pchar; n:integer):pchar; begin CopyMemory(des, src, n); end; end. |
Copyright © 2005-2012 CLQ工作室, All Rights Reserved CLQ工作室 版权所有 |