Annotation of OpenXM/src/kan96xx/plugin/file2.c, Revision 1.1
1.1 ! maekawa 1: #include <stdio.h>
! 2: #include <sys/time.h>
! 3: #include <sys/types.h>
! 4: #include <unistd.h>
! 5: #include "file2.h"
! 6:
! 7: #ifdef KXX
! 8: #define GC_malloc(n) malloc(n)
! 9: #else
! 10: void *GC_malloc(int size);
! 11: #endif
! 12:
! 13: /* Note: 1997, 12/6 cf. SS475/kxx/openxxx.tex, SS475/memo1.txt
! 14: The functions in file2.c should not accept interruptions
! 15: during its critical operations. The synchronization mechanism
! 16: has not yet been implemented.
! 17: */
! 18:
! 19: static int debug1 = 0;
! 20: static int checkfp2(FILE2 *fp2,char *s);
! 21: static int checkfp2(FILE2 *fp2,char *s)
! 22: {
! 23: if (fp2 == NULL) {
! 24: fprintf(stderr,"%s: NULL pointer.\n",s);
! 25: return(-1);
! 26: }
! 27: if (fp2->initialized != 1) {
! 28: fprintf(stderr,"%s: fp is not initialized.\n",s);
! 29: return(-1);
! 30: }
! 31: return(0);
! 32: }
! 33:
! 34: FILE2 *fp2open(int fd) {
! 35: FILE2 *fp2;
! 36: if (debug1) {
! 37: printf("fp2open is called. \n");
! 38: }
! 39: fp2 = (FILE2 *) GC_malloc(sizeof(FILE2));
! 40: if (fd < 0) {
! 41: fprintf(stderr,"fp2open Invalid file descriptor %d\n",fd);
! 42: return(NULL);
! 43: }
! 44: if (fp2 == NULL) {
! 45: fprintf(stderr,"fp2open. No memory.\n");
! 46: return(NULL);
! 47: }
! 48: fp2->fd = fd;
! 49: fp2->initialized = 1;
! 50: checkfp2(fp2,"fp2open ");
! 51: fp2->readpos = 0;
! 52: fp2->readsize = 0;
! 53: fp2->writepos = 0;
! 54: fp2->limit = FILE2BSIZE;
! 55: fp2->watch = 0;
! 56: fp2->watchFile = NULL;
! 57: fp2->mathcapList = NULL;
! 58: return(fp2);
! 59: }
! 60:
! 61:
! 62: int fp2fflush(FILE2 *fp2) {
! 63: int r;
! 64: if (debug1) {
! 65: printf("fp2fflush is called with FILE2 *%x.\n", (int )fp2);
! 66: fp2dumpBuffer(fp2);
! 67: printf("--------------------------\n");
! 68: }
! 69: if (checkfp2(fp2,"fp2fflush ") == -1) return(-1);
! 70: if (fp2->writepos > 0) {
! 71: r = write(fp2->fd,fp2->writeBuf,fp2->writepos);
! 72: fp2->writepos = 0;
! 73: if (r <= 0) {
! 74: fprintf(stderr,"fp2fflush(): write failed on %d.\n",fp2->fd);
! 75: }
! 76: return(r);
! 77: }else{
! 78: return(0);
! 79: }
! 80: }
! 81:
! 82: int fp2fclose(FILE2 *fp2) {
! 83: int r;
! 84: if (checkfp2(fp2," fp2fclose ") == -1) return(-1);
! 85: r = fp2fflush(fp2);
! 86: if (r < 0) {
! 87: fprintf(stderr,"fp2fclose: flush error.\n");
! 88: return(-1);
! 89: }
! 90: return(close(fp2->fd));
! 91: }
! 92:
! 93: int fp2fputc(int c,FILE2 *fp2) {
! 94: if (debug1) {
! 95: printf("fp2fputc is called with %2x, fp2->writepos=%d, ",c,fp2->writepos);
! 96: printf("fp2 = %x.\n",(int) fp2);
! 97: }
! 98: if (fp2->watch) {
! 99: if (c >= ' ' && c <='z') {
! 100: fprintf(fp2->watchFile," %2x(%c)-> ",c,c);
! 101: }else{
! 102: fprintf(fp2->watchFile," %2x( )-> ",c);
! 103: }
! 104: fflush(NULL);
! 105: }
! 106: if (checkfp2(fp2," fp2fputc ") == -1) return(-1);
! 107: (fp2->writeBuf)[fp2->writepos] = c;
! 108: (fp2->writepos)++;
! 109: if (fp2->writepos < fp2->limit) {
! 110: return(c);
! 111: }else{
! 112: if (fp2fflush(fp2) <0) return(-1);
! 113: else return(c);
! 114: }
! 115: }
! 116:
! 117: int fp2fgetc(FILE2 *fp2) {
! 118: int c;
! 119: /* printf("fp2fgetc is called. "); fflush(NULL); */
! 120: if (checkfp2(fp2," fp2fgetc ") == -1) return(-1);
! 121: if (fp2->readpos < fp2->readsize) {
! 122: fp2->readpos++;
! 123: c = fp2->readBuf[fp2->readpos -1];
! 124: if (fp2->watch) {
! 125: if (c >= ' ' && c <= 'z') {
! 126: fprintf(fp2->watchFile," %2x(%c) ",c,c);
! 127: }else{
! 128: fprintf(fp2->watchFile," %2x( ) ",c);
! 129: }
! 130: fflush(NULL);
! 131: }
! 132: return(c);
! 133: }else{
! 134: fp2->readpos = 0;
! 135: fp2 ->readsize =
! 136: read(fp2->fd, fp2->readBuf, fp2->limit);
! 137: if (fp2->readsize == 0) {
! 138: if (fp2->watch) {
! 139: fprintf(fp2->watchFile," <%2x ",c);
! 140: fflush(NULL);
! 141: }
! 142: return(-1);
! 143: }
! 144: else {
! 145: return(fp2fgetc(fp2));
! 146: }
! 147: }
! 148: }
! 149:
! 150: int fp2select(FILE2 *fp2, int t) {
! 151: if (fp2->readpos < fp2->readsize) return(1);
! 152: else {
! 153: #ifdef KXX
! 154: return(oxSocketSelect0(fp2->fd,t));
! 155: #else
! 156: return(KsocketSelect0(fp2->fd,t));
! 157: #endif
! 158: }
! 159: }
! 160:
! 161: int fp2dumpBuffer(FILE2 *fp2) {
! 162: int i;
! 163: if (checkfp2(fp2," f2pdumpBuf ") == -1) {
! 164: return(-1);
! 165: }
! 166: printf("fd=%d\n",fp2->fd);
! 167: printf("initialied=%d\n",fp2->initialized);
! 168: printf("readpos=%d\n",fp2->readpos);
! 169: printf("readsize=%d\n",fp2->readsize);
! 170: printf("writepos=%d\n",fp2->writepos);
! 171: printf("limit=%d\n",fp2->limit);
! 172: for (i=0; i<fp2->readsize; i++) {
! 173: printf("readBuf[%d]=%2x ",i,fp2->readBuf[i]);
! 174: }
! 175: for (i=0; i<fp2->writepos; i++) {
! 176: printf("writeBuf[%d]=%2x ",i,fp2->writeBuf[i]);
! 177: }
! 178: printf("\n");
! 179: return(0);
! 180: }
! 181:
! 182: int fp2clearReadBuf(FILE2 *fp2) {
! 183: fd_set readfds;
! 184: struct timeval timeout;
! 185: extern int errno;
! 186: int fd;
! 187: #define TMP00SIZE 2000
! 188: char tmp00[TMP00SIZE];
! 189: int n;
! 190:
! 191: if (checkfp2(fp2," fp2clearReadBuf ") == -1) {
! 192: return(-1);
! 193: }
! 194:
! 195: fp2->readsize=0; fp2->readpos = 0; /* Clear the buffer. */
! 196:
! 197: fd = fp2->fd;
! 198: while (1) {
! 199: FD_ZERO(&readfds);
! 200: FD_SET(fd,&readfds);
! 201: timeout.tv_sec = 0;
! 202: timeout.tv_usec = (long) 0;
! 203: fp2->readpos = fp2->readsize = 0;
! 204: if (select(fd+1,&readfds,(fd_set *)NULL,(fd_set *)NULL,&timeout)<0) {
! 205: fprintf(stderr,"fp2clearReadBuf: Select error. Error no is %d. See /usr/include/sys/errno.h.\n",errno);
! 206: return(-1);
! 207: }
! 208: if (FD_ISSET(fd,&readfds)) {
! 209: n = read(fd,tmp00, TMP00SIZE);
! 210: if (n <= 0) {
! 211: fprintf(stderr,"fp2clearReadBuf: File is closed or read error.\n");
! 212: return(-1);
! 213: }
! 214: if ( n < TMP00SIZE ) {
! 215: return(0);
! 216: }
! 217: }else {
! 218: return(0);
! 219: }
! 220: }
! 221: }
! 222: int fp2write(FILE2 *os, char *data, int size) {
! 223: int i,r;
! 224: for (i=0; i<size; i++) {
! 225: r = fp2fputc(data[i],os);
! 226: }
! 227: return(r);
! 228: }
! 229:
! 230: int fp2watch(FILE2 *fp2,FILE *f)
! 231: {
! 232: if (f == NULL) {
! 233: fprintf(stderr,"fp2watch FILE *f is NULL.\n");
! 234: return(-1);
! 235: }
! 236: if (fp2 == NULL) {
! 237: fprintf(stderr,"fp2watch FILE2 *fp2 is NULL.\n");
! 238: return(-1);
! 239: }
! 240: if (fp2->watch) {
! 241: fprintf(stderr,"fp2watch: fp2 is already taking a log.");
! 242: return(-1);
! 243: }
! 244: fp2->watch = 1;
! 245: fp2->watchFile = f;
! 246: return(0);
! 247: }
! 248:
! 249: int fp2stopWatch(FILE2 *fp2)
! 250: {
! 251: if (fp2 == NULL) {
! 252: fprintf(stderr,"fp2stopWatch FILE2 *fp2 is NULL.\n");
! 253: return(-1);
! 254: }
! 255: if (!fp2->watch) {
! 256: fprintf(stderr,"fp2stopWatch: fp2 is not taking a log.");
! 257: return(-1);
! 258: }
! 259: fp2->watch=0;
! 260: if (fp2->watchFile != stdout) {
! 261: return(fclose(fp2->watchFile));
! 262: }
! 263: }
! 264:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>