Article View: alt.msdos.programmer
Article #1157Pascal program works but not C program!
From: Gregary John Boyles
Date: Wed, 03 Jan 1996 11:38
Date: Wed, 03 Jan 1996 11:38
589 lines
17105 bytes
17105 bytes
EMail : boyles@lux.latrobe.edu.au
Why does the Pascal version of this program behave exactly as expected while the
C++ version does not?
******************************* PASCAL VERSION *******************************
program show;
uses crt,dos,crt_,strings;
const maxstring=127;
escape=chr(27);
space=' ';
up='H';
down='P';
pageup='I';
pagedown='Q';
left='K';
right='M';
home='G';
end_='O';
null=chr(0);
type nodetypeptr=^nodetype;
nodetype=record
fileline:string;
filelinenum:integer;
next,previous:nodetypeptr;
end;
function empty(posptr:nodetypeptr):boolean;
begin
empty:=posptr=nil;
end;
procedure initialize(var listptr:nodetypeptr);
begin
listptr:=nil;
end;
procedure add(var listptr:nodetypeptr;fileline:string;filelinenum:integer);
var newptr,tempptr:nodetypeptr;
begin
new(newptr);
newptr^.fileline:=fileline;
newptr^.filelinenum:=filelinenum;
if (listptr=nil) then
begin
(listptr):=newptr;
(listptr)^.next:=nil;
(listptr)^.previous:=nil;
end
else
begin
tempptr:=listptr;
while (tempptr^.next<>nil) do
begin
tempptr:=tempptr^.next;
end;
tempptr^.next:=newptr;
newptr^.next:=nil;
newptr^.previous:=tempptr;
end;
end;
procedure remove(var listptr:nodetypeptr);
var tempptr:nodetypeptr;
begin
tempptr:=listptr;
listptr:=listptr^.next;
listptr^.previous:=nil;
dispose(tempptr);
end;
procedure setpos(var posptr:nodetypeptr;filelinenum:integer);
begin
while (posptr^.filelinenum<>filelinenum) do
begin
if (posptr^.filelinenum>filelinenum) then
begin
posptr:=posptr^.previous;
end
else if (posptr^.filelinenum<filelinenum) then
begin
posptr:=posptr^.next;
end;
end;
end;
procedure writescreenfull(width,height:word;posptr:nodetypeptr;stringpos:word);
var y,i:word;
line1:string;
begin
window(1,1,width,height);
clrscr;
window(1,1,width,height+1);
y:=1;
while (y<=height) and (not empty(posptr^.next)) do
begin
gotoxy(1,y);
i:=stringpos;
while (i<=length(posptr^.fileline)) and ((i-stringpos)<=width) do
begin
write(posptr^.fileline[i]+'');
i:=i+1;
end;
writeln;
posptr:=posptr^.next;
y:=y+1;
end;
end;
procedure main;
var infile:text;
x,width,height,back,fore:word;
ch:char;
numfilelines,filelinenum:integer;
listptr,posptr:nodetypeptr;
fileline,bottomfileline:string;
stringpos:word;
begin
if (paramcount<1) then
begin
writeln;
writeln('Show what . . .');
end
else
begin
{$I-}
assign(infile,paramstr(1));
{$I+}
if (doserror<>0) then
begin
writeln;
write('infile ');
write(paramstr(1));
writeln(' not found . . .');
end
else
begin
reset(infile);
initialize(listptr);
filelinenum:=0;
while (not eof(infile)) do
begin
readln(infile,fileline);
add(listptr,fileline,filelinenum);
filelinenum:=filelinenum+1;;
end;
numfilelines:=filelinenum-1;
close(infile);
posptr:=listptr;
fore:=textattr and $0f;
back:=(textattr and $70) div $10;
height:=hi(windmax);
width:=lo(windmax);
bottomfileline:=' '+chr(24)+' '+chr(25)+' pgup pgdn s "string" : (search for string) esc : (quit)';
for x:=length(bottomfileline)+1 to width do
begin
bottomfileline:=bottomfileline+' ';
end;
set_cursor(none);
clrscr;
textcolor(back);
textbackground(fore);
gotoxy(1,height);
write(bottomfileline);
textcolor(fore);
textbackground(back);
height:=height-1;
filelinenum:=1;
stringpos:=1;
writescreenfull(width,height,posptr,stringpos);
ch:=space;
while (ch<>escape) do
begin
while ((ch<>up) and (ch<>down) and (ch<>pageup) and
(ch<>pagedown) and (ch<>escape) and (ch<>left) and
(ch<>right) and (ch<>end_) and (ch<>home)) do
begin
ch:=readkey;
if (ch=null) then
begin
ch:=readkey;
end;
end;
if (ch=up) then
begin
if ((filelinenum-1)>=1) then
begin
filelinenum:=filelinenum-1;
end
else
begin
filelinenum:=1;
end;
setpos(posptr,filelinenum);
end
else if (ch=down) then
begin
if ((filelinenum+1+height)<=numfilelines) then
begin
filelinenum:=filelinenum+1
end
else
begin
filelinenum:=numfilelines-height+1;
end;
setpos(posptr,filelinenum);
end
else if (ch=pageup) then
begin
if ((filelinenum-height+1)>=1) then
begin
filelinenum:=filelinenum-height+1;
end
else
begin
filelinenum:=1;
end;
setpos(posptr,filelinenum);
end
else if (ch=pagedown) then
begin
if (((filelinenum+height-1)<=numfilelines) and
((numfilelines-(filelinenum+height-1))>=(height-1))) then
begin
filelinenum:=filelinenum+height-1;
end
else
begin
filelinenum:=numfilelines-height+1;
end;
setpos(posptr,filelinenum);
end
else if (ch=left) then
begin
if (stringpos>1) then
begin
stringpos:=stringpos-1;
end;
end
else if (ch=right) then
begin
if (stringpos<=(maxstring-width)) then
begin
stringpos:=stringpos+1;
end;
end
else if (ch=end_) then
begin
stringpos:=maxstring-width+1;
end
else if (ch=home) then
begin
stringpos:=1;
end;
if (ch<>escape) then
begin
ch:=space;
end;
writescreenfull(width,height,posptr,stringpos);
end;
height:=height+1;
window(1,1,width,height);
clrscr;
set_cursor(line);
while (not empty(listptr)) do
begin
remove(listptr);
end;
end;
end;
end;
begin
main;
end.
******************************** C++ VERSION *********************************
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <alloc.h>
#include <process.h>
const maxstring=127;
const lineend='\n';
const escape=27;
const null='\0';
const space=' ';
const up='H';
const down='P';
const pageup='I';
const pagedown='Q';
const left='K';
const right='M';
const home='G';
const end_='O';
typedef char string[maxstring];
typedef struct nodetypetag{string line;int linenum;struct nodetypetag *next,*previous;} nodetype;
typedef nodetype *nodetypeptr;
string line,line_,line1,bottomline;
char empty(nodetypeptr posptr)
{
return(posptr==NULL);
}
void initialize(nodetypeptr *listptr)
{
*listptr=NULL;
}
void add(nodetypeptr *listptr,char *fileline,int Linenum)
{
nodetypeptr newptr,tempptr;
newptr=(nodetypeptr)malloc(sizeof(nodetype));
strcpy(newptr->line,fileline);
newptr->linenum=Linenum;
if (*listptr==NULL)
{
(*listptr)=newptr;
(*listptr)->next=NULL;
(*listptr)->previous=NULL;
}
else
{
tempptr=*listptr;
while (tempptr->next!=NULL)
{
tempptr=tempptr->next;
}
tempptr->next=newptr;
newptr->next=NULL;
newptr->previous=tempptr;
}
}
void remove(nodetypeptr *listptr)
{
nodetypeptr tempptr;
tempptr=*listptr;
*listptr=(*listptr)->next;
(*listptr)->previous=NULL;
free(tempptr);
}
void setpos(nodetypeptr *posptr,int linenum)
{
while ((*posptr)->linenum!=linenum)
{
if ((*posptr)->linenum>linenum)
{
*posptr=(*posptr)->previous;
}
else if ((*posptr)->linenum<linenum)
{
*posptr=(*posptr)->next;
}
}
}
void writescreenfull(char width,char height,nodetypeptr posptr,char stringpos)
{
char y;
window(1,1,width,height);
clrscr();
window(1,1,width,height+1);
y=1;
while ((y<=height) && (!empty(posptr->next)))
{
gotoxy(1,y);
strcpy(line_,posptr->line);
line__=&(line_[stringpos]);
strncpy(line,line__,width-1);
strcat(line,null);
cputs(line);
posptr=posptr->next;
y++;
}
}
void removelineends(char *strings,unsigned int maxstrings)
{
unsigned int i;
i=0;
while ((i<maxstrings) && (strings[i]!=lineend))
{
i++;
}
strings[i]=null;
}
void main(int argc,char *argv[])
{
FILE *file;
char x,ch,width,height,back,fore,stringpos;
int numlines,linenum;
text_info info;
nodetypeptr listptr,posptr;
if (argc<2)
{
cputs("\nShow what . . .\n");
}
else
{
file=fopen(argv[1],"rt");
if (file==NULL)
{
cprintf("\nFile %s not found . . .\n",argv[1]);
}
else
{
rewind(file);
initialize(&listptr);
linenum=0;
while (fgets(line,maxstring,file)!=NULL)
{
removelineends(line,maxstring);
add(&listptr,line,linenum);
linenum++;
}
numlines=linenum--;
fclose(file);
posptr=listptr;
gettextinfo(&info);
fore=info.attribute&0x0f;
back=(info.attribute&0x70)/0x10;
height=info.screenheight;
width=info.screenwidth;
strcpy(bottomline," \30 \31 pgup pgdn s <string> (search for string) esc (quit)");
for(x=strlen(bottomline)+1;x<width;x++)
{
strcat(bottomline," ");
}
_setcursortype(_NOCURSOR);
clrscr();
textcolor(back);
textbackground(fore);
gotoxy(1,height);
cputs(bottomline);
textcolor(fore);
textbackground(back);
height--;
linenum=1;
stringpos=1;
writescreenfull(width,height,posptr,stringpos);
ch=space;
while (ch!=escape)
{
while ((ch!=up) && (ch!=down) && (ch!=pageup) &&
(ch!=pagedown) && (ch!=escape) && (ch!=left) &&
(ch!=right) && (ch!=end_) && (ch!=home))
{
ch=getch();
if (ch==null)
{
ch=getch();
}
}
if (ch==up)
{
if ((linenum-1)>=1)
{
linenum--;
}
else
{
linenum=1;
}
setpos(&posptr,linenum);
}
else if (ch==down)
{
if ((linenum+1+height)<=numlines)
{
linenum++;
}
else
{
linenum=numlines-height+1;
}
setpos(&posptr,linenum);
}
else if (ch==pageup)
{
if ((linenum-height+1)>=1)
{
linenum=linenum-height+1;
}
else
{
linenum=1;
}
setpos(&posptr,linenum);
}
else if (ch==pagedown)
{
if (((linenum+height-1)<=numlines) && ((numlines-(linenum+height-1))>=(height-1)))
{
linenum=linenum+height-1;
}
else
{
linenum=numlines-height+1;
}
setpos(&posptr,linenum);
}
else if (ch==left)
{
if (stringpos>1)
{
stringpos--;
}
}
else if (ch==right)
{
if (stringpos<=(maxstring-width))
{
stringpos++;
}
}
else if (ch==end_)
{
stringpos=maxstring-width+1;
}
else if (ch==home)
{
stringpos=1;
}
if (ch!=escape)
{
ch=space;
}
writescreenfull(width,height,posptr,stringpos);
}
height+=1;
window(1,1,width,height);
clrscr();
_setcursortype(_NORMALCURSOR);
while (!empty(listptr))
{
remove(&listptr);
}
}
}
}
Technical Details
Message-ID:
<4cdpr2$psi@lugb.latrobe.edu.au>Path:
arc1-ca.pugleaf.net!lugb.latrobe.edu.au!lux!cs102238Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!lugb.latrobe.edu.au!lux!cs102238 From: cs102238@lux.latrobe.edu.au (Gregary John Boyles ) Newsgroups: alt.msdos.programmer,comp.lang.c Subject: Pascal program works but not C program! Date: 3 Jan 1996 11:38:10 GMT Organization: La Trobe University Distribution: world Message-ID: <4cdpr2$psi@lugb.latrobe.edu.au> NNTP-Posting-Host: lux.latrobe.edu.au