+ using Assert to monitor done_init and get state of

un_cgi initailization
* renaming EnvP and EnvC to cgiEnvP and cgiEnvP
  to avoid confusion with regular EnvP and EnvC
  varaibles especially under win32 target
* set_contents get parameter by address (const)
This commit is contained in:
mazen 2003-07-16 12:56:03 +00:00
parent 95d9a6e16e
commit 2772a461b6

View File

@ -5,7 +5,7 @@ unit uncgi;
UNCGI UNIT 2.0.11
----------------
}
{$ASSERTIONS ON}
interface
uses
strings
@ -39,10 +39,10 @@ Type
Value:PPChar
end;
var
EnvC:LongInt;
EnvP:PCgiVar;
cgiEnvC:LongInt;
cgiEnvP:PCgiVar;
get_nodata : boolean;
query_read : word;
query_read : Cardinal;
uncgi_error : cgi_error_proc;
{***********************************************************************}
@ -121,7 +121,7 @@ function get_next_value:PChar;
Example - set_content('text/plain');
set_content('text/html');
}
procedure set_content(ctype: string);
procedure set_content(const ctype: string);
{ Function to get the requested URL }
@ -239,7 +239,7 @@ end;
var
done_init : boolean;
procedure set_content(ctype: string);
procedure set_content(const ctype: string);
begin
writeln('Content-Type: ',ctype);
writeln;
@ -295,10 +295,11 @@ var
gv_cnt,gv_cnt_n:LongInt;
function get_next_value:PChar;
begin
if gv_cnt>=EnvC
Assert(done_init,'Please call cgi_init() first');
if gv_cnt>=cgiEnvC
then
Exit(Nil);
with EnvP[gv_cnt] do
with cgiEnvP[gv_cnt] do
begin
if gv_cnt_n>=NbrValues
then
@ -310,9 +311,10 @@ end;
function get_value(id: pchar): pchar;
begin
Assert(done_init,'Please call cgi_init() first');
gv_cnt:=0;
gv_cnt_n:=0;
while(gv_cnt<EnvC)and(StrComp(id,EnvP[gv_cnt].Name)<>0)do
while(gv_cnt<cgiEnvC)and(StrComp(id,cgiEnvP[gv_cnt].Name)<>0)do
Inc(gv_cnt);
get_value:=get_next_value;
end;
@ -323,35 +325,32 @@ var
sptr : longint;
cnt : word;
qslen : longint;
begin
qslen:=strlen(QueryString);
if qslen=0 then
begin
Unescape:=#0;
Unescape:=Nil;
get_nodata:=true;
exit;
end
else
get_nodata :=false;
{ skelet fix }
getmem(qunescaped,qslen+1);
if qunescaped=nil then
begin
writeln ('Oh-oh');
halt;
end;
{Escaped chain is usually longer than the unescaped chain}
GetMem(qunescaped,qslen+1);
if qunescaped=nil
then
uncgi_error('UnEscape()','Could not allocate memory');
sptr :=0;
{ for cnt := 0 to qslen do +++++ use while instead of for }
cnt:=0;
while cnt<=qslen do
while cnt<qslen do
begin
case querystring[cnt] of
'+': qunescaped[sptr] := ' ';
'+': qunescaped[sptr]:=' ';
'%': begin
qunescaped[sptr] :=
hexconv(querystring[cnt+1], querystring[cnt+2]);
qunescaped[sptr]:=hexconv(querystring[cnt+1], querystring[cnt+2]);
inc(cnt,2); { <--- not allowed in for loops in pascal }
end;
else
@ -362,16 +361,17 @@ begin
qunescaped[sptr]:=#0;
inc(cnt); { <-- don't forget to increment }
end;
UnEscape:=qunescaped;
UnEscape:=StrNew(qunescaped);
FreeMem(qunescaped,qsLen+1);
end;
Function Chop(QueryString:PChar):Longint;
Function Chop(QueryString:PChar):Cardinal;
var
VarName,VarValue,name_pos,value_pos:PChar;
sz,EnvCC:LongInt;
p:Pointer;
begin
GetMem(EnvP,MaxQuery*SizeOf(TCgiVar));
GetMem(cgiEnvP,MaxQuery*SizeOf(TCgiVar));
name_pos:=QueryString;
value_pos:=QueryString;
repeat
@ -397,19 +397,20 @@ Function Chop(QueryString:PChar):Longint;
StrLCopy(VarValue,value_pos,sz);
EnvCC:=0;
repeat
with EnvP[EnvCC] do
with cgiEnvP[EnvCC] do
begin
if EnvCC=EnvC
if EnvCC=cgiEnvC
then
begin
if EnvC>=MaxQuery
if cgiEnvC>=MaxQuery
then
uncgi_error('cgi_read_get_query()','Your are trying to use more than max varaibles allowed! Please change value of "MaxQuery" and recompile your program')
else
begin
Name:=UnEscape(VarName);
GetMem(Value,MaxQuery*SizeOf(PChar));
Inc(EnvC);
NbrValues:=0;
Inc(cgiEnvC);
end;
end;
if StrComp(VarName,Name)=0
@ -431,8 +432,8 @@ Function Chop(QueryString:PChar):Longint;
Inc(EnvCC);
until false;
until name_pos=Nil;
for EnvCC:=0 to EnvC-1 do
with EnvP[EnvCC] do
for EnvCC:=0 to cgiEnvC-1 do
with cgiEnvP[EnvCC] do
begin
p:=Value;
sz:=NbrValues*SizeOf(PChar);
@ -440,12 +441,12 @@ Function Chop(QueryString:PChar):Longint;
Move(p^,Value^,sz);
FreeMem(p,MaxQuery*SizeOf(PChar));
end;
p:=EnvP;
sz:=EnvC*SizeOf(TCgiVar);
GetMem(EnvP,sz);
Move(p^,EnvP^,sz);
p:=cgiEnvP;
sz:=cgiEnvC*SizeOf(TCgiVar);
GetMem(cgiEnvP,sz);
Move(p^,cgiEnvP^,sz);
FreeMem(p,MaxQuery*SizeOf(TCgiVar));
Chop:=EnvC;
Chop:=Abs(cgiEnvC);
end;
procedure cgi_read_get_query;
@ -468,7 +469,7 @@ begin
get_nodata :=false;
query_read:=Chop(QueryString);
end;
done_init :=true;
StrDispose(QueryString);
end;
procedure cgi_read_post_query;
@ -493,21 +494,21 @@ begin
while sptr<>qslen do
begin
read(ch);
pchar(longint(querystring)+sptr)^ :=ch;
QueryString[sptr]:=ch;
inc(sptr);
end;
{ !!! force null-termination }
pchar(longint(querystring)+sptr)^ :=#0;
QueryString[sptr]:=#0;
query_read:=Chop(QueryString);
end;
end;
done_init :=true;
end;
procedure cgi_init;
var
rmeth : pchar;
begin
Assert(NOT done_init,'cgi_init() was already called');
query_read:=0;
rmeth :=http_request_method;
if rmeth=nil then
@ -518,23 +519,27 @@ begin
if strcomp('POST',rmeth)=0 then cgi_read_post_query else
if strcomp('GET',rmeth)=0 then cgi_read_get_query else
uncgi_error('cgi_init()','No REQUEST_METHOD passed from server!');
done_init :=true;
end;
procedure cgi_deinit;
var
i,j:LongInt;
begin
done_init :=false;
query_read :=0;
for i:=0 to EnvC-1 do
with EnvP[i] do
Assert(done_init,'Please call cgi_init() first');
if cgiEnvC=0
then
Exit;
for i:=0 to cgiEnvC-1 do
with cgiEnvP[i] do
begin
StrDispose(Name);
for j:=0 to NbrValues-1 do
StrDispose(Value[j]);
FreeMem(Value,NbrValues*SizeOf(PChar));
end;
FreeMem(EnvP,EnvC*SizeOf(TCgiVar));
EnvC:=0;
FreeMem(cgiEnvP,cgiEnvC*SizeOf(TCgiVar));
cgiEnvC:=0;
end;
@ -553,14 +558,22 @@ begin
InitWin32CGI;
{$endif}
uncgi_error:=@def_uncgi_error;
cgi_deinit;
done_init :=false;
end.
{
HISTORY
$Log$
Revision 1.11 2003-05-29 08:58:45 michael
Revision 1.12 2003-07-16 12:56:03 mazen
+ using Assert to monitor done_init and get state of
un_cgi initailization
* renaming EnvP and EnvC to cgiEnvP and cgiEnvP
to avoid confusion with regular EnvP and EnvC
varaibles especially under win32 target
* set_contents get parameter by address (const)
Revision 1.11 2003/05/29 08:58:45 michael
+ Fixed inline error when building
Revision 1.10 2003/05/27 20:50:18 mazen