1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
/* LineRead procedure reads lines in ascii files coming from Unix Dos or Mac
* End of line may be \Cr\lf (Dos) \Lf (Unix) \Cr (Mac)
*/
#include <stdio.h>
#include "../machine.h"
#if (defined(sun) && !defined(SYSV)) || defined(sgi)
#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2
#endif
#define CR 13
#define LF 10
FILE *GetFile();
int LineRead(fd,buf,n,cnt,nr)
FILE * fd;
int n;
char buf[];
int *cnt; /* number of charaters returned in buf */
int *nr; /* number of characters read */
{
int c,count,info;
long int offset;
count=0;
*nr=0;
while (1) {
c=fgetc(fd);
*nr=*nr+1;
if (c==LF) { /* LF reached first: unix file */
buf[count++]=(char)0;
info=1; /* EOL reached */
break;
}
else if (c==CR) { /* CR reached first: Dos or Mac file */
c=fgetc(fd);
*nr=*nr+1;
if (c==EOF) {
buf[count++]=(char)0;
info=0;/* EOF reached after an EOL */
break;
}
else if (c==LF) { /* LF after CR : Dos file */
buf[count++]=(char)0;
info=1; /* EOL reached */
break;
}
else if (c!=LF) { /* Mac file */
offset=-1;
fseek(fd,offset,SEEK_CUR);
*nr=*nr-1;
buf[count++]=(char)0;
info=1; /* EOL reached */
break;
}
}
else if (c==EOF) { /* EOF reached before any EOL*/
buf[count++]=(char)0;
if (count==1)
info=-1; /* EOF reached */
else
info=3;
break;
}
else {
buf[count++]=(char)c;
if (count==n-1) {
buf[count++]=(char)0;
info=2; /* buffer full */
break;
}
}
}
*cnt=count;
return(info);
}
void C2F(readnextline)(fd,buf,n,count,nr,ierr)
integer *fd;
integer *n,*nr, *ierr;
char buf[];
integer *count;
{
FILE *fa= GetFile(fd);
*ierr=LineRead(fa,buf,*n,count,nr);
}
|