wtoomey@gara.une.oz (Warren Toomey) (03/27/89)
Here is the first official set of patches to Clam, the shell I posted recently. The patches allow Clam to run under ST Minix, using the Gnu C compiler, and mainly tidied up some of the loose ends in the code. Thanks go to Jwahar Bammi, who sent me the patches! (However, your ST makefile didn't get here, Jwahar; could you post it to the net?!) Every time something is patched, new bugs crop up, so if you do notice Clam behaving strangely, please send me a bug report (plus bug fixes if possible). I think the way Clam exec Bourne shell scripts is still a bit dodgy, so try some out for me. Finally, please apply these patches to Clam, as I will assume that this has been done from now on. Cheers everyone, Warren Toomey (wtoomey@gara.une.oz)
wtoomey@gara.une.oz (Warren Toomey) (03/27/89)
# This is a shell archive. Remove anything before this line, then
# unpack it by saving it in a file and typing "sh file". (Files
# unpacked will be owned by you and have default permissions.)
#
# This archive contains:
# alias.cdif builtin.cdif clex.cdif
echo x - alias.cdif
cat > "alias.cdif" << '//E*O*F alias.cdif//'
*** org/alias.c Fri Mar 10 21:34:29 1989
--- st-gcc/alias.c Fri Mar 10 22:17:01 1989
***************
*** 79,96 ****
if (lex<0)
if (i) /* normal insertion between old and aptr */
{
! new=(struct alias *) malloc (sizeof(struct alias));
old->next=new; /* insert the new alias node */
new->next=aptr;
new->defin=stdefn; /* point at new definition */
! new->a_name=(char *) malloc (strlen(aname)+1);
strcpy(new->a_name,aname);
}
else /* insertion before atop. old=aptr=atop still */
{
! old=(struct alias *) malloc (sizeof(struct alias));
old->next=atop;
! old->a_name=(char *) malloc (strlen(aname)+1);
strcpy(old->a_name,aname);
old->defin=stdefn;
atop=old;
--- 79,96 ----
if (lex<0)
if (i) /* normal insertion between old and aptr */
{
! new=(struct alias *) malloc ((unsigned)(sizeof(struct alias)));
old->next=new; /* insert the new alias node */
new->next=aptr;
new->defin=stdefn; /* point at new definition */
! new->a_name=(char *) malloc ((unsigned)(strlen(aname)+1));
strcpy(new->a_name,aname);
}
else /* insertion before atop. old=aptr=atop still */
{
! old=(struct alias *) malloc ((unsigned)(sizeof(struct alias)));
old->next=atop;
! old->a_name=(char *) malloc ((unsigned)(strlen(aname)+1));
strcpy(old->a_name,aname);
old->defin=stdefn;
atop=old;
***************
*** 107,116 ****
}
else /* alias doesn't exist, append to list. */
{
! new=(struct alias *) malloc (sizeof(struct alias));
new->next=0;
old->next=new;
! new->a_name=(char *) malloc (strlen(aname)+1);
strcpy(new->a_name,aname);
new->defin=stdefn;
}
--- 107,116 ----
}
else /* alias doesn't exist, append to list. */
{
! new=(struct alias *) malloc ((unsigned)(sizeof(struct alias)));
new->next=0;
old->next=new;
! new->a_name=(char *) malloc ((unsigned)(strlen(aname)+1));
strcpy(new->a_name,aname);
new->defin=stdefn;
}
***************
*** 121,128 ****
{
struct adefn *ptr;
! ptr=(struct adefn *) malloc (sizeof(struct adefn));
! ptr->a_line=(char *) malloc (strlen(aline)+1);
strcpy(ptr->a_line,aline);
ptr->nextln=0;
addalias(aname,ptr);
--- 121,128 ----
{
struct adefn *ptr;
! ptr=(struct adefn *) malloc ((unsigned)(sizeof(struct adefn)));
! ptr->a_line=(char *) malloc ((unsigned)(strlen(aline)+1));
strcpy(ptr->a_line,aline);
ptr->nextln=0;
addalias(aname,ptr);
***************
*** 147,161 ****
#endif
if (defn_top)
{
! dptr->nextln=(struct adefn *) malloc (sizeof(struct adefn));
dptr=dptr->nextln;
}
else
{
! defn_top=(struct adefn *) malloc (sizeof(struct adefn));
dptr=defn_top;
}
! dptr->a_line=(char *) malloc (strlen(line)+1);
strcpy(dptr->a_line,line);
}
}
--- 147,161 ----
#endif
if (defn_top)
{
! dptr->nextln=(struct adefn *) malloc ((unsigned)(sizeof(struct adefn)));
dptr=dptr->nextln;
}
else
{
! defn_top=(struct adefn *) malloc ((unsigned)(sizeof(struct adefn)));
dptr=defn_top;
}
! dptr->a_line=(char *) malloc ((unsigned)(strlen(line)+1));
strcpy(dptr->a_line,line);
}
}
//E*O*F alias.cdif//
echo x - builtin.cdif
cat > "builtin.cdif" << '//E*O*F builtin.cdif//'
*** org/builtin.c Fri Mar 10 21:34:31 1989
--- st-gcc/builtin.c Sat Mar 11 01:36:03 1989
***************
*** 6,11 ****
--- 6,16 ----
******************************************************************************/
#include "header.h"
+
+ #ifdef ATARI_ST
+ #define lock _LOCK /* conflicts with libc lock prototype */
+ #endif
+
#define FOUND 0
#define NONEXIST 2
#define NOTEXEC 13
***************
*** 39,46 ****
perror("cd");
#ifndef MINIX
else if (hashed==TRUE) hashpath();
! if (argc==2) argv[1]=(char *) realloc (argv[1],MAXPL);
! else argv[1]=(char *) malloc (MAXPL);
#endif
#ifdef ATT
if (getcwd(argv[1]),MAXPL) vset("cwd",argv[1]);
--- 44,51 ----
perror("cd");
#ifndef MINIX
else if (hashed==TRUE) hashpath();
! if (argc==2) argv[1]=(char *) realloc (argv[1],(unsigned)(MAXPL));
! else argv[1]=(char *) malloc ((unsigned)(MAXPL));
#endif
#ifdef ATT
if (getcwd(argv[1]),MAXPL) vset("cwd",argv[1]);
***************
*** 157,163 ****
redirect(infd,outfd,errfd,ifil,ofil,efil,appnd,bckgnd);
if (alias_defn!=0)
{
! runalias(alias_defn,argc-1,startarg,infd,outfd,errfd,ifil,ofil,efil,appnd,bckgnd);
if (!fromfile) setdown();
exit(0);
}
--- 162,170 ----
redirect(infd,outfd,errfd,ifil,ofil,efil,appnd,bckgnd);
if (alias_defn!=0)
{
! runalias(alias_defn,argc-1,startarg,infd,outfd,errfd,ifil,ofil,efil,
! appnd,bckgnd, FALSE); /* is FALSE ok for piped ?? was */
! /* missing in origonal code */
if (!fromfile) setdown();
exit(0);
}
***************
*** 322,331 ****
--- 329,343 ----
else write(1,"\nKeys are different!\n",21);
}
+ #ifdef __STDC__
+ void alias(int argc, char **argv, int infd, int outfd, int errfd,
+ char *ifil, char *ofil, char *efil, bool appnd, bool bckgnd)
+ #else
void alias(argc,argv,infd,outfd,errfd,ifil,ofil,efil,appnd,bckgnd)
int argc,infd,outfd,errfd;
char *argv[],*ifil,*ofil,*efil;
bool appnd,bckgnd;
+ #endif
{
extern struct adefn *checkalias();
extern void makealias(),makelinealias(),aliaslist(),savealias(),checkjobs();
***************
*** 338,344 ****
FILE *fp;
char line[MAXLL],editor[MAXPL],file[MAXFNL],temp[MAXLL];
int i,pid;
!
if (argc==1)
{
aliaslist();
--- 350,359 ----
FILE *fp;
char line[MAXLL],editor[MAXPL],file[MAXFNL],temp[MAXLL];
int i,pid;
! #ifdef DEBUG
! extern int errno;
! #endif
!
if (argc==1)
{
aliaslist();
***************
*** 575,584 ****
--- 590,604 ----
}
#endif
+ #ifdef __STDC__
+ void logout(int argc, char **argv, int infd, int outfd, int errfd,
+ char *ifil, char *ofil, char *efil, bool appnd, bool bckgnd)
+ #else
void logout(argc,argv,infd,outfd,errfd,ifil,ofil,efil,appnd,bckgnd)
int argc,infd,outfd,errfd;
char *argv[],*ifil,*ofil,*efil;
bool appnd,bckgnd;
+ #endif
{
extern void resetsh(),setdown(),file();
extern bool loginsh;
***************
*** 1175,1179 ****
if (!strcmp(name,"read"))
return(Read);
#endif
! return(0);
}
--- 1195,1199 ----
if (!strcmp(name,"read"))
return(Read);
#endif
! return(NULL);
}
//E*O*F builtin.cdif//
echo x - clex.cdif
cat > "clex.cdif" << '//E*O*F clex.cdif//'
*** org/clex.c Fri Mar 10 21:34:33 1989
--- st-gcc/clex.c Sat Mar 11 01:00:01 1989
***************
*** 24,30 ****
stopflag=1;
}
! void colprint(csa,number,longest)
struct candidates_2 csa[];
int number,longest;
{
--- 24,30 ----
stopflag=1;
}
! static void colprint(csa,number,longest)
struct candidates_2 csa[];
int number,longest;
{
***************
*** 129,135 ****
int i=0,max,looping=1,bltin;
char c;
! buf=(struct stat *) malloc (sizeof(struct stat));
yankprev(line,*pos,word); /* first get the thing we're trying to expand */
/* Look for a slash to see if its a relative path name or current directory.
--- 129,135 ----
int i=0,max,looping=1,bltin;
char c;
! buf=(struct stat *) malloc ((unsigned)(sizeof(struct stat)));
yankprev(line,*pos,word); /* first get the thing we're trying to expand */
/* Look for a slash to see if its a relative path name or current directory.
***************
*** 155,166 ****
{
if (start)
{
! ptr->next=(struct candidates *) malloc (sizeof(struct candidates));
ptr=ptr->next;
}
else
{
! start=(struct candidates *) malloc (sizeof(struct candidates));
ptr=start;
}
ptr->next=0; /* to make sure */
--- 155,166 ----
{
if (start)
{
! ptr->next=(struct candidates *) malloc ((unsigned)(sizeof(struct candidates)));
ptr=ptr->next;
}
else
{
! start=(struct candidates *) malloc ((unsigned)(sizeof(struct candidates)));
ptr=start;
}
ptr->next=0; /* to make sure */
***************
*** 172,183 ****
{
if (start)
{
! ptr->next=(struct candidates *) malloc (sizeof(struct candidates));
ptr=ptr->next;
}
else
{
! start=(struct candidates *) malloc (sizeof(struct candidates));
ptr=start;
}
ptr->next=0; /* to make sure */
--- 172,183 ----
{
if (start)
{
! ptr->next=(struct candidates *) malloc ((unsigned)(sizeof(struct candidates)));
ptr=ptr->next;
}
else
{
! start=(struct candidates *) malloc ((unsigned)(sizeof(struct candidates)));
ptr=start;
}
ptr->next=0; /* to make sure */
***************
*** 211,222 ****
{
if (start)
{
! ptr->next=(struct candidates *) malloc (sizeof(struct candidates));
ptr=ptr->next;
}
else
{
! start=(struct candidates *) malloc (sizeof(struct candidates));
ptr=start;
}
ptr->next=0; /* make sure it's null */
--- 211,222 ----
{
if (start)
{
! ptr->next=(struct candidates *) malloc ((unsigned)(sizeof(struct candidates)));
ptr=ptr->next;
}
else
{
! start=(struct candidates *) malloc ((unsigned)(sizeof(struct candidates)));
ptr=start;
}
ptr->next=0; /* make sure it's null */
***************
*** 251,262 ****
{
if (start)
{
! ptr->next=(struct candidates *) malloc (sizeof(struct candidates));
ptr=ptr->next;
}
else
{
! start=(struct candidates *) malloc (sizeof(struct candidates));
ptr=start;
}
ptr->next=0;
--- 251,262 ----
{
if (start)
{
! ptr->next=(struct candidates *) malloc ((unsigned)(sizeof(struct candidates)));
ptr=ptr->next;
}
else
{
! start=(struct candidates *) malloc ((unsigned)(sizeof(struct candidates)));
ptr=start;
}
ptr->next=0;
***************
*** 266,272 ****
ptr->c_isdir=TRUE;
}
}
! close(pswdp);
}
else /* not ~, search whole path */
{
--- 266,273 ----
ptr->c_isdir=TRUE;
}
}
! /* close(pswdp); */
! fclose(pswdp);
}
else /* not ~, search whole path */
{
***************
*** 284,295 ****
{
if (start)
{
! ptr->next=(struct candidates *) malloc (sizeof(struct candidates));
ptr=ptr->next;
}
else
{
! start=(struct candidates *) malloc (sizeof(struct candidates));
ptr=start;
}
ptr->next=0; /* to make sure */
--- 285,296 ----
{
if (start)
{
! ptr->next=(struct candidates *) malloc ((unsigned)(sizeof(struct candidates)));
ptr=ptr->next;
}
else
{
! start=(struct candidates *) malloc ((unsigned)(sizeof(struct candidates)));
ptr=start;
}
ptr->next=0; /* to make sure */
***************
*** 301,312 ****
{
if (start)
{
! ptr->next=(struct candidates *) malloc (sizeof(struct candidates));
ptr=ptr->next;
}
else
{
! start=(struct candidates *) malloc (sizeof(struct candidates));
ptr=start;
}
ptr->next=0; /* to make sure */
--- 302,313 ----
{
if (start)
{
! ptr->next=(struct candidates *) malloc ((unsigned)(sizeof(struct candidates)));
ptr=ptr->next;
}
else
{
! start=(struct candidates *) malloc ((unsigned)(sizeof(struct candidates)));
ptr=start;
}
ptr->next=0; /* to make sure */
***************
*** 323,334 ****
{
if (start)
{
! ptr->next=(struct candidates *) malloc (sizeof(struct candidates));
ptr=ptr->next;
}
else
{
! start=(struct candidates *) malloc (sizeof(struct candidates));
ptr=start;
}
ptr->next=0; /* make sure it's null */
--- 324,335 ----
{
if (start)
{
! ptr->next=(struct candidates *) malloc ((unsigned)(sizeof(struct candidates)));
ptr=ptr->next;
}
else
{
! start=(struct candidates *) malloc ((unsigned)(sizeof(struct candidates)));
ptr=start;
}
ptr->next=0; /* make sure it's null */
***************
*** 375,380 ****
--- 376,387 ----
write(1,beep,beeplength);
}
+ static int compare(a,b)
+ struct candidates_2 *a,*b;
+ {
+ return(strcmp(a->c_name,b->c_name));
+ }
+
/* The following function is essentially the same as the previous one except
that the candidate list is printed out rather than used to expand the
existing word. It would be possible to put the common code in a separate
***************
*** 407,414 ****
struct stat *buf;
struct alias *aptr;
int i,bltin,max,index=0,maxlength=0,temp,compare();
!
! buf=(struct stat *) malloc (sizeof(struct stat));
if ((pos==0) || (line[pos-1]==' '))
strcpy(word,""); /* nothing there to get */
else
--- 414,422 ----
struct stat *buf;
struct alias *aptr;
int i,bltin,max,index=0,maxlength=0,temp,compare();
! extern int beeplength;
!
! buf=(struct stat *) malloc ((unsigned)(sizeof(struct stat)));
if ((pos==0) || (line[pos-1]==' '))
strcpy(word,""); /* nothing there to get */
else
***************
*** 433,439 ****
for (aptr=atop;aptr;aptr=aptr->next)
if (!strncmp(&word[i+1],aptr->a_name,max))
{
! carray[index].c_name=(char *) malloc (temp=strlen(aptr->a_name)+2);
if (carray[index].c_name!=NULL)
strcpy(carray[index].c_name,aptr->a_name);
else
--- 441,447 ----
for (aptr=atop;aptr;aptr=aptr->next)
if (!strncmp(&word[i+1],aptr->a_name,max))
{
! carray[index].c_name=(char *) malloc ((unsigned)(temp=strlen(aptr->a_name)+2));
if (carray[index].c_name!=NULL)
strcpy(carray[index].c_name,aptr->a_name);
else
***************
*** 448,454 ****
for (bltin=0;builtin_name[bltin];bltin++)
if (!strncmp(&word[i+1],builtin_name[bltin],max))
{
! carray[index].c_name=(char *) malloc (temp=strlen(builtin_name[bltin])+2);
if (carray[index].c_name!=NULL)
strcpy(carray[index].c_name,builtin_name[bltin]);
else
--- 456,462 ----
for (bltin=0;builtin_name[bltin];bltin++)
if (!strncmp(&word[i+1],builtin_name[bltin],max))
{
! carray[index].c_name=(char *) malloc ((unsigned)(temp=strlen(builtin_name[bltin])+2));
if (carray[index].c_name!=NULL)
strcpy(carray[index].c_name,builtin_name[bltin]);
else
***************
*** 487,493 ****
/* Check to see if the chars we typed match so far */
if (!strncmp(&word[i+1],entry->d_name,max))
{
! carray[index].c_name=(char *) malloc (temp=strlen(entry->d_name)+2);
if (carray[index].c_name!=NULL)
strcpy(carray[index].c_name,entry->d_name);
else
--- 495,501 ----
/* Check to see if the chars we typed match so far */
if (!strncmp(&word[i+1],entry->d_name,max))
{
! carray[index].c_name=(char *) malloc ((unsigned)(temp=strlen(entry->d_name)+2));
if (carray[index].c_name!=NULL)
strcpy(carray[index].c_name,entry->d_name);
else
***************
*** 536,542 ****
for (temp=0;dir[temp]!=':' && dir[temp]!=EOS;temp++)
path[temp]=dir[temp];
path[temp]=EOS;
! carray[index].c_name=(char *) malloc (temp+1);
if (carray[index].c_name!=NULL)
strcpy(carray[index].c_name,path);
else
--- 544,550 ----
for (temp=0;dir[temp]!=':' && dir[temp]!=EOS;temp++)
path[temp]=dir[temp];
path[temp]=EOS;
! carray[index].c_name=(char *) malloc ((unsigned)(temp+1));
if (carray[index].c_name!=NULL)
strcpy(carray[index].c_name,path);
else
***************
*** 550,556 ****
carray[index++].c_mode=0;
}
}
! close(pswdp);
}
else /* not ~, search whole path */
{
--- 558,565 ----
carray[index++].c_mode=0;
}
}
! /* close(pswdp); */
! fclose(pswdp);
}
else /* not ~, search whole path */
{
***************
*** 566,572 ****
for (aptr=atop;aptr;aptr=aptr->next)
if (!strncmp(word,aptr->a_name,max))
{
! carray[index].c_name=(char *) malloc (temp=strlen(aptr->a_name)+2);
if (carray[index].c_name!=NULL)
strcpy(carray[index].c_name,aptr->a_name);
else
--- 575,581 ----
for (aptr=atop;aptr;aptr=aptr->next)
if (!strncmp(word,aptr->a_name,max))
{
! carray[index].c_name=(char *) malloc ((unsigned)(temp=strlen(aptr->a_name)+2));
if (carray[index].c_name!=NULL)
strcpy(carray[index].c_name,aptr->a_name);
else
***************
*** 581,587 ****
for (bltin=0;builtin_name[bltin];bltin++)
if (!strncmp(word,builtin_name[bltin],max))
{
! carray[index].c_name=(char *) malloc (temp=strlen(builtin_name[bltin])+2);
if (carray[index].c_name!=NULL)
strcpy(carray[index].c_name,builtin_name[bltin]);
else
--- 590,596 ----
for (bltin=0;builtin_name[bltin];bltin++)
if (!strncmp(word,builtin_name[bltin],max))
{
! carray[index].c_name=(char *) malloc ((unsigned)(temp=strlen(builtin_name[bltin])+2));
if (carray[index].c_name!=NULL)
strcpy(carray[index].c_name,builtin_name[bltin]);
else
***************
*** 610,616 ****
break;
}
temp=strlen(entry->d_name);
! carray[index].c_name=(char *) malloc (temp+1);
if (carray[index].c_name!=NULL)
strcpy(carray[index].c_name,entry->d_name);
else
--- 619,625 ----
break;
}
temp=strlen(entry->d_name);
! carray[index].c_name=(char *) malloc ((unsigned)temp+1);
if (carray[index].c_name!=NULL)
strcpy(carray[index].c_name,entry->d_name);
else
***************
*** 631,637 ****
}
if (index) /* have we found any ?? */
{
! qsort((char *)carray,index,sizeof(struct candidates_2),compare);
colprint(carray,index,maxlength);
/* free up the space */
for (index--;index>=0;index--)
--- 640,646 ----
}
if (index) /* have we found any ?? */
{
! qsort((char *)carray,index,(int)(sizeof(struct candidates_2)),compare);
colprint(carray,index,maxlength);
/* free up the space */
for (index--;index>=0;index--)
***************
*** 643,651 ****
write(1,beep,beeplength);
}
- int compare(a,b)
- struct candidates_2 *a,*b;
- {
- return(strcmp(a->c_name,b->c_name));
- }
--- 652,655 ----
//E*O*F clex.cdif//
exit 0wtoomey@gara.une.oz (Warren Toomey) (03/27/89)
# This is a shell archive. Remove anything before this line, then
# unpack it by saving it in a file and typing "sh file". (Files
# unpacked will be owned by you and have default permissions.)
#
# This archive contains:
# comlined.cdif cx.cdif exec.cdif hash.cdif header.hdif hist.cdif
echo x - comlined.cdif
cat > "comlined.cdif" << '//E*O*F comlined.cdif//'
*** org/comlined.c Fri Mar 10 21:34:35 1989
--- st-gcc/comlined.c Sat Mar 11 03:33:21 1989
***************
*** 16,22 ****
extern char termcapbuf[];
extern FILE *zin,*zout,*fopen();
!
void mputc(c,f,curs)
char c;
FILE *f;
--- 16,22 ----
extern char termcapbuf[];
extern FILE *zin,*zout,*fopen();
! #ifndef ATARI_ST
void mputc(c,f,curs)
char c;
FILE *f;
***************
*** 33,44 ****
--- 33,72 ----
curs[1]++;
}
}
+ #else
+ void mputc(c,f,curs)
+ int c;
+ FILE *f;
+ int curs[];
+ {
+ extern int wid;
+ char cc = c;
+
+ write(f->_file,&cc,1);
+ curs[0]++;
+ if (curs[0]>=wid)
+ {
+ write(f->_file,"\n",1); /* goto start of next line */
+ curs[0]=curs[0]%wid; /* hopefully gives zero */
+ curs[1]++;
+ }
+ }
+ #endif
+ #ifndef ATARI_ST
void oputc(c)
char c;
{
write(zout->_file,&c,1);
}
+ #else
+ int oputc(c)
+ int c;
+ {
+ char cc = c;
+ return write(zout->_file,&cc,1);
+ }
+ #endif
void go(curs,hor,vert)
int curs[],hor,vert;
***************
*** 144,153 ****
--- 172,185 ----
go(curs,horig,vorig);
}
+ #ifdef __STDC__
+ void show(char *line, int *curs, bool clearing)
+ #else
void show(line,curs,clearing)
char *line;
int curs[];
bool clearing;
+ #endif
{
extern int lenprompt;
int pos=0,horig,vorig;
//E*O*F comlined.cdif//
echo x - cx.cdif
cat > "cx.cdif" << '//E*O*F cx.cdif//'
*** org/cx.c Fri Mar 10 21:34:36 1989
--- st-gcc/cx.c Sat Mar 11 05:40:06 1989
***************
*** 16,21 ****
--- 16,22 ----
FILE *pswdp,*fopen();
char pwent[256],username[USERNL],restpath[MAXWL];
int i,j,colon=0;
+ extern char *getlogin();
#ifdef DEBUG
fprintf(stderr,"user_path is %s\n",user_path);
***************
*** 68,80 ****
else
{
fprintf(stderr,"\n%sBad password entry in %s for %s.\n",beep,PASSWD,username);
! close(pswdp);
return(FALSE);
}
break;
}
}
! close(pswdp);
/* this test is a repeat of the one above but will give a different error
message if we can't find a matching username */
if (colon!=5)
--- 69,83 ----
else
{
fprintf(stderr,"\n%sBad password entry in %s for %s.\n",beep,PASSWD,username);
! /* close(pswdp); */
! fclose(pswdp);
return(FALSE);
}
break;
}
}
! /* close(pswdp); */
! fclose(pswdp);
/* this test is a repeat of the one above but will give a different error
message if we can't find a matching username */
if (colon!=5)
//E*O*F cx.cdif//
echo x - exec.cdif
cat > "exec.cdif" << '//E*O*F exec.cdif//'
*** org/exec.c Fri Mar 10 21:34:38 1989
--- st-gcc/exec.c Sat Mar 11 03:03:02 1989
***************
*** 14,20 ****
#ifdef MINIX
extern int errno;
#endif
! extern **environ;
void (*builtin_func)();
struct adefn *alias_defn;
int stopflg,NoIoctl=0;
--- 14,20 ----
#ifdef MINIX
extern int errno;
#endif
! extern char **environ;
void (*builtin_func)();
struct adefn *alias_defn;
int stopflg,NoIoctl=0;
***************
*** 46,57 ****
fprintf(stderr,"set exec\n");
#endif
! termod=(struct sgttyb *) malloc (sizeof(struct sgttyb));
if (ioctl(0,TIOCGETP,termod)) perror("ioctl in setexec");
termod->sg_flags &= (~CBREAK); /* cooked mode */
termod->sg_flags |= ECHO; /* with echo */
if (ioctl(0,TIOCSETN,termod)) perror("ioctl");
! setsigc=(struct tchars *) malloc (sizeof(struct tchars));
if (ioctl(0,TIOCGETC,setsigc)) perror("ioctl");
setsigc->t_intrc=03; /* interrupt ctrl c */
setsigc->t_quitc=034; /* quit ctrl \ */
--- 46,57 ----
fprintf(stderr,"set exec\n");
#endif
! termod=(struct sgttyb *) malloc ((unsigned)(sizeof(struct sgttyb)));
if (ioctl(0,TIOCGETP,termod)) perror("ioctl in setexec");
termod->sg_flags &= (~CBREAK); /* cooked mode */
termod->sg_flags |= ECHO; /* with echo */
if (ioctl(0,TIOCSETN,termod)) perror("ioctl");
! setsigc=(struct tchars *) malloc ((unsigned)(sizeof(struct tchars)));
if (ioctl(0,TIOCGETC,setsigc)) perror("ioctl");
setsigc->t_intrc=03; /* interrupt ctrl c */
setsigc->t_quitc=034; /* quit ctrl \ */
***************
*** 86,92 ****
{
int sig;
! for(sig=1;sig<21;sig++)
signal(sig,SIG_DFL);
}
--- 86,92 ----
{
int sig;
! for(sig=1;sig<NSIG;sig++)
signal(sig,SIG_DFL);
}
***************
*** 111,121 ****
--- 111,127 ----
stopflg=1;
}
+ #ifdef __STDC__
+ void runalias(struct adefn *start, int argc, char **argv, int infd,
+ int outfd, int errfd, char *ifil, char *ofil, char *efil,
+ bool appnd, bool bckgnd, bool piped)
+ #else
void runalias(start,argc,argv,infd,outfd,errfd,ifil,ofil,efil,appnd,bckgnd,piped)
struct adefn *start;
int argc,infd,outfd,errfd;
char *argv[],*ifil,*ofil,*efil;
bool appnd,bckgnd,piped;
+ #endif
{
extern SYM_T intercom();
extern FILE *zin;
***************
*** 170,181 ****
--- 176,197 ----
{
if (stopflg) break;
retval=0;
+ #if 0
+ /* WAS: same problem here as in main.c:fopen() */
act=intercom(line,&pos,&pid,FALSE,NULL,fromfile);
+ #else
+ act=intercom(line,&pos,&pid, &i, FALSE,fromfile);
+ #endif
+
#ifdef DEBUG
fprintf(stderr,"pid returned from intercom is %d for line %s\n",pid,line);
fprintf(stderr,"fileno(zin) is %d\n",fileno(zin));
#endif
+ #if 0
for (i=3;i<=20;i++) if (i!=fileno(zin)) close(i);
+ #else
+ for (i=3;i<=NFILES;i++) if (i!=fileno(zin)) close(i);
+ #endif
if (pid && act!=BCKGND)
retval=waitfor(pid);
#ifndef MINIX
***************
*** 415,424 ****
--- 431,445 ----
umask(cmask);
}
+ #ifdef __STDC__
+ void redirect(int infd, int outfd, int errfd, char *ifil, char *ofil,
+ char *efil, bool appnd, bool bckgnd)
+ #else
void redirect(infd,outfd,errfd,ifil,ofil,efil,appnd,bckgnd)
int infd,outfd,errfd;
char *ifil,*ofil,*efil;
bool appnd,bckgnd;
+ #endif
{
extern char *vget();
int fd,mode,flags;
***************
*** 437,443 ****
--- 458,468 ----
panic("exec.c: dup: stdin");
}
else
+ #ifndef ATARI_ST
if (open(ifil,O_RDONLY,0) == -1)
+ #else
+ if (open(ifil,O_RDONLY) == -1)
+ #endif
{
fprintf(stderr,"Can't open %s\n",ifil);
exit(0);
***************
*** 505,517 ****
mode= 0777;
if (creat(efil,mode)==-1)
{
! write(2,"Can't open ");
write(2,efil,strlen(efil));
exit(0);
}
if (open(efil,flags)==-1)
{
! write(2,"Can't open ");
write(2,efil,strlen(efil));
exit(0);
}
--- 530,542 ----
mode= 0777;
if (creat(efil,mode)==-1)
{
! write(2,"Can't open ", 11);
write(2,efil,strlen(efil));
exit(0);
}
if (open(efil,flags)==-1)
{
! write(2,"Can't open ", 11);
write(2,efil,strlen(efil));
exit(0);
}
***************
*** 527,541 ****
--- 552,576 ----
#endif
}
}
+ #if 0
for (fd=3;fd<20;fd++)
+ #else
+ for (fd=3;fd<NFILES;fd++)
+ #endif
(void) close(fd);
}
+ #ifdef __STDC__
+ int execute(int argc, char **argv, int infd, int outfd, int errfd,
+ char *ifil, char *ofil, char *efil, bool appnd,
+ bool bckgnd, bool piped, int fromfile)
+ #else
int execute(argc,argv,infd,outfd,errfd,ifil,ofil,efil,appnd,bckgnd,piped,fromfile)
int argc,infd,outfd,errfd;
char *argv[],*ifil,*ofil,*efil;
bool appnd,bckgnd,piped;
int fromfile;
+ #endif
{
extern void makenv();
extern char *invokename,*current_alias;
***************
*** 617,625 ****
#endif
for (i=argc;i;i--) argv[i]=argv[i-1];
! argv[1]=(char *) realloc (argv[1],strlen(path)+1);
strcpy(argv[1],path); /* full path for source file */
! argv[0]=(char *) malloc (strlen(DFLTSH)+1);
strcpy(argv[0],DFLTSH);
strcpy(path,DFLTSH);
argc++; /* one more arg for mankind... */
--- 652,660 ----
#endif
for (i=argc;i;i--) argv[i]=argv[i-1];
! argv[1]=(char *) realloc (argv[1],(unsigned)(strlen(path)+1));
strcpy(argv[1],path); /* full path for source file */
! argv[0]=(char *) malloc ((unsigned)(strlen(DFLTSH)+1));
strcpy(argv[0],DFLTSH);
strcpy(path,DFLTSH);
argc++; /* one more arg for mankind... */
//E*O*F exec.cdif//
echo x - hash.cdif
cat > "hash.cdif" << '//E*O*F hash.cdif//'
*** org/hash.c Fri Mar 10 21:34:40 1989
--- st-gcc/hash.c Fri Mar 10 22:04:31 1989
***************
*** 34,40 ****
struct stat *buf;
char fpn[MAXWL];
! buf=(struct stat *) malloc (sizeof(struct stat));
if (nojoin)
stat(dir,buf);
else
--- 34,40 ----
struct stat *buf;
char fpn[MAXWL];
! buf=(struct stat *) malloc ((unsigned)(sizeof(struct stat)));
if (nojoin)
stat(dir,buf);
else
***************
*** 92,98 ****
}
}
/* Having found a blank position we now malloc some space and copy the values */
! hasharray[hashval].name=(char *) malloc (strlen(aptr->a_name)+1);
strcpy(hasharray[hashval].name,aptr->a_name);
hasharray[hashval].exec_ptr.alias_defn=checkalias(aptr->a_name);
hasharray[hashval].type=1;
--- 92,98 ----
}
}
/* Having found a blank position we now malloc some space and copy the values */
! hasharray[hashval].name=(char *) malloc ((unsigned)(strlen(aptr->a_name)+1));
strcpy(hasharray[hashval].name,aptr->a_name);
hasharray[hashval].exec_ptr.alias_defn=checkalias(aptr->a_name);
hasharray[hashval].type=1;
***************
*** 128,134 ****
}
}
/* Having found a blank position we now malloc some space and copy the values */
! hasharray[hashval].name=(char *) malloc (strlen(builtin_name[i])+1);
strcpy(hasharray[hashval].name,builtin_name[i]);
hasharray[hashval].exec_ptr.builtin_fn=checkbuiltins(builtin_name[i]);
hasharray[hashval].type=2;
--- 128,134 ----
}
}
/* Having found a blank position we now malloc some space and copy the values */
! hasharray[hashval].name=(char *) malloc ((unsigned)strlen(builtin_name[i])+1);
strcpy(hasharray[hashval].name,builtin_name[i]);
hasharray[hashval].exec_ptr.builtin_fn=checkbuiltins(builtin_name[i]);
hasharray[hashval].type=2;
***************
*** 248,256 ****
}
/* Having found a blank position we now malloc some space and copy the values */
! hasharray[hashval].name=(char *) malloc (strlen(entry->d_name)+1);
strcpy(hasharray[hashval].name,entry->d_name);
! hasharray[hashval].exec_ptr.dir=(char *) malloc (strlen(dir)+1);
strcpy(hasharray[hashval].exec_ptr.dir,dir);
hasharray[hashval].type=0;
}
--- 248,256 ----
}
/* Having found a blank position we now malloc some space and copy the values */
! hasharray[hashval].name=(char *) malloc ((unsigned)(strlen(entry->d_name)+1));
strcpy(hasharray[hashval].name,entry->d_name);
! hasharray[hashval].exec_ptr.dir=(char *) malloc ((unsigned)(strlen(dir)+1));
strcpy(hasharray[hashval].exec_ptr.dir,dir);
hasharray[hashval].type=0;
}
//E*O*F hash.cdif//
echo x - header.hdif
cat > "header.hdif" << '//E*O*F header.hdif//'
*** org/header.h Fri Mar 10 21:34:41 1989
--- st-gcc/header.h Sat Mar 11 03:27:07 1989
***************
*** 10,16 ****
#else
# include <sgtty.h>
# include <sys/dir.h>
! # include <sys/time.h>
# ifdef SUN
# include <sys/wait.h>
# include <sys/resource.h>
--- 10,20 ----
#else
# include <sgtty.h>
# include <sys/dir.h>
! # ifndef ATARI_ST
! # include <sys/time.h>
! #else
! # include <time.h>
! #endif
# ifdef SUN
# include <sys/wait.h>
# include <sys/resource.h>
***************
*** 60,66 ****
#define DFLTSH "/bin/sh"
/* name of default editor to use for alias creation. */
! #define DFLTED "/usr/local/bin/vi"
/* Sizes of some data structures */
#ifdef MINIX
--- 64,70 ----
#define DFLTSH "/bin/sh"
/* name of default editor to use for alias creation. */
! #define DFLTED "/usr/local/bin/mg"
/* Sizes of some data structures */
#ifdef MINIX
***************
*** 93,99 ****
# ifndef MINIX
# define NUMSIG 27
# else
! # define NUMSIG 19
# endif
#endif
--- 97,107 ----
# ifndef MINIX
# define NUMSIG 27
# else
! # ifdef ATARI_ST
! # define NUMSIG NSIG /* defined in <signal.h> */
! # else
! # define NUMSIG 19
! # endif
# endif
#endif
***************
*** 102,107 ****
--- 110,118 ----
#define UNDEF -1
/* Identification for error codes for metacharacter expansion function */
+ #ifdef OK /* defined somewhere on minixST */
+ #undef OK
+ #endif
#define OK 0
#define SH_ERR -1
#define ST_ERR -2
***************
*** 115,120 ****
--- 126,141 ----
#define DL_ERR -10
typedef enum TS {RDRIN,RDROUT,RDRERR,APPND,PIPE,WORD,ENDLN,SEMI,EQ,ADD,BCKGND,DBLPIPE,DBLAMP,ERRER} SYM_T;
+
+ /* some brain damaged people put these in stdio */
+ #ifdef FALSE
+ #undef FALSE
+ #endif
+
+ #ifdef TRUE
+ #undef TRUE
+ #endif
+
typedef enum bb {FALSE,TRUE} bool;
/* These structures are used to store the alias definitions. */
***************
*** 166,168 ****
--- 187,310 ----
long lastmod;
struct job *next;
};
+
+ #ifdef __STDC__
+ #ifndef __NO_PROTO__
+ void aliaslist(void);
+ void savealias(char *, FILE *);
+ struct adefn *checkalias(char *);
+ void addalias(char *, struct adefn *);
+ void makelinealias(char *, char *);
+ void makealias(char *, FILE *);
+ void delalias(char *);
+
+ void alias(int, char **, int, int, int, char *, char *, char *, bool, bool);
+ void logout(int, char **, int, int, int, char *, char *, char *, bool, bool);
+ void (*checkbuiltins())(char *);
+
+ bool firstword(char *, int);
+ void complete(char *, int *, int *);
+ void nameopt(char *, int, int *);
+
+ void mputc(int, FILE *, int *);
+ int oputc(int);
+ void go(int *, int, int);
+ void backward(int *);
+ void forward(int *);
+ void clrscrn(void);
+ void insert(char *, int, int, int *);
+ void show(char *, int *, bool);
+ void goend(char *, int *, int *);
+ void copyback(char *, int, int *);
+ void delword(char *, int, int *);
+ void backword(char *, int *, int *);
+ void forword(char *, int *, int *);
+ void yanknext(char *, int, char *);
+ void yankprev(char *, int, char *);
+ void clrline(char *, int, int *);
+ void transpose(char *, int, int *);
+ int strip(char *);
+ void tardis(char *, int *, int *);
+ bool getlin(char *, int *, int);
+
+ bool expand_tilde(char *, int *);
+ void help(char *, int, int *);
+
+ void setexec(void);
+ void setbgexec(void);
+ void resetsigdefaults(void);
+ bool findslash(char *);
+ void runalias(struct adefn *, int, char **, int, int, int, char *,
+ char *, char *, bool, bool, bool);
+ int getpath(char *, char *);
+ void panic(char *);
+ int atoo(char *);
+ void setmask(char *);
+ void redirect(int, int, int, char *, char *, char *, bool, bool);
+ int execute(int, char **, int, int, int, char *, char *, char *, bool,
+ bool, bool, int);
+
+ bool getfileline(char *, FILE *, int);
+
+ bool executable(char *, char *, int);
+
+ void savehist(char *, int, int);
+ void loadhist(char *, int *, int, int *);
+ void mprint(char *);
+ void history(char **);
+ bool gethist(char *);
+ char *getnumhist(int);
+ int matchhist(int);
+
+ void joblist(void);
+ struct job *findjob(int);
+ int pidfromjob(int);
+ void addreport(struct job *);
+ int addjob(int, char *, int, bool);
+ void newcurr(void);
+ void rmjob(int);
+ int update(int, int);
+ void checkjobs(void);
+ int waitfor(int);
+ void reportjobs(void);
+ int lengthint(int);
+ void printime(void);
+ void prprompt(int);
+ bool tflagexist(char *, char *);
+ void terminal(void);
+ void graceful(int);
+ void setup(void);
+ void resetsh(void);
+ void setdown(void);
+ void leave_shell(void);
+ int process(int, char **, char *);
+ void file(FILE *, int);
+ void shinit(void);
+ void interact(void);
+ void execstring(int, char **, int);
+
+ void getdir(FILE *, char *);
+ int isanum(char *);
+ int meta(char *, int);
+
+ bool getword(char *, int *, char *, bool );
+ SYM_T retsym(char *, char *, int *, bool );
+ SYM_T intercom(char *, int *, int *, int *, bool , int);
+
+ char *vget(char *);
+ char *vwget(char *, int);
+ bool export(char *, char *);
+ void makenvpath(void);
+ void makenventry(char *);
+ void makenv(void);
+ void vset(char *, char *);
+ void vadd(char *, char *);
+ void vdel(char *);
+ void venvdel(char *);
+ void vprint(void);
+ void venvprint(void);
+ void copyenv(char **, char **);
+ void loadenv(void);
+
+ #endif /* __NO_PROTO__ */
+ #endif /* __STDC__ */
//E*O*F header.hdif//
echo x - hist.cdif
cat > "hist.cdif" << '//E*O*F hist.cdif//'
*** org/hist.c Fri Mar 10 21:34:42 1989
--- st-gcc/hist.c Fri Mar 10 22:02:30 1989
***************
*** 27,40 ****
for (old=ptr=htop;ptr && ptr->hnum!=histnum;old=ptr,ptr=ptr->next);
if (ptr) /* change existing history */
{
! ptr->hline=(char *) realloc (ptr->hline,strlen(line)+1);
strcpy(ptr->hline,line);
}
else
if (htop) /* there is a history, isn't there? */
{
! old->next=ptr=(struct histlist *) malloc (sizeof(struct histlist));
! ptr->hline=(char *) malloc (strlen(line)+1);
strcpy(ptr->hline,line);
ptr->hnum=histnum;
ptr->next=0;
--- 27,40 ----
for (old=ptr=htop;ptr && ptr->hnum!=histnum;old=ptr,ptr=ptr->next);
if (ptr) /* change existing history */
{
! ptr->hline=(char *) realloc (ptr->hline,(unsigned)(strlen(line)+1));
strcpy(ptr->hline,line);
}
else
if (htop) /* there is a history, isn't there? */
{
! old->next=ptr=(struct histlist *) malloc((unsigned)(sizeof(struct histlist)));
! ptr->hline=(char *) malloc ((unsigned)(strlen(line)+1));
strcpy(ptr->hline,line);
ptr->hnum=histnum;
ptr->next=0;
***************
*** 47,54 ****
}
else /* no? well, let's make one then. */
{
! htop=(struct histlist *) malloc (sizeof(struct histlist));
! htop->hline=(char *) malloc (strlen(line)+1);
strcpy(htop->hline,line);
htop->hnum=histnum;
htop->next=0;
--- 47,54 ----
}
else /* no? well, let's make one then. */
{
! htop=(struct histlist *) malloc ((unsigned)(sizeof(struct histlist)));
! htop->hline=(char *) malloc ((unsigned)(strlen(line)+1));
strcpy(htop->hline,line);
htop->hnum=histnum;
htop->next=0;
//E*O*F hist.cdif//
exit 0wtoomey@gara.une.oz (Warren Toomey) (03/27/89)
# This is a shell archive. Remove anything before this line, then
# unpack it by saving it in a file and typing "sh file". (Files
# unpacked will be owned by you and have default permissions.)
#
# This archive contains:
# idoprint.c iscanf.c
echo x - idoprint.c
cat > "idoprint.c" << '//E*O*F idoprint.c//'
#ifdef __RCS_ID__
static char rcsid[] = "$Header: /u5/mnx/gnu/lib/RCS/doprintf.c,v 1.6 89/03/04 04:16:09 bammi Exp $";
#endif /* __RCS_ID__ */
/*
* Log and Header added (03/03/89)
*
* $Log: doprintf.c,v $
* Revision 1.6 89/03/04 04:16:09 bammi
* Fourth release of Gcc Gnulib for MinixST (03/03/89)
*
*/
#include <stdio.h>
/*
* three compile time options:
* STACKUP fetch arguments using *p-- instead of *p++
* NO_LONGD %d and %ld/%D are equal
* NO_FLOAT abort on %e, %f and %g
*/
#ifndef __GNUC__ /* __GNUC__ handles doubles all right */
#define NO_FLOAT
#else
#ifdef __INT_PRINTF__ /* we want an integer only doprintf() in gnu */
#define NO_FLOAT
#endif
#endif
#ifdef NO_FLOAT
#define MAXDIG 11 /* 32 bits in radix 8 */
#else
#define MAXDIG 128 /* this must be enough */
#endif
static char *
_itoa(p, num, radix)
register char *p;
register unsigned num;
register radix;
{
register i;
register char *q;
q = p + MAXDIG;
do {
i = (int)(num % radix);
i += '0';
if (i > '9')
i += 'A' - '0' - 10;
*--q = i;
} while (num = num / radix);
/* bug bug buggy code i = p + MAXDIG - q; */
i = (int)(p - q) + MAXDIG;
do
*p++ = *q++;
while (--i);
return(p);
}
#ifndef NO_LONGD
static char *
_ltoa(p, num, radix)
register char *p;
register unsigned long num;
register radix;
{
register i;
register char *q;
q = p + MAXDIG;
do {
i = (int)(num % radix);
i += '0';
if (i > '9')
i += 'A' - '0' - 10;
*--q = i;
} while (num = num / radix);
i = (int)(p - q) + MAXDIG;
do
*p++ = *q++;
while (--i);
return(p);
}
#endif
#ifndef NO_FLOAT
#ifndef __GNUC__
extern char *_ecvt();
extern char *_fcvt();
extern char *_gcvt();
#else
/*
* deal with floating point formatting
* ++jrb bammi@dsrgsun.ces.cwru.edu
*
* code below does not deal with rounding off digit at precision
* and is probably not as precise as some would want, but its
* good enough for rock & roll.
*
* 12/10/88 added rounding ++jrb
* 02/01/89 corrected buggy rounding code ++jrb
*
*/
#define MAXWIDTH 30 /* chosen arb. */
typedef enum { EFORMAT, FFORMAT, GFORMAT } FORMAT_TYPE;
#ifdef __STDC__
static void _flofmt(char *, double, double, int);
char *itoa(int);
#else
static void _flofmt();
extern char *itoa();
#endif
/* return 5.0E-p */
static double _fleast(p)
register int p;
{
double least = 5.0;
while(--p >= 0) least /= 10.0;
return least;
}
/* #define KLUDGEDIV no longer needed */
static char *_cvt(buf, val, precision, fmt)
char *buf;
double val;
int precision;
FORMAT_TYPE fmt;
{
char mybuf[MAXWIDTH+1];
int pow;
int sign;
double least;
#ifdef KLUDGEDIV
long l;
int i;
#endif
#ifndef __STDC__
extern double _fleast();
#else
double _fleast(int);
#endif
#ifdef DDD
printf("_cvt called\n");
#endif
/* make val +ve record sign */
if(val < 0)
{
sign = 1;
val = -val;
}
else sign = 0;
/* round it off at precision -- add 5.0E-(precision+1) */
least = _fleast(precision+1);
if(least > val)
{
least = 0.0;
precision = MAXWIDTH;
}
else
val += least;
#ifdef DDD
printf("sign %d\n", sign);
#endif
/* convert val to 0.nnn form -- record pow */
pow = 0;
while(val >= 1.0)
{
val /= 10.0;
pow++;
}
#ifdef DDD
puts("pow determined\n");
printf("pow %d precision+pow %d\n", pow, precision+pow);
#endif
if((precision + pow) > MAXWIDTH)
precision -= ((precision + pow) - MAXWIDTH);
_flofmt(mybuf, val, least, precision+pow);
#ifdef DDD
printf("back from flofmt mybuf :%s:\n", mybuf);
#endif
switch(fmt)
{
case EFORMAT:
efmt:
{
register char *p = mybuf, *q = buf;
if(sign) *q++ = '-';
while((*p != '\0') && (*p == '0'))
{
pow -= 1;
p++;
}
if(*p == '\0')
{
while(precision-- > 0)
*q++ = '0';
*q = '\0';
return q;
}
pow -= 1;
*q++ = *p++;
*q++ = '.';
if(*p == '\0')
*q++ = '0';
while(*p != '\0')
*q++ = *p++;
*q++ = 'e';
if(pow >= 0)
*q++ = '+';
else
{
*q++ = '-';
pow = -pow;
}
if(pow < 10)
*q++ = '0';
p = itoa(pow);
while(*p != '\0') *q++ = *p++;
*q = '\0';
return q;
}
case FFORMAT:
ffmt:
{
register char *p = mybuf, *q = buf;
if(sign)
*q++ = '-';
while(pow-- > 0)
*q++ = *p++;
if(*p != '\0')
{
*q++ = '.';
while(*p != '\0')
*q++ = *p++;
}
*q = '\0';
return q;
}
case GFORMAT:
{
register int leading = 0;
register char *p = mybuf;
while(*p != '\0')
if (*p++ == '0') leading++;
/* anyone have a good heuristic to decide between F and E */
/* formats ??? */
if((leading > 6) || (precision > 6) || ((pow+precision) > 10))
goto efmt;
goto ffmt;
}
}
}
/* the formatter for flona -- basic body from pfgutc.c Tos Gcc lib */
static void _flofmt(buf, val, least, precision)
char * buf;
double val, least;
int precision;
{
long int_part;
int i, ndigits;
char digit[MAXWIDTH+2];
#ifdef DDD
printf("\t_flofmt\n");
#endif
for (i = 0 ; i < MAXWIDTH ; i++)
digit[i] = 0;
for (i = 0, ndigits = 0 ;
((val > least) && (ndigits < precision) && (i < MAXWIDTH)); i++)
{
val = val * 10.0;
int_part = val;
val = val - int_part;
digit[i] = int_part;
/* kludge till we get doubles accurate... */
/* -- probably not needed now */
if ((digit[i] > 9) || (digit[i] < 0))
digit[i] = 0;
if (int_part > 0) ndigits = i + 1;
}
#ifdef DDD
printf("\t_loop done ndigits %d precision %d\n", ndigits, precision);
#endif
if(ndigits < precision)
ndigits = precision; /* we have already zero'ed the rest */
if (ndigits > 0) /* were there any? */
{
for (i = 0 ; i < ndigits ; i++)
{
*buf++ = digit[i] + '0';
}
}
*buf = '\0';
}
#endif /* __GNUC__ */
#endif /* NO_FLOAT */
#ifdef STACKUP
#define GETARG(typ) *((typ *)args)--
#else
#define GETARG(typ) *((typ *)args)++
#endif STACKUP
#ifndef TEST
int _doprintf(iop, fmt, args)
#else
int __Ddoprintf(iop, fmt, args)
#endif
FILE *iop;
register char *fmt;
register int *args;
{
char buf[MAXDIG+1]; /* +1 for sign */
register char *p;
register char *s;
register c;
register i;
register short width;
register short ndigit;
register ndfnd;
register ljust;
register zfill;
#ifndef NO_LONGD
register lflag;
register long l;
#endif
register int n_written = 0;
for (;;) {
c = *fmt++;
if (c == 0)
return n_written;
if (c != '%') {
if(putc(c, iop) == EOF)
return EOF;
else
n_written++;
continue;
}
p = buf;
s = buf;
ljust = 0;
if (*fmt == '-') {
fmt++;
ljust++;
}
zfill = ' ';
if (*fmt == '0') {
fmt++;
zfill = '0';
}
for (width = 0;;) {
c = *fmt++;
if (c >= '0' && c <= '9')
c -= '0';
else if (c == '*')
c = GETARG(int);
else
break;
width *= 10;
width += c;
}
ndfnd = 0;
ndigit = 0;
if (c == '.') {
for (;;) {
c = *fmt++;
if (c >= '0' && c <= '9')
c -= '0';
else if (c == '*')
c = GETARG(int);
else
break;
ndigit *= 10;
ndigit += c;
ndfnd++;
}
}
#ifndef NO_LONGD
lflag = 0;
#endif
if (c == 'l' || c == 'L') {
#ifndef NO_LONGD
lflag++;
#endif
if (*fmt)
c = *fmt++;
}
switch (c) {
case 'X':
#ifndef NO_LONGD
lflag++;
#endif
case 'x':
c = 16;
goto oxu;
case 'U':
#ifndef NO_LONGD
lflag++;
#endif
case 'u':
c = 10;
goto oxu;
case 'O':
#ifndef NO_LONGD
lflag++;
#endif
case 'o':
c = 8;
oxu:
#ifndef NO_LONGD
if (lflag) {
p = _ltoa(p, GETARG(long), c);
break;
}
#endif
p = _itoa(p, GETARG(int), c);
break;
case 'D':
#ifndef NO_LONGD
lflag++;
#endif
case 'd':
#ifndef NO_LONGD
if (lflag) {
if ((l = GETARG(long)) < 0) {
*p++ = '-';
l = -l;
}
p = _ltoa(p, l, 10);
break;
}
#endif
if ((i = GETARG(int)) < 0) {
*p++ = '-';
i = -i;
}
p = _itoa(p, i, 10);
break;
#ifdef NO_FLOAT
case 'e':
case 'f':
case 'g':
zfill = ' ';
*p++ = '?';
break;
#else
#ifdef __GNUC__
#ifndef __INT_PRINTF__
case 'e':
if (ndfnd == 0)
ndigit = 6;
ndigit++;
p = _cvt(p, (double)GETARG(double), ndigit, EFORMAT);
break;
case 'f':
if (ndfnd == 0)
ndigit = 6;
p = _cvt(p, (double)GETARG(double), ndigit, FFORMAT);
break;
case 'g':
if (ndfnd == 0)
ndigit = 6;
p = _cvt(p, (double)GETARG(double), ndigit, GFORMAT);
break;
#endif /* __INT_PRINTF__ */
#else
case 'e':
if (ndfnd == 0)
ndigit = 6;
ndigit++;
p = _ecvt(p, GETARG(double), ndigit);
break;
case 'f':
if (ndfnd == 0)
ndigit = 6;
p = _fcvt(p, GETARG(double), ndigit);
break;
case 'g':
if (ndfnd == 0)
ndigit = 6;
p = _gcvt(p, GETARG(double), ndigit);
break;
#endif /* __GNUC__ */
#endif /* NO_FLOAT */
case 'c':
zfill = ' ';
*p++ = GETARG(int);
break;
case 's':
zfill = ' ';
if ((s = GETARG(char *)) == 0)
s = "(null)";
if (ndigit == 0)
ndigit = 32767;
for (p = s; *p && --ndigit >= 0; p++)
;
break;
default:
*p++ = c;
break;
}
i = p - s;
if ((width -= i) < 0)
width = 0;
if (ljust == 0)
width = -width;
if (width < 0) {
if (*s == '-' && zfill == '0') {
if(putc(*s++, iop) == EOF)
return EOF;
else
n_written++;
i--;
}
do
if(putc(zfill, iop) == EOF)
return EOF;
else
n_written++;
while (++width != 0);
}
while (--i >= 0)
if(putc(*s++, iop) == EOF)
return EOF;
else
n_written++;
while (width) {
if(putc(zfill, iop) == EOF)
return EOF;
else
n_written++;
width--;
}
}
return n_written;
}
#ifdef TEST
char b[128];
main()
{
extern long rand();
int i, prec;
double val = 10.624624624624;
for(i = 1; i < 11; i++)
{
_cvt(b, val, i, FFORMAT);
printf("%f %2d %s (%.*f)\n", val, i, b, i, val);
}
}
#ifndef ATARI_ST
char *itoa(i)
int i;
{
static char x[32];
sprintf(x, "%d", i);
return x;
}
#endif
#endif
//E*O*F idoprint.c//
echo x - iscanf.c
cat > "iscanf.c" << '//E*O*F iscanf.c//'
#ifdef __RCS_ID__
static char rcsid[] = "$Header: /u5/mnx/gnu/lib/RCS/scanf.c,v 1.5 89/03/04 04:19:25 bammi Exp $";
#endif /* __RCS_ID__ */
/*
* Log and Header added (03/03/89)
*
* $Log: scanf.c,v $
* Revision 1.5 89/03/04 04:19:25 bammi
* Fourth release of Gcc Gnulib for MinixST (03/03/89)
*
*/
/* scanf - formatted input conversion Author: Patrick van Kleef */
#define __SRC__
/*
* - added %f,%e,%g
* - [scanset] implementation wrote into format string, which is
* obviously a no-no. Changed that real quick.
* - added [0-9] style scansets
* ++jrb bammi@dsrgsun.ces.cwru.edu
*
* 12/10/88 minor bugfix to accept floating #'s of the for .nnnn
* ++jrb
*/
#include <stdio.h>
int scanf (format, args)
CONST char *format;
#ifdef __GNUC__
unsigned long args;
#else
unsigned args;
#endif
{
return _doscanf (0, stdin, format, &args);
}
int fscanf (fp, format, args)
FILE *fp;
CONST char *format;
#ifdef __GNUC__
unsigned long args;
#else
unsigned args;
#endif
{
return _doscanf (0, fp, format, &args);
}
int sscanf (string, format, args)
CONST char *string; /* source of data */
CONST char *format; /* control string */
#ifdef __GNUC__
unsigned long args;
#else
unsigned args;
#endif
{
return _doscanf (1, string, format, &args);
}
union ptr_union {
char *chr_p;
unsigned int *uint_p;
unsigned long *ulong_p;
#ifndef __INT_SCANF__
float *float_p;
double *double_p;
#endif
};
static int ic; /* the current character */
static char *rnc_arg; /* the string or the filepointer */
static rnc_code; /* 1 = read from string, else from FILE */
/* get the next character */
static void rnc ()
{
if (rnc_code) {
if (!(ic = *rnc_arg++))
ic = EOF;
} else
ic = getc ((FILE *) rnc_arg);
}
/*
* unget the current character
*/
static void ugc ()
{
if (rnc_code)
--rnc_arg;
else
ungetc (ic, (FILE *)rnc_arg);
}
/* [01234] style scanset */
static int scn1index(ch, string, endmarker)
char ch;
char *string, *endmarker;
{
while (*string++ != ch)
if (string >= endmarker)
return 0;
return 1;
}
static int scnindex(ch, string, endmarker)
char ch;
char *string, *endmarker;
{
if(((endmarker - string) == 3) && (string[1] == '-'))
/* [0-9] style scanset */
return ((string[0] <= ch) && (ch <= string[2]));
else
return scn1index(ch, string, endmarker);
}
/*
* this is cheaper than iswhite from <ctype.h>
*/
static int iswhite (ch)
int ch;
{
return (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r');
}
static int isdigit (ch)
int ch;
{
return (ch >= '0' && ch <= '9');
}
static int __tolower (ch)
int ch;
{
if (ch >= 'A' && ch <= 'Z')
ch = ch + 'a' - 'A';
return ch;
}
#ifndef __INT_SCANF__
#ifdef __GNUC__
/* eval f * 10**p */
static double _fraise(f, p)
double f;
int p;
{
if(p > 0)
while(p--)
f *= 10.0;
else
while(p++)
f /= 10.0;
return f;
}
#endif
#endif
/*
* the routine that does the job
*/
int _doscanf (code, funcarg, format, argp)
int code; /* function to get a character */
char *funcarg; /* an argument for the function */
char *format; /* the format control string */
union ptr_union *argp; /* our argument list */
{
int done = 0; /* number of items done */
int base; /* conversion base */
long val; /* an integer value */
int sign; /* sign flag */
int do_assign; /* assignment suppression flag */
unsigned width; /* width of field */
int widflag; /* width was specified */
int longflag; /* true if long */
int done_some; /* true if we have seen some data */
int reverse; /* reverse the checking in [...] */
char *endbracket; /* position of the ] in format string */
#ifndef __INT_SCANF__
#ifdef __GNUC__
double fval; /* a double value */
#endif
#endif
rnc_arg = funcarg;
rnc_code = code;
rnc (); /* read the next character */
if (ic == EOF) {
done = EOF;
goto quit;
}
while (1) {
while (iswhite (*format))
++format; /* skip whitespace */
if (!*format)
goto all_done; /* end of format */
if (ic < 0)
goto quit; /* seen an error */
if (*format != '%') {
while (iswhite (ic))
rnc ();
if (ic != *format)
goto all_done;
++format;
rnc ();
++done;
continue;
}
++format;
do_assign = 1;
if (*format == '*') {
++format;
do_assign = 0;
}
if (isdigit (*format)) {
widflag = 1;
for (width = 0; isdigit (*format);)
width = width * 10 + *format++ - '0';
} else
widflag = 0; /* no width spec */
if (longflag = (__tolower (*format) == 'l'))
++format;
if (*format != 'c')
while (iswhite (ic))
rnc ();
done_some = 0; /* nothing yet */
switch (*format) {
case 'o':
base = 8;
goto decimal;
case 'u':
case 'd':
base = 10;
goto decimal;
case 'x':
base = 16;
if (((!widflag) || width >= 2) && ic == '0') {
rnc ();
if (__tolower (ic) == 'x') {
width -= 2;
done_some = 1;
rnc ();
} else {
ugc ();
ic = '0';
}
}
decimal:
val = 0L; /* our result value */
sign = 0; /* assume positive */
if (!widflag)
width = 0xffff; /* very wide */
if (width && ic == '+')
rnc ();
else if (width && ic == '-') {
sign = 1;
rnc ();
}
while (width--) {
if (isdigit (ic) && ic - '0' < base)
ic -= '0';
else if (base == 16 && __tolower (ic) >= 'a' && __tolower (ic) <= 'f')
ic = 10 + __tolower (ic) - 'a';
else
break;
val = val * base + ic;
rnc ();
done_some = 1;
}
if (do_assign) {
if (sign)
val = -val;
if (longflag)
*(argp++)->ulong_p = (unsigned long) val;
else
*(argp++)->uint_p = (unsigned) val;
}
if (done_some)
++done;
else
goto all_done;
break;
case 'c':
if (!widflag)
width = 1;
while (width-- && ic >= 0) {
if (do_assign)
*(argp)->chr_p++ = (char) ic;
rnc ();
done_some = 1;
}
if (do_assign)
argp++; /* done with this one */
if (done_some)
++done;
break;
case 's':
if (!widflag)
width = 0xffff;
while (width-- && !iswhite (ic) && ic > 0) {
if (do_assign)
*(argp)->chr_p++ = (char) ic;
rnc ();
done_some = 1;
}
if (do_assign) /* terminate the string */
*(argp++)->chr_p = '\0';
if (done_some)
++done;
else
goto all_done;
break;
#ifndef __INT_SCANF__
#ifdef __GNUC__
case 'e':
case 'f':
case 'g':
fval = 0.0; /* our result value */
sign = 0; /* assume positive */
if (!widflag)
width = 0xffff; /* very wide */
if (width && ic == '+')
rnc ();
else if (width && ic == '-') {
sign = 1;
rnc ();
}
while (width && isdigit(ic)) {
width--;
fval = fval * 10.0 + (ic - '0');
rnc ();
done_some = 1;
}
if(ic == '.')
{
double factor = 1.0/10.0;
rnc ();
while (--width && isdigit(ic))
{
fval = fval + ((ic - '0') * factor);
factor = factor/10.0;
done_some = 1;
rnc();
}
}
if(sign)
fval = -fval;
sign = 0;
if(((ic == 'E') || (ic == 'e')) && done_some)
{
int pow = 0;
rnc ();
if((ic == '+') || (ic == '-'))
{
if(ic == '-') sign = 1;
width--;
rnc();
}
while(--width && isdigit(ic))
{
pow = pow * 10 + (ic -'0');
rnc();
}
fval = _fraise(fval, (sign == 1)? -pow : pow);
}
if (do_assign) {
if (longflag)
*(argp++)->double_p = fval;
else
*(argp++)->float_p = (float) fval;
}
if (done_some)
++done;
else
goto all_done;
break;
#endif /* __GNUC__ */
#endif /* __INT_SCANF__ */
case '[':
if (!widflag)
width = 0xffff;
if ( *(++format) == '^' ) {
reverse = 1;
format++;
} else
reverse = 0;
endbracket = format;
while ( *endbracket != ']' && *endbracket != '\0')
endbracket++;
if (!*endbracket)
goto quit;
while (width-- && !iswhite (ic) && ic > 0 &&
(scnindex(ic, format, endbracket) ^ reverse)) {
if (do_assign)
*(argp)->chr_p++ = (char) ic;
rnc ();
done_some = 1;
}
if (do_assign) /* terminate the string */
*(argp++)->chr_p = '\0';
if (done_some)
++done;
else
goto all_done;
break;
} /* end switch */
++format;
}
all_done:
if (ic >= 0)
ugc (); /* restore the character */
quit:
return done;
}
#if 0
/* TEST ONLY */
main()
{
int i, n;
float x;
char name[50];
n = scanf("%d%f%s", &i, &x, name);
printf("n = %d i = %d x = %f name = :%s:\n", n, i, x, name);
/* input: 54.32E-1 thompson */
/* output: n = 3 i = 25 x = 5.432000 name = :thompson: */
n = scanf("%2d%f%*d %[0-9]", &i, &x, name);
printf("n = %d i = %d x = %f name = :%s:\n", n, i, x, name);
/* input: 56789 0123 56a72 */
/* output: n = 4 i = 56 x = 789.000000 name = :56: */
n = scanf("%s", name);
printf("n = %d name = :%s:\n", n, name);
/* output: n = 1 name = :a72: */
n = scanf("%2d%f%*d %[0123456789]", &i, &x, name);
printf("n = %d i = %d x = %f name = :%s:\n", n, i, x, name);
/* input: 56789 0123 56a72 */
/* output: n = 4 i = 56 x = 789.000000 name = :56: */
/* 'a72' left over */
n = scanf("%s", name);
printf("n = %d name = :%s:\n", n, name);
/* output: n = 1 name = :a72: */
}
#endif /* test only */
//E*O*F iscanf.c//
exit 0wtoomey@gara.une.oz (Warren Toomey) (03/27/89)
# This is a shell archive. Remove anything before this line, then
# unpack it by saving it in a file and typing "sh file". (Files
# unpacked will be owned by you and have default permissions.)
#
# This archive contains:
# job.cdif login.cdif main.cdif
echo x - job.cdif
cat > "job.cdif" << '//E*O*F job.cdif//'
*** org/job.c Fri Mar 10 21:34:43 1989
--- st-gcc/job.c Sat Mar 11 01:22:03 1989
***************
*** 94,100 ****
#endif
if (i)
{
! old->next=ptr=(struct job *) malloc (sizeof(struct job));
if (ptr==0)
{
write(2,"Malloc failed. Cannot add report.\n",34);
--- 94,100 ----
#endif
if (i)
{
! old->next=ptr=(struct job *) malloc ((unsigned)(sizeof(struct job)));
if (ptr==0)
{
write(2,"Malloc failed. Cannot add report.\n",34);
***************
*** 104,110 ****
}
else
{
! exitop=(struct job *) malloc (sizeof(struct job));
if (exitop==0)
{
write(2,"Malloc failed. Cannot add report.\n",34);
--- 104,110 ----
}
else
{
! exitop=(struct job *) malloc ((unsigned)(sizeof(struct job)));
if (exitop==0)
{
write(2,"Malloc failed. Cannot add report.\n",34);
***************
*** 116,127 ****
ptr->jobnumber=newone->jobnumber;
ptr->pid=newone->pid;
ptr->status.w_status=newone->status.w_status;
! ptr->name=(char *) malloc (strlen(newone->name)+1);
if (ptr->name)
(void) strcpy(ptr->name,newone->name);
else
write(2,"Malloc failed in addreport.\n",28);
! ptr->dir=(char *) malloc (strlen(newone->dir)+1);
if (ptr->dir)
(void) strcpy(ptr->dir,newone->dir);
else
--- 116,127 ----
ptr->jobnumber=newone->jobnumber;
ptr->pid=newone->pid;
ptr->status.w_status=newone->status.w_status;
! ptr->name=(char *) malloc ((unsigned)(strlen(newone->name)+1));
if (ptr->name)
(void) strcpy(ptr->name,newone->name);
else
write(2,"Malloc failed in addreport.\n",28);
! ptr->dir=(char *) malloc ((unsigned)(strlen(newone->dir)+1));
if (ptr->dir)
(void) strcpy(ptr->dir,newone->dir);
else
***************
*** 132,141 ****
--- 132,145 ----
#endif
}
+ #ifdef __STDC__
+ int addjob(int pid, char *name, int outfd, bool bckgnd)
+ #else
int addjob(pid,name,outfd,bckgnd)
int pid,outfd;
char *name;
bool bckgnd;/* this isn't used yet */
+ #endif
{
int jobno,diff=(-1);
#ifdef UCB
***************
*** 148,154 ****
if (diff<0)
if (jobno!=1) /* insertion between old and ptr */
{
! new=(struct job *) malloc (sizeof(struct job));
if (new==0)
{
write(2,"Malloc failed. Cannot add job.\n",31);
--- 152,158 ----
if (diff<0)
if (jobno!=1) /* insertion between old and ptr */
{
! new=(struct job *) malloc ((unsigned)(sizeof(struct job)));
if (new==0)
{
write(2,"Malloc failed. Cannot add job.\n",31);
***************
*** 160,166 ****
}
else /* insertion before jtop */
{
! old=(struct job *) malloc (sizeof(struct job));
if (old==0)
{
write(2,"Malloc failed. Cannot add job.\n",31);
--- 164,170 ----
}
else /* insertion before jtop */
{
! old=(struct job *) malloc ((unsigned)(sizeof(struct job)));
if (old==0)
{
write(2,"Malloc failed. Cannot add job.\n",31);
***************
*** 171,177 ****
}
else /* append at end */
{
! ptr=(struct job *) malloc (sizeof(struct job));
if (ptr==0)
{
write(2,"Malloc failed. Cannot add job.\n",31);
--- 175,181 ----
}
else /* append at end */
{
! ptr=(struct job *) malloc ((unsigned)(sizeof(struct job)));
if (ptr==0)
{
write(2,"Malloc failed. Cannot add job.\n",31);
***************
*** 182,188 ****
}
ptr->jobnumber=jobno;
ptr->pid=pid;
! ptr->name=(char *) malloc (strlen(name)+1);
if (ptr->name)
(void) strcpy(ptr->name,name);
else
--- 186,192 ----
}
ptr->jobnumber=jobno;
ptr->pid=pid;
! ptr->name=(char *) malloc ((unsigned)(strlen(name)+1));
if (ptr->name)
(void) strcpy(ptr->name,name);
else
***************
*** 190,196 ****
ptr->status.w_status=0;
if (getwd(execdir))
{
! ptr->dir=(char *) malloc (strlen(execdir)+1);
if (ptr->dir)
(void) strcpy(ptr->dir,execdir);
else
--- 194,200 ----
ptr->status.w_status=0;
if (getwd(execdir))
{
! ptr->dir=(char *) malloc ((unsigned)(strlen(execdir)+1));
if (ptr->dir)
(void) strcpy(ptr->dir,execdir);
else
//E*O*F job.cdif//
echo x - login.cdif
cat > "login.cdif" << '//E*O*F login.cdif//'
*** login.c.B Thu Oct 19 03:30:24 1988
--- login.c Thu Mar 11 06:06:49 1989
***************
*** 55,61 ****
setgid (pwd->pw_gid);
setuid (pwd->pw_uid);
chdir (pwd->pw_dir);
! strcpy(pwd->pw_dir, home+5);
if (pwd->pw_shell) {
execle(pwd->pw_shell, "-", (char *) 0, env);
}
--- 55,62 ----
setgid (pwd->pw_gid);
setuid (pwd->pw_uid);
chdir (pwd->pw_dir);
! /* strcpy(pwd->pw_dir, home+5); --bug */
! strcpy(home+5, pwd->pw_dir); /* and fix ++jrb */
if (pwd->pw_shell) {
execle(pwd->pw_shell, "-", (char *) 0, env);
}
//E*O*F login.cdif//
echo x - main.cdif
cat > "main.cdif" << '//E*O*F main.cdif//'
*** org/main.c Fri Mar 10 21:34:44 1989
--- st-gcc/main.c Sat Mar 11 03:13:30 1989
***************
*** 21,27 ****
void printime()
{
! long clock, *time();
struct tm *t, *localtime();
time(&clock);
--- 21,27 ----
void printime()
{
! long clock, time();
struct tm *t, *localtime();
time(&clock);
***************
*** 270,276 ****
/* setup terminal with ioctl calls */
! termod=(struct sgttyb *) malloc (sizeof(struct sgttyb));
if (ioctl(0,TIOCGETP,termod)) /* get the sgttyb struct */
perror("ioctl in setup");
termod->sg_flags |= CBREAK; /* cbreak mode to get each char */
--- 270,276 ----
/* setup terminal with ioctl calls */
! termod=(struct sgttyb *) malloc ((unsigned)(sizeof(struct sgttyb)));
if (ioctl(0,TIOCGETP,termod)) /* get the sgttyb struct */
perror("ioctl in setup");
termod->sg_flags |= CBREAK; /* cbreak mode to get each char */
***************
*** 277,283 ****
termod->sg_flags &= (~ECHO); /* do not echo chars to screen */
if (ioctl(0,TIOCSETP,termod)) /* put it back, modified */
perror("ioctl");
! setsigc=(struct tchars *) malloc (sizeof(struct tchars));
if (ioctl(0,TIOCGETC,setsigc)) /* get the tchars struct */
perror("ioctl");
setsigc->t_intrc=(UNDEF); /* no interrupt or quitting */
--- 277,283 ----
termod->sg_flags &= (~ECHO); /* do not echo chars to screen */
if (ioctl(0,TIOCSETP,termod)) /* put it back, modified */
perror("ioctl");
! setsigc=(struct tchars *) malloc ((unsigned)(sizeof(struct tchars)));
if (ioctl(0,TIOCGETC,setsigc)) /* get the tchars struct */
perror("ioctl");
setsigc->t_intrc=(UNDEF); /* no interrupt or quitting */
***************
*** 300,306 ****
/* now set up signals */
for (i=1;i<=NUMSIG;i++)
! signal(i,SIG_IGN);
signal(SIGQUIT,SIG_DFL); /* allow while debugging */
/*signal(SIGQUIT,SIG_IGN);*/
signal(SIGHUP,SIG_DFL);
--- 300,309 ----
/* now set up signals */
for (i=1;i<=NUMSIG;i++)
! {
! if ( i != SIGKILL ) /* SIGKILL cannot be caught or ignored */
! signal(i,SIG_IGN);
! }
signal(SIGQUIT,SIG_DFL); /* allow while debugging */
/*signal(SIGQUIT,SIG_IGN);*/
signal(SIGHUP,SIG_DFL);
***************
*** 312,319 ****
/* This catches all the serious errors from within the shell, ILL -> SYS */
/* If any program uses these, then the programmer should be shot. */
for (i=4;i<=12;i++)
! signal(i,graceful);
!
#ifndef MINIX
signal(SIGCHLD,checkjobs);
#endif
--- 315,324 ----
/* This catches all the serious errors from within the shell, ILL -> SYS */
/* If any program uses these, then the programmer should be shot. */
for (i=4;i<=12;i++)
! {
! if (i != SIGKILL) /* SIGKILL cannot be caught or ignored */
! signal(i,graceful);
! }
#ifndef MINIX
signal(SIGCHLD,checkjobs);
#endif
***************
*** 345,351 ****
write(2,"Resetting shell\n",16);
#endif
! termod=(struct sgttyb *) malloc (sizeof(struct sgttyb));
if (ioctl(0,TIOCGETP,termod)) /* get the sgttyb struct */
perror("ioctl in resetsh");
termod->sg_flags |= CBREAK; /* cbreak mode to get each char */
--- 350,356 ----
write(2,"Resetting shell\n",16);
#endif
! termod=(struct sgttyb *) malloc ((unsigned)(sizeof(struct sgttyb)));
if (ioctl(0,TIOCGETP,termod)) /* get the sgttyb struct */
perror("ioctl in resetsh");
termod->sg_flags |= CBREAK; /* cbreak mode to get each char */
***************
*** 352,358 ****
termod->sg_flags &= (~ECHO); /* do not echo chars to screen */
if (ioctl(0,TIOCSETN,termod)) /* put it back, modified */
perror("ioctl");
! setsigc=(struct tchars *) malloc (sizeof(struct tchars));
if (ioctl(0,TIOCGETC,setsigc)) /* get the tchars struct */
perror("ioctl");
setsigc->t_intrc=(UNDEF); /* no interrupt or quitting */
--- 357,363 ----
termod->sg_flags &= (~ECHO); /* do not echo chars to screen */
if (ioctl(0,TIOCSETN,termod)) /* put it back, modified */
perror("ioctl");
! setsigc=(struct tchars *) malloc ((unsigned)(sizeof(struct tchars)));
if (ioctl(0,TIOCGETC,setsigc)) /* get the tchars struct */
perror("ioctl");
setsigc->t_intrc=(UNDEF); /* no interrupt or quitting */
***************
*** 401,407 ****
fprintf(stderr,"Setdown terminal\n");
#endif
! termod=(struct sgttyb *) malloc (sizeof(struct sgttyb));
if (ioctl(0,TIOCGETP,termod)) /* get the sgttyb struct */
perror("ioctl in setdown");
termod->sg_flags &= (~CBREAK); /* reset cooked mode */
--- 406,412 ----
fprintf(stderr,"Setdown terminal\n");
#endif
! termod=(struct sgttyb *) malloc ((unsigned)(sizeof(struct sgttyb)));
if (ioctl(0,TIOCGETP,termod)) /* get the sgttyb struct */
perror("ioctl in setdown");
termod->sg_flags &= (~CBREAK); /* reset cooked mode */
***************
*** 408,414 ****
termod->sg_flags |= ECHO; /* echo chars to screen */
if (ioctl(0,TIOCSETP,termod)) /* put it back, modified */
perror("ioctl");
! setsigc=(struct tchars *) malloc (sizeof(struct tchars));
if (ioctl(0,TIOCGETC,setsigc)) /* get the tchars struct */
perror("ioctl");
setsigc->t_intrc=3; /* set interrupt and quitting */
--- 413,419 ----
termod->sg_flags |= ECHO; /* echo chars to screen */
if (ioctl(0,TIOCSETP,termod)) /* put it back, modified */
perror("ioctl");
! setsigc=(struct tchars *) malloc ((unsigned)(sizeof(struct tchars)));
if (ioctl(0,TIOCGETC,setsigc)) /* get the tchars struct */
perror("ioctl");
setsigc->t_intrc=3; /* set interrupt and quitting */
***************
*** 560,567 ****
while (act!=ENDLN && act!=ERRER)
{
retval=0;
! act=intercom(line,&pos,&pid,FALSE,NULL,1); /* call intercom with fromfile set */
for (i=3;i<=20;i++) if (i!=fileno(finp)) close(i);
if (pid && act!=BCKGND)
retval=waitfor(pid);
if (!disable_auto && act==ERRER) exit(1); /* exit on shell syntax error */
--- 565,585 ----
while (act!=ENDLN && act!=ERRER)
{
retval=0;
! #if 0
! /* Was this: appears to be totally wrong */
! act=intercom(line,&pos,&pid,FALSE,NULL,1);
! #else
! act=intercom(line,&pos,&pid,&i ,FALSE,1);
! /* call intercom with fromfile set -- ?? the big question is do we */
! /* really ignore the value of outpfd - i dunno., could'nt make out, */
! /* so i just put in &i, otherwise obviusly this call causes bombs in */
! /* intercom() */
! #endif
! #if 0
for (i=3;i<=20;i++) if (i!=fileno(finp)) close(i);
+ #else
+ for (i=3;i<=NFILES;i++) if (i!=fileno(finp)) close(i);
+ #endif
if (pid && act!=BCKGND)
retval=waitfor(pid);
if (!disable_auto && act==ERRER) exit(1); /* exit on shell syntax error */
***************
*** 585,590 ****
--- 603,610 ----
void shinit()
{
extern void loadenv(),vset(),venvprint();
+ extern int O_faststart;
+
#ifndef MINIX
extern void hashpath();
extern bool hashed;
***************
*** 733,740 ****
while (act!=ENDLN && act!=ERRER)
{
retval=0;
! act=intercom(line,&pos,&pid,FALSE,NULL,0); /* call intercom with fromfile not set */
for (i=3;i<=20;i++) close(i);
if (pid && act!=BCKGND)
retval=waitfor(pid);
#ifndef MINIX
--- 753,769 ----
while (act!=ENDLN && act!=ERRER)
{
retval=0;
! #if 0
! /* WAS: same intercom problem as in file() here */
! act=intercom(line,&pos,&pid,FALSE,NULL,0);
! #else
! act=intercom(line,&pos,&pid, &i, FALSE,0); /* call intercom with fromfile not set */
! #endif
! #if 0
for (i=3;i<=20;i++) close(i);
+ #else
+ for (i=3;i<=NFILES;i++) close(i);
+ #endif
if (pid && act!=BCKGND)
retval=waitfor(pid);
#ifndef MINIX
***************
*** 765,771 ****
char *argv[];
{
extern SYM_T intercom();
! extern int O_echoexp,meta();
SYM_T act;
char line[MAXLL];
int i,pos,retval,pid;
--- 794,800 ----
char *argv[];
{
extern SYM_T intercom();
! extern int O_echoexp,O_exiterror,meta();
SYM_T act;
char line[MAXLL];
int i,pos,retval,pid;
***************
*** 790,797 ****
--- 819,835 ----
while (act!=ENDLN && act!=ERRER)
{
retval=0;
+ #if 0
+ /* WAS: sample problem */
act=intercom(line,&pos,&pid,FALSE,NULL,0); /* call intercom with fromfile not set */
+ #else
+ act=intercom(line,&pos,&pid, &i,FALSE,0); /* call intercom with fromfile not set */
+ #endif
+ #if 0
for (i=3;i<=20;i++) close(i);
+ #else
+ for (i=3;i<=NFILES;i++) close(i);
+ #endif
if (pid && act!=BCKGND)
retval=waitfor(pid);
#ifndef MINIX
***************
*** 816,822 ****
extern void copyenv();
extern char *invokename,**arguments,**environ,*newenv[];
extern FILE *zin,*zout;
! extern int fromfile,numargs;
char filename[MAXFNL];
int argp;
--- 854,860 ----
extern void copyenv();
extern char *invokename,**arguments,**environ,*newenv[];
extern FILE *zin,*zout;
! extern int fromfile,numargs, O_execstring;
char filename[MAXFNL];
int argp;
//E*O*F main.cdif//
exit 0wtoomey@gara.une.oz (Warren Toomey) (03/27/89)
# This is a shell archive. Remove anything before this line, then
# unpack it by saving it in a file and typing "sh file". (Files
# unpacked will be owned by you and have default permissions.)
#
# This archive contains:
# meta.cdif parse.cdif readme.st var.cdif
echo x - meta.cdif
cat > "meta.cdif" << '//E*O*F meta.cdif//'
*** org/meta.c Fri Mar 10 21:34:46 1989
--- st-gcc/meta.c Sat Mar 11 05:52:44 1989
***************
*** 16,21 ****
--- 16,27 ----
bool Curly,Pattern,Shriek,Bquote,Tilde,Caret,Dollar;
char *matchers[MAXARG];
int mindex;
+ /* forward decl */
+ #ifndef __STDC__
+ static int matchdir();
+ #else
+ static int matchdir(char *directory, char *pattern);
+ #endif
static
void prefilter(line)
***************
*** 610,616 ****
strcat(where,"/");
}
strcat(where,string);
! matchers[mindex]=(char *) malloc (strlen(where)+1);
strcpy(matchers[mindex++],where);
return(OK);
}
--- 616,622 ----
strcat(where,"/");
}
strcat(where,string);
! matchers[mindex]=(char *) malloc ((unsigned)(strlen(where)+1));
strcpy(matchers[mindex++],where);
return(OK);
}
***************
*** 703,709 ****
mindex=0;nopat=0;
if (!(err=matchdir(dir,word))) m_err=OK;
else lasterr=err; /* keep record of last error */
! qsort((char *)matchers,mindex,sizeof(char *),cmp);
for (k=0;k<mindex;k++)
{
strcat(newline," ");
--- 709,715 ----
mindex=0;nopat=0;
if (!(err=matchdir(dir,word))) m_err=OK;
else lasterr=err; /* keep record of last error */
! qsort((char *)matchers,mindex,(int)sizeof(char *),cmp);
for (k=0;k<mindex;k++)
{
strcat(newline," ");
***************
*** 794,800 ****
}
}
! isanum(string)
char *string;
{
int i;
--- 800,806 ----
}
}
! int isanum(string)
char *string;
{
int i;
***************
*** 934,940 ****
break;
}
if (getname(line,&i,username)==FALSE)
! strncpy(username,getenv("USER"),USERNL);
i--; /* put back the pointer */
if ((passwdp=fopen(PASSWD,"r"))==NULL)
{
--- 940,962 ----
break;
}
if (getname(line,&i,username)==FALSE)
! #if 0
! /* WAS: strncpy(username,getenv("USER"),USERNL); */
! #else
! { /* on the ST $USER is not set! so i */
! /* discov'ed this little bug */
! extern char *getlogin(), *getenv();
! register char *p;
! if((p = getenv("USER")) == (char *)NULL)
! if((p = getlogin()) == (char *)NULL)
! {
! fprintf(stderr, "Cannot determine USER\n");
! return(TL_ERR);
! }
! strncpy(username,p ,USERNL);
! }
! #endif
!
i--; /* put back the pointer */
if ((passwdp=fopen(PASSWD,"r"))==NULL)
{
***************
*** 958,970 ****
else
{
fprintf(stderr,"Bad passwd entry for %s.\n",username);
! close(passwdp);
return(TL_ERR);
}
break;
}
}
! close(passwdp);
/* This test is a repeat of the one above but will give a different error
message if we can't find a matching username */
if (colon!=5)
--- 980,994 ----
else
{
fprintf(stderr,"Bad passwd entry for %s.\n",username);
! /* close(passwdp); */
! fclose(passwdp);
return(TL_ERR);
}
break;
}
}
! /* close(passwdp); */
! fclose(passwdp);
/* This test is a repeat of the one above but will give a different error
message if we can't find a matching username */
if (colon!=5)
//E*O*F meta.cdif//
echo x - parse.cdif
cat > "parse.cdif" << '//E*O*F parse.cdif//'
*** org/parse.c Fri Mar 10 21:34:48 1989
--- st-gcc/parse.c Sat Mar 11 00:06:52 1989
***************
*** 11,21 ****
--- 11,25 ----
extern FILE *zin,*zout,*fopen();
extern int lenprompt,curr_hist,wid;
+ #ifdef __STDC__
+ bool getword(char *line, int *pos, char *word, bool allow_slash_or_bracket)
+ #else
bool getword(line,pos,word,allow_slash_or_bracket)
char *line,*word;
int *pos;
bool allow_slash_or_bracket;
/* if true then / and [ are not word delimiters */
+ #endif
{
int inword=0,l=1,i=0;
***************
*** 52,61 ****
--- 56,69 ----
return(TRUE);
}
+ #ifdef __STDC__
+ SYM_T retsym(char *line, char *word, int *pos, bool allow_colon)
+ #else
SYM_T retsym(line,word,pos,allow_colon)
char *line,*word;
int *pos;
bool allow_colon;
+ #endif
{
/*extern char *vget(),*vwget();*/
char c,vname[VARNL];
***************
*** 190,200 ****
--- 198,213 ----
}
}
+ #ifdef __STDC__
+ SYM_T intercom(char *line, int *pos, int *wpid, int *outpfd,
+ bool pipedin, int fromfile)
+ #else
SYM_T intercom(line,pos,wpid,outpfd,pipedin,fromfile)
char *line;
int *pos,*wpid,*outpfd; /* pointers so we can change the value */
bool pipedin;
int fromfile;
+ #endif
{
char word[MAXWL], /* max word length */
ifile[MAXFNL],ofile[MAXFNL],efile[MAXFNL], /* max filename length */
***************
*** 257,263 ****
write(2,"Too many arguments.\n",20);
return(ERRER);
}
! if ((argv[argc]=(char *) malloc (strlen(word)+1))==NULL)
{
write(2,"Cannot allocate any memory for arguments.\n",42);
return(ERRER);
--- 270,277 ----
write(2,"Too many arguments.\n",20);
return(ERRER);
}
! if ((argv[argc]=(char *) malloc
! ((unsigned)(strlen(word)+1)))==NULL)
{
write(2,"Cannot allocate any memory for arguments.\n",42);
return(ERRER);
//E*O*F parse.cdif//
echo x - readme.st
cat > "readme.st" << '//E*O*F readme.st//'
Thanks to Warren Toomey (wtoomey@gara.une.oz) && Callum Gibson
for posting Clam (a much needed shell, sh drives me up the wall).
Here are diffs and additional files to build clam for atariST minix
I only compiled with Gnu gcc, others may want to try ACK cc, but I
believe that I caught most of the stuff required (see second note below)
NOTES:
- gcc users *must* ensure that they have <std.h> installed
(distributed with gcc V1.34)
if <std.h> is not included (<stdio.h> does this for you)
then the code is missing many essential extern declarations
that will lead to pointer/integer problems. If you are
adventurous enough to use ACK, then you will probably have
to determine all the extern declarations required.
- if you want to make Clam your login shell, then the diff
enclosed below in login.cdif must be applied to
/usr/src/commands/login.c, and login recompiled and
installed in /bin/login. This diff fixes the bug where
login was not setting the environment var HOME properly.
If you do not do this, you'll end up witha signal 6, so
you know what you did wrong.
Contents:
readme.st this file
makefile.gcc makefile for minixST gcc
alias.cdif
builtin.cdif
clex.cdif
comlined.cdif
cx.cdif
exec.cdif
hash.cdif Diffs to original Clam
header.hdif
hist.cdif
job.cdif
main.cdif
meta.cdif
parse.cdif
var.cdif
idoprintf.c additional files required for gcc only
iscanf.c
login.cdif diffs to minixST /usr/src/commands/login.c
enjoy,
--
usenet: {decvax,sun}!cwjcc!dsrgsun!bammi jwahar r. bammi
csnet: bammi@dsrgsun.ces.CWRU.edu
arpa: bammi@dsrgsun.ces.CWRU.edu
compuServe: 71515,155
//E*O*F readme.st//
echo x - var.cdif
cat > "var.cdif" << '//E*O*F var.cdif//'
*** org/var.c Fri Mar 10 21:34:49 1989
--- st-gcc/var.c Fri Mar 10 21:44:47 1989
***************
*** 111,122 ****
for (i=0;environ[i];i++)
if (!strncmp(environ[i],"PATH=",5))
{
! environ[i]=(char *) realloc (environ[i],strlen(env)+1);
break;
}
if (!environ[i]) /* if we didn't find an existing one */
{
! environ[i]=(char *) malloc (strlen(env)+1);
environ[i+1]=0;
}
strcpy(environ[i],env);
--- 111,122 ----
for (i=0;environ[i];i++)
if (!strncmp(environ[i],"PATH=",5))
{
! environ[i]=(char *) realloc (environ[i],(unsigned)(strlen(env)+1));
break;
}
if (!environ[i]) /* if we didn't find an existing one */
{
! environ[i]=(char *) malloc ((unsigned)(strlen(env)+1));
environ[i+1]=0;
}
strcpy(environ[i],env);
***************
*** 158,164 ****
#ifdef DEBUG
fprintf(stderr,"strncmp matched\n");
#endif
! environ[i]=(char *) realloc (environ[i],strlen(env)+1);
if (environ[i]==NULL)
{
fprintf(stderr,"vname %s env %s i %d\n",vname,env,i);
--- 158,164 ----
#ifdef DEBUG
fprintf(stderr,"strncmp matched\n");
#endif
! environ[i]=(char *) realloc (environ[i],(unsigned)(strlen(env)+1));
if (environ[i]==NULL)
{
fprintf(stderr,"vname %s env %s i %d\n",vname,env,i);
***************
*** 174,180 ****
#ifdef DEBUG
fprintf(stderr,"Making new environ for %s environ[%d]\n",env,i);
#endif
! environ[i]=(char *) malloc (strlen(env)+1);
environ[i+1]=0;
}
strcpy(environ[i],env);
--- 174,180 ----
#ifdef DEBUG
fprintf(stderr,"Making new environ for %s environ[%d]\n",env,i);
#endif
! environ[i]=(char *) malloc ((unsigned)(strlen(env)+1));
environ[i+1]=0;
}
strcpy(environ[i],env);
***************
*** 232,253 ****
if (lex<0) /* value doesn't exist, make new variable and insert */
if (i) /* normal insertion between old and ptr */
{
! new=(struct vlist *) malloc (sizeof(struct vlist));
old->next=new;
new->next=ptr;
! new->var=(char *) malloc (strlen(vname)+1);
strcpy(new->var,vname);
! new->val=(char *) malloc (strlen(vval)+1);
strcpy(new->val,vval);
new->exported=FALSE;
}
else /* insertion before top, old=ptr=top still. */
{
! old=(struct vlist *) malloc (sizeof(struct vlist));
old->next=top;
! old->var=(char *) malloc (strlen(vname)+1);
strcpy(old->var,vname);
! old->val=(char *) malloc (strlen(vval)+1);
strcpy(old->val,vval);
old->exported=FALSE;
top=old; /* and finally assign new top */
--- 232,253 ----
if (lex<0) /* value doesn't exist, make new variable and insert */
if (i) /* normal insertion between old and ptr */
{
! new=(struct vlist *) malloc ((unsigned)(sizeof(struct vlist)));
old->next=new;
new->next=ptr;
! new->var=(char *) malloc ((unsigned)(strlen(vname)+1));
strcpy(new->var,vname);
! new->val=(char *) malloc ((unsigned)(strlen(vval)+1));
strcpy(new->val,vval);
new->exported=FALSE;
}
else /* insertion before top, old=ptr=top still. */
{
! old=(struct vlist *) malloc ((unsigned)(sizeof(struct vlist)));
old->next=top;
! old->var=(char *) malloc ((unsigned)(strlen(vname)+1));
strcpy(old->var,vname);
! old->val=(char *) malloc ((unsigned)(strlen(vval)+1));
strcpy(old->val,vval);
old->exported=FALSE;
top=old; /* and finally assign new top */
***************
*** 255,271 ****
else
if (lex==0) /* variable already exists, just change value */
{
! ptr->val=(char *) realloc (ptr->val,strlen(vval)+1);
strcpy(ptr->val,vval);
}
else /* value doesn't exist, make new variable and append */
{
! new=(struct vlist *) malloc (sizeof(struct vlist));
new->next=0;
old->next=new;
! new->var=(char *) malloc (strlen(vname)+1);
strcpy(new->var,vname);
! new->val=(char *) malloc (strlen(vval)+1);
strcpy(new->val,vval);
}
--- 255,271 ----
else
if (lex==0) /* variable already exists, just change value */
{
! ptr->val=(char *) realloc (ptr->val,(unsigned)(strlen(vval)+1));
strcpy(ptr->val,vval);
}
else /* value doesn't exist, make new variable and append */
{
! new=(struct vlist *) malloc ((unsigned)(sizeof(struct vlist)));
new->next=0;
old->next=new;
! new->var=(char *) malloc ((unsigned)(strlen(vname)+1));
strcpy(new->var,vname);
! new->val=(char *) malloc ((unsigned)(strlen(vval)+1));
strcpy(new->val,vval);
}
***************
*** 347,353 ****
if (vget(vname)!=(char *)UNDEF)
{
l=strlen(vget(vname));
! newval=(char *) malloc (l+strlen(vval)+1);
sprintf(newval,"%s%s",vget(vname),vval);
vset(vname,newval);
free(newval);
--- 347,353 ----
if (vget(vname)!=(char *)UNDEF)
{
l=strlen(vget(vname));
! newval=(char *) malloc ((unsigned)(l+strlen(vval)+1));
sprintf(newval,"%s%s",vget(vname),vval);
vset(vname,newval);
free(newval);
***************
*** 434,440 ****
for (i=0;envp[i];i++)
{
! newenv[i]=(char *) malloc (strlen(envp[i])+1);
(void) strcpy(newenv[i],envp[i]);
}
newenv[i]=0;
--- 434,440 ----
for (i=0;envp[i];i++)
{
! newenv[i]=(char *) malloc ((unsigned)(strlen(envp[i])+1));
(void) strcpy(newenv[i],envp[i]);
}
newenv[i]=0;
//E*O*F var.cdif//
exit 0