Com*_*sNo 2 c delphi pascal freepascal
我需要将一段C代码翻译成Delphi/Pascal代码,但是我无法理解几行代码.
C代码:
static char* get_boundary(apr_pool_t* p, const char* ctype) {
char* ret = NULL ;
if ( ctype ) {
char* lctype = lccopy(p, ctype) ;
char* bdy = strstr(lctype, "boundary") ;
if ( bdy ) {
char* ptr = strchr(bdy, '=') ;
if ( ptr ) {
// what is the following line supposed to do?
bdy = (char*) ctype + ( ptr - lctype ) + 1;
// and this? I understand it's a loop, but *ptr and ++ptr is ugly!
for ( ptr = bdy; *ptr; ++ptr )
if ( *ptr == ';' || isspace(*ptr) )
*ptr = 0 ;
ret = apr_pstrdup(p, bdy) ;
}
}
}
return ret ;
}
Run Code Online (Sandbox Code Playgroud)
我目前的翻译:
function get_boundary(p: Papr_pool_t; const ctype: PChar): PChar;
var
LCType: PChar;
LBody: PChar;
begin
Result := NIL;
LCType := lccopy(p, ctype);
LBody := strpos(LCType, 'boundary');
if LBody <> NIL then begin
// now what? (:
end; // if LBody <> NIL then begin
end;
Run Code Online (Sandbox Code Playgroud)
lccopy正在创建ctype参数的副本并使其为小写.
有关翻译的一些细节非常受欢迎,例如'bdy =(char*)ctype +(ptr - lctype)+ 1;' 和for循环.
仅供参考我正在翻译mod_upload.c.
bdy = (char*) ctype + ( ptr - lctype ) + 1;
Run Code Online (Sandbox Code Playgroud)
所以... ( ptr - lctype )是指针算术,以找到多远的lctype ptr点.它是指针中保存的地址之间的差异,除以它们指向的数据类型的大小(在这种情况下char,大小就是这样1).
所以bdy = (char*) ctype + ( ptr - lctype ) + 1;指向先前找到bdy的字符'=',但是在原始字符串ctype而不是小写副本中lctype.
for ( ptr = bdy; *ptr; ++ptr )
Run Code Online (Sandbox Code Playgroud)
这不是一种非常奇怪的方式,在迭代过程中迭代C中的字符串 ptr指向每个字符,并*ptr给出字符; 所以*ptr将测试FALSE到达终止空字节时结束循环. ++ptr更多指针算术移动到指向下一个字符的指针.即使这看起来很混乱,但在C语言中这是一种非常自然的方式.
因此循环遍历指向的字符串的每个字符bdy,并且在每次迭代期间*ptr访问当前字符.
if ( *ptr == ';' || isspace(*ptr) )
*ptr = 0 ;
Run Code Online (Sandbox Code Playgroud)
看起来循环的目的是在下一个分号或找到的空白字符处终止字符串(通过放置一个早期的空终止符).
在字符串操作方面,Delphi和C之间存在足够的差异,你可能最好只计算函数正在做什么,然后从头开始编写Delphi等价物而不是像这样直接翻译它.
看起来该函数查找"边界"(不区分大小写)ctype,然后跳过找到的下一个"=",并返回从那里到下一个分号或空白字符的所有内容的副本.你可以使用Delphi字符串和函数轻松地在Delphi中做同样的事情,如果你愿意首先转换字符串,使用非常不同的代码...
此外,如果它很重要,看起来原始的C代码忽略了"boundary"和"="之间的任何东西 - 所以它会接受,比如" boundary asdf jidlsah;lkdsf =Value"以及" boundary=Value"
| 归档时间: |
|
| 查看次数: |
1541 次 |
| 最近记录: |