[BACK]Return to file2.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kan96xx / plugin

Diff for /OpenXM/src/kan96xx/plugin/file2.c between version 1.2 and 1.12

version 1.2, 1999/11/18 00:54:17 version 1.12, 2005/02/28 12:53:44
Line 1 
Line 1 
 /*$OpenXM$ */  /*$OpenXM: OpenXM/src/kan96xx/plugin/file2.c,v 1.11 2004/12/16 08:42:14 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 <signal.h>
   #include <errno.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 sGC_malloc(n) malloc(n)
 #else  #else
 void *GC_malloc(int size);  void *sGC_malloc(int size);
 #endif  #endif
 int WatchStream = 0;  int WatchStream = 0;
 /*  Note:  1997, 12/6   cf. SS475/kxx/openxxx.tex, SS475/memo1.txt  /*  Note:  1997, 12/6   cf. SS475/kxx/openxxx.tex, SS475/memo1.txt
Line 19  int WatchStream = 0;
Line 32  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 37  FILE2 *fp2open(int fd) {
Line 51  FILE2 *fp2open(int fd) {
   if (debug1) {    if (debug1) {
     printf("fp2open is called. \n");      printf("fp2open is called. \n");
   }    }
   fp2 = (FILE2 *) GC_malloc(sizeof(FILE2));    fp2 = (FILE2 *) sGC_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 68  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 *) sGC_malloc(FILE2BSIZE);
     fp2->writeBuf = (char *) sGC_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;
     fp2->popened = 0;
     fp2->pfp = NULL;
   return(fp2);    return(fp2);
 }  }
   
   void fp2setfp(FILE2 *fp2,FILE *fp,int popened) {
     fp2->pfp = fp;
     fp2->popened = popened;
   }
   
 int fp2fflush(FILE2 *fp2) {  int fp2fflush(FILE2 *fp2) {
   int r;    int r;
Line 68  int fp2fflush(FILE2 *fp2) {
Line 97  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) {
           signal(SIGPIPE,SIG_IGN);
     r = write(fp2->fd,fp2->writeBuf,fp2->writepos);      r = write(fp2->fd,fp2->writeBuf,fp2->writepos);
           signal(SIGPIPE,SIG_DFL);
     fp2->writepos = 0;      fp2->writepos = 0;
     if (r <= 0) {      if (r <= 0) {
       fprintf(stderr,"fp2fflush(): write failed on %d.\n",fp2->fd);        fprintf(stderr,"fp2fflush(): write failed on %d.\n",fp2->fd);
             if (errno == EPIPE) {
                   fprintf(stderr,"Your peer is closed --- SIGPIPE. Closing this fp2.\n");
                   fp2fclose(fp2);
                   return r;
             }
     }      }
     return(r);      return(r);
   }else{    }else{
Line 83  int fp2fflush(FILE2 *fp2) {
Line 120  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");
     return(-1);      return(-1);
   }    }
   return(close(fp2->fd));    if (fp2->pfp != NULL) {
           if (fp2->popened) {
         return pclose(fp2->pfp);
           } else return fclose(fp2->pfp);
     }
     else return(close(fp2->fd));
 }  }
   
 int fp2fputc(int c,FILE2 *fp2) {  int fp2fputc(int c,FILE2 *fp2) {
Line 98  int fp2fputc(int c,FILE2 *fp2) {
Line 141  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 173  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 206  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 191  int fp2dumpBuffer(FILE2 *fp2) {
Line 244  int fp2dumpBuffer(FILE2 *fp2) {
 int fp2clearReadBuf(FILE2 *fp2) {  int fp2clearReadBuf(FILE2 *fp2) {
   fd_set readfds;    fd_set readfds;
   struct timeval timeout;    struct timeval timeout;
   extern int errno;  
   int fd;    int fd;
 #define TMP00SIZE  2000  #define TMP00SIZE  2000
   char tmp00[TMP00SIZE];    char tmp00[TMP00SIZE];
Line 200  int fp2clearReadBuf(FILE2 *fp2) {
Line 252  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 270  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 324  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 *)sGC_malloc(newsize);
     newread = (char *)sGC_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");
     }
   }
   
   int fp2fputs(char *s,FILE2 *fp) {
     int i,n;
     n = strlen(s);
     for (i=0; i<n; i++) {
           if (fp2fputc(s[i],fp) < 0) return(-1);
     }
     return(0);
   }
   
   /* 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) {
       ....
    }
   */
   

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.12

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>