| version 1.2, 1999/11/18 00:54:17 |
version 1.7, 2003/11/23 13:16:30 |
|
|
| /*$OpenXM$ */ |
/*$OpenXM: OpenXM/src/kan96xx/plugin/file2.c,v 1.6 2003/11/18 11:08:27 takayama Exp $ */ |
| #include <stdio.h> |
#include <stdio.h> |
| #include <sys/time.h> |
#include <sys/time.h> |
| #include <sys/types.h> |
#include <sys/types.h> |
| #include <unistd.h> |
#include <unistd.h> |
| #include "file2.h" |
#include "file2.h" |
| |
|
| |
/* If you use file2 standalone to output string, |
| |
make the following dummy definition; |
| |
int KsocketSelect0(int a,int b) { return(0); } |
| |
int oxSocketSelect0(int a,int b) { return(0); } |
| |
or define FORSTRING |
| |
*/ |
| |
#ifdef FORSTRING |
| |
#define KsocketSelect0(a,b) 0 |
| |
#define oxSocketSelect0(a,b) 0 |
| |
#endif |
| |
|
| #ifdef KXX |
#ifdef KXX |
| #define GC_malloc(n) malloc(n) |
#define GC_malloc(n) malloc(n) |
| #else |
#else |
| Line 19 int WatchStream = 0; |
|
| Line 30 int WatchStream = 0; |
|
| |
|
| static int debug1 = 0; |
static int debug1 = 0; |
| static int checkfp2(FILE2 *fp2,char *s); |
static int checkfp2(FILE2 *fp2,char *s); |
| |
static int fp2fputcString(int c,FILE2 *fp2); |
| static int checkfp2(FILE2 *fp2,char *s) |
static int checkfp2(FILE2 *fp2,char *s) |
| { |
{ |
| if (fp2 == NULL) { |
if (fp2 == NULL) { |
| Line 38 FILE2 *fp2open(int fd) { |
|
| Line 50 FILE2 *fp2open(int fd) { |
|
| printf("fp2open is called. \n"); |
printf("fp2open is called. \n"); |
| } |
} |
| fp2 = (FILE2 *) GC_malloc(sizeof(FILE2)); |
fp2 = (FILE2 *) GC_malloc(sizeof(FILE2)); |
| if (fd < 0) { |
if (fd < -1) { |
| fprintf(stderr,"fp2open Invalid file descriptor %d\n",fd); |
fprintf(stderr,"fp2open Invalid file descriptor %d\n",fd); |
| return(NULL); |
return(NULL); |
| } |
} |
| |
/* fd == -1 ==> store in string. */ |
| if (fp2 == NULL) { |
if (fp2 == NULL) { |
| fprintf(stderr,"fp2open. No memory.\n"); |
fprintf(stderr,"fp2open. No memory.\n"); |
| return(NULL); |
return(NULL); |
| Line 53 FILE2 *fp2open(int fd) { |
|
| Line 66 FILE2 *fp2open(int fd) { |
|
| fp2->readsize = 0; |
fp2->readsize = 0; |
| fp2->writepos = 0; |
fp2->writepos = 0; |
| fp2->limit = FILE2BSIZE; |
fp2->limit = FILE2BSIZE; |
| |
fp2->readBuf = (char *) GC_malloc(FILE2BSIZE); |
| |
fp2->writeBuf = (char *) GC_malloc(FILE2BSIZE); |
| |
if ((fp2->readBuf == NULL) || (fp2->writeBuf == NULL)) { |
| |
fprintf(stderr,"fp2open. No more memory.\n"); |
| |
return(NULL); |
| |
} |
| fp2->watch = 0; |
fp2->watch = 0; |
| fp2->watchFile = NULL; |
fp2->watchFile = NULL; |
| fp2->mathcapList = NULL; |
fp2->mathcapList = NULL; |
| |
fp2->log_incomming = NULL; |
| |
fp2->log_outgoing = NULL; |
| return(fp2); |
return(fp2); |
| } |
} |
| |
|
| Line 68 int fp2fflush(FILE2 *fp2) { |
|
| Line 89 int fp2fflush(FILE2 *fp2) { |
|
| printf("--------------------------\n"); |
printf("--------------------------\n"); |
| } |
} |
| if (checkfp2(fp2,"fp2fflush ") == -1) return(-1); |
if (checkfp2(fp2,"fp2fflush ") == -1) return(-1); |
| |
if (fp2->fd == -1) return(0); |
| if (fp2->writepos > 0) { |
if (fp2->writepos > 0) { |
| r = write(fp2->fd,fp2->writeBuf,fp2->writepos); |
r = write(fp2->fd,fp2->writeBuf,fp2->writepos); |
| fp2->writepos = 0; |
fp2->writepos = 0; |
| Line 83 int fp2fflush(FILE2 *fp2) { |
|
| Line 105 int fp2fflush(FILE2 *fp2) { |
|
| int fp2fclose(FILE2 *fp2) { |
int fp2fclose(FILE2 *fp2) { |
| int r; |
int r; |
| if (checkfp2(fp2," fp2fclose ") == -1) return(-1); |
if (checkfp2(fp2," fp2fclose ") == -1) return(-1); |
| |
if (fp2->fd == -1) return(0); |
| r = fp2fflush(fp2); |
r = fp2fflush(fp2); |
| if (r < 0) { |
if (r < 0) { |
| fprintf(stderr,"fp2fclose: flush error.\n"); |
fprintf(stderr,"fp2fclose: flush error.\n"); |
| Line 98 int fp2fputc(int c,FILE2 *fp2) { |
|
| Line 121 int fp2fputc(int c,FILE2 *fp2) { |
|
| printf("fp2 = %x.\n",(int) fp2); |
printf("fp2 = %x.\n",(int) fp2); |
| } |
} |
| if (fp2->watch || WatchStream) { |
if (fp2->watch || WatchStream) { |
| if (fp2->watch) fp = fp2->watchFile; |
if (fp2->watch) fp = fp2->watchFile; |
| else fp = stderr; |
else fp = stderr; |
| |
fprintf(stderr,"put to <%x> ",fp2->fd); /* output the channel for debug */ |
| if (c >= ' ' && c <='z') { |
if (c >= ' ' && c <='z') { |
| fprintf(fp," %2x(%c)-> ",c,c); |
fprintf(fp," %2x(%c)-> ",c& 0xff,c); |
| }else{ |
}else{ |
| fprintf(fp," %2x( )-> ",c); |
fprintf(fp," %2x( )-> ",c& 0xff); |
| } |
} |
| fflush(NULL); |
fflush(NULL); |
| } |
} |
| |
if (fp2->log_outgoing != NULL) fputc(c,fp2->log_outgoing); |
| if (checkfp2(fp2," fp2fputc ") == -1) return(-1); |
if (checkfp2(fp2," fp2fputc ") == -1) return(-1); |
| (fp2->writeBuf)[fp2->writepos] = c; |
(fp2->writeBuf)[fp2->writepos] = c; |
| (fp2->writepos)++; |
(fp2->writepos)++; |
| |
if (fp2->fd == -1) return(fp2fputcString(c,fp2)); |
| if (fp2->writepos < fp2->limit) { |
if (fp2->writepos < fp2->limit) { |
| return(c); |
return(c); |
| }else{ |
}else{ |
| Line 127 int fp2fgetc(FILE2 *fp2) { |
|
| Line 153 int fp2fgetc(FILE2 *fp2) { |
|
| fp2->readpos++; |
fp2->readpos++; |
| c = fp2->readBuf[fp2->readpos -1]; |
c = fp2->readBuf[fp2->readpos -1]; |
| if (fp2->watch || WatchStream) { |
if (fp2->watch || WatchStream) { |
| if (fp2->watch) fp = fp2->watchFile; |
if (fp2->watch) fp = fp2->watchFile; |
| else fp = stderr; |
else fp = stderr; |
| |
fprintf(fp,"get from <%x> ",fp2->fd); /* output the channel for debug*/ |
| if (c >= ' ' && c <= 'z') { |
if (c >= ' ' && c <= 'z') { |
| fprintf(fp," %2x(%c) ",c,c); |
fprintf(fp," %2x(%c) ",c,c); |
| }else{ |
}else{ |
| fprintf(fp," %2x( ) ",c); |
fprintf(fp," %2x( ) ",c); |
| } |
} |
| fflush(NULL); |
fflush(NULL); |
| } |
} |
| |
if (fp2->log_incomming != NULL) fputc(c,fp2->log_incomming); |
| return(c); |
return(c); |
| }else{ |
}else{ |
| |
if (fp2->fd == -1) return(-1); |
| fp2->readpos = 0; |
fp2->readpos = 0; |
| fp2 ->readsize = |
fp2 ->readsize = |
| read(fp2->fd, fp2->readBuf, fp2->limit); |
read(fp2->fd, fp2->readBuf, fp2->limit); |
| if (fp2->readsize == 0) { |
if (fp2->readsize == 0) { |
| if (fp2->watch || WatchStream) { |
if (fp2->watch || WatchStream) { |
| if (fp2->watch) fp = fp2->watchFile; |
if (fp2->watch) fp = fp2->watchFile; |
| else fp = stderr; |
else fp = stderr; |
| fprintf(fp," <%2x ",c); |
fprintf(fp," <%2x ",c); |
| fflush(NULL); |
fflush(NULL); |
| } |
} |
| return(-1); |
return(-1); |
| } |
} |
| Line 157 int fp2fgetc(FILE2 *fp2) { |
|
| Line 186 int fp2fgetc(FILE2 *fp2) { |
|
| } |
} |
| |
|
| int fp2select(FILE2 *fp2, int t) { |
int fp2select(FILE2 *fp2, int t) { |
| |
if (fp2->fd == -1) { |
| |
if (fp2->readpos < fp2->readsize) return(1); |
| |
else return(0); |
| |
} |
| if (fp2->readpos < fp2->readsize) return(1); |
if (fp2->readpos < fp2->readsize) return(1); |
| else { |
else { |
| #ifdef KXX |
#ifdef KXX |
| Line 200 int fp2clearReadBuf(FILE2 *fp2) { |
|
| Line 233 int fp2clearReadBuf(FILE2 *fp2) { |
|
| if (checkfp2(fp2," fp2clearReadBuf ") == -1) { |
if (checkfp2(fp2," fp2clearReadBuf ") == -1) { |
| return(-1); |
return(-1); |
| } |
} |
| |
if (fp2->fd == -1) return(0); |
| |
|
| fp2->readsize=0; fp2->readpos = 0; /* Clear the buffer. */ |
fp2->readsize=0; fp2->readpos = 0; /* Clear the buffer. */ |
| |
|
| Line 217 int fp2clearReadBuf(FILE2 *fp2) { |
|
| Line 251 int fp2clearReadBuf(FILE2 *fp2) { |
|
| if (FD_ISSET(fd,&readfds)) { |
if (FD_ISSET(fd,&readfds)) { |
| n = read(fd,tmp00, TMP00SIZE); |
n = read(fd,tmp00, TMP00SIZE); |
| if (n <= 0) { |
if (n <= 0) { |
| fprintf(stderr,"fp2clearReadBuf: File is closed or read error.\n"); |
fprintf(stderr,"fp2clearReadBuf: File is closed or read error.\n"); |
| return(-1); |
return(-1); |
| } |
} |
| if ( n < TMP00SIZE ) { |
if ( n < TMP00SIZE ) { |
| return(0); |
return(0); |
| } |
} |
| }else { |
}else { |
| return(0); |
return(0); |
| Line 271 int fp2stopWatch(FILE2 *fp2) |
|
| Line 305 int fp2stopWatch(FILE2 *fp2) |
|
| } |
} |
| } |
} |
| |
|
| |
int fp2log(FILE2 *fp,FILE *incomming,FILE *outgoing) { |
| |
fp->log_incomming = incomming; |
| |
fp->log_outgoing = outgoing; |
| |
return 0; |
| |
} |
| |
int fp2stopLog(FILE2 *fp) { |
| |
if (fp->log_incomming != NULL) fclose(fp->log_incomming); |
| |
if (fp->log_outgoing != NULL) fclose(fp->log_outgoing); |
| |
fp->log_incomming = fp->log_outgoing = NULL; |
| |
return 0; |
| |
} |
| |
|
| |
static int fp2fputcString(int c,FILE2 *fp2) { |
| |
unsigned char *newwrite,*newread; |
| |
int newsize; |
| |
int i; |
| |
(fp2->readBuf)[fp2->readsize] = c; |
| |
(fp2->readsize)++; |
| |
if ((fp2->writepos < fp2->limit) && (fp2->readsize < fp2->limit)) return(c); |
| |
if ((fp2->limit)*2 >=0x3000000) { |
| |
fprintf(stderr,"Too big output string.\n"); |
| |
return(-1); |
| |
} |
| |
newsize = (fp2->limit)*2; |
| |
newwrite = (char *)GC_malloc(newsize); |
| |
newread = (char *)GC_malloc(newsize); |
| |
if ((newwrite == NULL) || (newread == NULL)) { |
| |
fprintf(stderr,"fp2fputcString: No more memory.\n"); |
| |
return(-1); |
| |
} |
| |
for (i=0; i<fp2->writepos; i++) { |
| |
newwrite[i] = fp2->writeBuf[i]; |
| |
} |
| |
for (i=0; i<fp2->readsize; i++) { |
| |
newread[i] = fp2->readBuf[i]; |
| |
} |
| |
fp2->writeBuf = newwrite; |
| |
fp2->readBuf = newread; |
| |
fp2->limit = newsize; |
| |
return(c); |
| |
} |
| |
|
| |
char *fp2fcloseInString(FILE2 *fp2, int *sizep) |
| |
{ |
| |
if (fp2->fd == -1) { |
| |
fp2fputc(0,fp2); |
| |
*sizep = fp2->writepos-1; |
| |
return(fp2->writeBuf); |
| |
}else{ |
| |
fprintf(stderr,"fp2fcloseInString is called for a file stream that is not associated to a string.\n"); |
| |
} |
| |
} |
| |
|
| |
/* Sample program FORSTRING |
| |
FILE2 *fp2; |
| |
int c; |
| |
char *s; |
| |
int size; |
| |
fp2 = fp2fopen(-1); |
| |
while ((c = getchar()) != EOF) { |
| |
fp2fputc(c,fp2); |
| |
} |
| |
s = fp2fcloseInString(fp2,&size); |
| |
|
| |
or |
| |
|
| |
while ((c = fp2fgetc(fp2)) != EOF) { |
| |
.... |
| |
} |
| |
*/ |