登录 用户中心() [退出] 后台管理 注册
 

热门搜索:
您的位置:首页 >> 马上代码 >> 马上代码 >> 主题: [delphi/pascal/c]c.pas -- 自己的 C 语言常用函数翻译
标题 [delphi/pascal/c]c.pas -- 自己的 C 语言常用函数翻译
clq
浏览(1945) 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.


总数:1 页次:1/1 首页 尾页  


发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:




Copyright © 2005-2012 CLQ工作室, All Rights Reserved

CLQ工作室 版权所有