[BACK]Return to io_win_mini.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2018 / io

Annotation of OpenXM_contrib2/asir2018/io/io_win_mini.c, Revision 1.1

1.1     ! noro        1: /* $OpenXM$ */
        !             2:
        !             3: #include "ca.h"
        !             4: #include "parse.h"
        !             5: #include "ox.h"
        !             6: #include "wsio.h"
        !             7: #include "signal.h"
        !             8:
        !             9: #define ISIZ sizeof(int)
        !            10:
        !            11: #define _NEWNODE(n) ((n)=(NODE)malloc(sizeof(struct oNODE)))
        !            12: #define _NEWSTR(l) ((l)=(STRING)malloc(sizeof(struct oSTRING)),OID(l)=O_STR)
        !            13: #define _NEWUSINT(u) ((u)=(USINT)malloc(sizeof(struct oUSINT)),OID(u)=O_USINT)
        !            14: #define _NEWERR(e) ((e)=(ERR)malloc(sizeof(struct oERR)),OID(e)=O_ERR)
        !            15: #define _NEWLIST(l) ((l)=(LIST)malloc(sizeof(struct oLIST)),OID(l)=O_LIST)
        !            16: #define _MKSTR(u,b) (_NEWSTR(u),(u)->body=(unsigned)(b))
        !            17: #define _MKUSINT(u,b) (_NEWUSINT(u),(u)->body=(unsigned)(b))
        !            18: #define _MKERR(e,b) (_NEWERR(e),(e)->body=(Obj)(b))
        !            19: #define _MKLIST(l,b) (_NEWLIST(l),(l)->body=(Obj)(b))
        !            20: #define _MKNODE(a,b,c) \
        !            21: (_NEWNODE(a),(a)->body=(pointer)b,NEXT(a)=(NODE)(c))
        !            22:
        !            23: int ox_usr1_sent, ox_int_received, critical_when_signal;
        !            24: unsigned int ox_serial;
        !            25: int ox_flushing;
        !            26: int ox_batch;
        !            27: int ox_check=1;
        !            28: int ox_exchange_mathcap=0;
        !            29: int little_endian=1;
        !            30: int terminate;
        !            31:
        !            32: static int available_cmo[] = {
        !            33:   CMO_NULL, CMO_INT32, CMO_STRING,CMO_LIST,
        !            34:   CMO_ERROR, CMO_ERROR2, CMO_ZERO,
        !            35:   0
        !            36: };
        !            37:
        !            38: int ox_data_is_available(int s)
        !            39: {
        !            40:   return FP_DATA_IS_AVAILABLE(iofp[s].in);
        !            41: }
        !            42:
        !            43: void wait_for_data(int s)
        !            44: {
        !            45:   fd_set r;
        !            46:   int sock;
        !            47:
        !            48:   if ( !FP_DATA_IS_AVAILABLE(iofp[s].in) ) {
        !            49:     sock = iofp[s].in->fildes;
        !            50:     FD_ZERO(&r);
        !            51:     FD_SET((unsigned int)sock,&r);
        !            52:     select(0,&r,NULL,NULL,NULL);
        !            53:   }
        !            54: }
        !            55:
        !            56: void ox_send_data(int s,pointer p)
        !            57: {
        !            58:   ERR err;
        !            59:
        !            60:   if ( !valid_as_cmo(p) )
        !            61:     return;
        !            62:   ox_write_int(s,OX_DATA);
        !            63:   ox_write_int(s,ox_serial++);
        !            64:   ox_write_cmo(s,p);
        !            65:   ox_flush_stream(s);
        !            66: }
        !            67:
        !            68: void ox_send_cmd(int s,int id)
        !            69: {
        !            70:   ox_write_int(s,OX_COMMAND);
        !            71:   ox_write_int(s,ox_serial++);
        !            72:   ox_write_int(s,id);
        !            73:   ox_flush_stream(s);
        !            74: }
        !            75:
        !            76: void ox_send_sync(int s)
        !            77: {
        !            78:   ox_write_int(s,OX_SYNC_BALL);
        !            79:   ox_write_int(s,ox_serial++);
        !            80:   ox_flush_stream(s);
        !            81: }
        !            82:
        !            83: unsigned int ox_recv(int s, int *id, Obj *p)
        !            84: {
        !            85:   unsigned int cmd,serial;
        !            86:   USINT ui;
        !            87:
        !            88:   wait_for_data(s);
        !            89:   if ( terminate ) return -1;
        !            90:   ox_read_int(s,id);
        !            91:   ox_read_int(s,&serial);
        !            92:   switch ( *id ) {
        !            93:     case OX_COMMAND:
        !            94:       ox_read_int(s,&cmd);
        !            95:       _MKUSINT(ui,cmd);
        !            96:       *p = (Obj)ui;
        !            97:       break;
        !            98:     case OX_DATA:
        !            99:       ox_read_cmo(s,p);
        !           100:       break;
        !           101:     default:
        !           102:       *p = 0;
        !           103:       break;
        !           104:   }
        !           105:   return serial;
        !           106: }
        !           107:
        !           108: void ox_get_result(int s,Obj *rp)
        !           109: {
        !           110:   int id;
        !           111:   Obj obj,r;
        !           112:   int level;
        !           113:
        !           114:   level = 0;
        !           115:   r = 0;
        !           116:   do {
        !           117:     ox_recv(s,&id,&obj);
        !           118:     if ( id == OX_COMMAND ) {
        !           119:       switch ( ((USINT)obj)->body ) {
        !           120:         case SM_beginBlock:
        !           121:           level++;
        !           122:           break;
        !           123:         case SM_endBlock:
        !           124:           level--;
        !           125:       }
        !           126:     } else
        !           127:       r = obj;
        !           128:   } while ( level );
        !           129:   *rp = r;
        !           130: }
        !           131:
        !           132: void ox_read_int(int s, int *n)
        !           133: {
        !           134:   read_int((FILE *)iofp[s].in,n);
        !           135: }
        !           136:
        !           137: void ox_read_cmo(int s, Obj *rp)
        !           138: {
        !           139:   read_cmo((FILE *)iofp[s].in,rp);
        !           140: }
        !           141:
        !           142: void ox_write_int(int s, int n)
        !           143: {
        !           144:   write_int((FILE *)iofp[s].out,&n);
        !           145: }
        !           146:
        !           147: void ox_write_cmo(int s, Obj obj)
        !           148: {
        !           149:   write_cmo((FILE *)iofp[s].out,obj);
        !           150: }
        !           151:
        !           152: void ox_flush_stream(int s)
        !           153: {
        !           154:   if ( ox_batch )
        !           155:     return;
        !           156:   if ( _fileno(&iofp[s].out->fp) < 0 )
        !           157:     cflush(iofp[s].out);
        !           158:   else
        !           159:     fflush((FILE *)iofp[s].out);
        !           160: }
        !           161:
        !           162: void ox_flush_stream_force(int s)
        !           163: {
        !           164:   if ( _fileno(&iofp[s].out->fp) < 0 )
        !           165:     cflush(iofp[s].out);
        !           166:   else
        !           167:     fflush((FILE *)iofp[s].out);
        !           168: }
        !           169:
        !           170: /* CMO I/O functions */
        !           171:
        !           172: int valid_as_cmo(Obj obj)
        !           173: {
        !           174:   NODE m;
        !           175:
        !           176:   if ( !obj )
        !           177:     return 1;
        !           178:   switch ( OID(obj) ) {
        !           179:     case O_STR: case O_ERR: case O_USINT:
        !           180:       return 1;
        !           181:     default:
        !           182:       return 0;
        !           183:   }
        !           184: }
        !           185:
        !           186: void write_cmo(FILE *s,Obj obj)
        !           187: {
        !           188:   int r;
        !           189:   char errmsg[BUFSIZ];
        !           190:
        !           191:   if ( !obj ) {
        !           192:     r = CMO_NULL; write_int(s,&r);
        !           193:     return;
        !           194:   }
        !           195:   switch ( OID(obj) ) {
        !           196:     case O_STR:
        !           197:       write_cmo_string(s,(STRING)obj);
        !           198:       break;
        !           199:     case O_USINT:
        !           200:       write_cmo_uint(s,(USINT)obj);
        !           201:       break;
        !           202:     case O_LIST:
        !           203:       write_cmo_list(s,(LIST)obj);
        !           204:       break;
        !           205:     case O_ERR:
        !           206:       write_cmo_error(s,(ERR)obj);
        !           207:       break;
        !           208:   }
        !           209: }
        !           210:
        !           211: int cmo_tag(Obj obj,int *tag)
        !           212: {
        !           213:   if ( !obj ) {
        !           214:     *tag = CMO_NULL;
        !           215:     return 1;
        !           216:   }
        !           217:   switch ( OID(obj) ) {
        !           218:     case O_STR:
        !           219:       *tag = CMO_STRING; break;
        !           220:     case O_USINT:
        !           221:       *tag = CMO_INT32; break;
        !           222:     case O_LIST:
        !           223:       *tag = CMO_LIST; break;
        !           224:     case O_ERR:
        !           225:       *tag = CMO_ERROR2; break;
        !           226:     default:
        !           227:       return 0;
        !           228:   }
        !           229:   return 1;
        !           230: }
        !           231:
        !           232: void write_cmo_uint(FILE *s,USINT ui)
        !           233: {
        !           234:   unsigned int r;
        !           235:
        !           236:   r = CMO_INT32; write_int(s,&r);
        !           237:   r = ui->body; write_int(s,&r);
        !           238: }
        !           239:
        !           240: void write_cmo_string(FILE *s,STRING str)
        !           241: {
        !           242:   int r;
        !           243:   int size;
        !           244:   char *p;
        !           245:
        !           246:   r = CMO_STRING; write_int(s,&r);
        !           247:   p = BDY(str);
        !           248:   size = p ? strlen(p) : 0;
        !           249:   write_int(s,&size);
        !           250:   if ( size )
        !           251:     write_string(s,p,size);
        !           252: }
        !           253:
        !           254: void write_cmo_list(FILE *s,LIST list)
        !           255: {
        !           256:   NODE m;
        !           257:   int i,n,r;
        !           258:
        !           259:   for ( n = 0, m = BDY(list); m; m = NEXT(m), n++ );
        !           260:   r = CMO_LIST; write_int(s,&r);
        !           261:   write_int(s,&n);
        !           262:   for ( i = 0, m = BDY(list); i < n; i++, m = NEXT(m) )
        !           263:     write_cmo(s,BDY(m));
        !           264: }
        !           265:
        !           266: void write_cmo_error(FILE *s,ERR e)
        !           267: {
        !           268:   int r;
        !           269:
        !           270:   r = CMO_ERROR2; write_int(s,&r);
        !           271:   write_cmo(s,BDY(e));
        !           272: }
        !           273:
        !           274: void read_cmo(FILE *s,Obj *rp)
        !           275: {
        !           276:   int id;
        !           277:   STRING str;
        !           278:   LIST list;
        !           279:   USINT t;
        !           280:   Obj obj;
        !           281:   ERR e;
        !           282:
        !           283:   read_int(s,&id);
        !           284:   switch ( id ) {
        !           285:   /* level 0 objects */
        !           286:     case CMO_NULL:
        !           287:       *rp = 0;
        !           288:       break;
        !           289:     case CMO_INT32:
        !           290:       read_cmo_uint(s,&t); *rp = (Obj)t;
        !           291:       break;
        !           292:     case CMO_STRING:
        !           293:       loadstring(s,&str); *rp = (Obj)str;
        !           294:       break;
        !           295:     case CMO_LIST:
        !           296:       read_cmo_list(s,&list); *rp = (Obj)list;
        !           297:       break;
        !           298:     case CMO_ERROR:
        !           299:       _MKERR(e,0); *rp = (Obj)e;
        !           300:       break;
        !           301:     case CMO_ERROR2:
        !           302:       read_cmo(s,&obj); _MKERR(e,obj); *rp = (Obj)e;
        !           303:       break;
        !           304:     case CMO_ZERO:
        !           305:       *rp = 0;
        !           306:       break;
        !           307:     default:
        !           308:       _MKUSINT(t,id);
        !           309:       t->id = O_VOID;
        !           310:       *rp = (Obj)t;
        !           311:       break;
        !           312:   }
        !           313: }
        !           314:
        !           315: void read_cmo_uint(FILE *s,USINT *rp)
        !           316: {
        !           317:   unsigned int body;
        !           318:
        !           319:   read_int(s,&body);
        !           320:   _MKUSINT(*rp,body);
        !           321: }
        !           322:
        !           323: void read_cmo_list(FILE *s,Obj *rp)
        !           324: {
        !           325:   int len;
        !           326:   Obj *w;
        !           327:   int i;
        !           328:   NODE n0,n1;
        !           329:   LIST list;
        !           330:
        !           331:   read_int(s,&len);
        !           332:   w = (Obj *)ALLOCA(len*sizeof(Obj));
        !           333:   for ( i = 0; i < len; i++ )
        !           334:     read_cmo(s,&w[i]);
        !           335:   for ( i = len-1, n0 = 0; i >= 0; i-- ) {
        !           336:     _MKNODE(n1,w[i],n0); n0 = n1;
        !           337:   }
        !           338:   _MKLIST(list,n0);
        !           339:   *rp = (Obj)list;
        !           340: }
        !           341:
        !           342: void loadstring(FILE *s,STRING *p)
        !           343: {
        !           344:   char *t;
        !           345:
        !           346:   loadstr(s,&t); _MKSTR(*p,t);
        !           347: }
        !           348:
        !           349: void loadstr(FILE *s,char **p)
        !           350: {
        !           351:   int len;
        !           352:   char *t;
        !           353:
        !           354:   read_int(s,&len);
        !           355:   t = (char *)malloc(len+1);
        !           356:   if ( len ) read_string(s,t,len);
        !           357:   t[len] = 0;
        !           358:   *p = t;
        !           359: }
        !           360:
        !           361: /* low level buffered I/O functions */
        !           362:
        !           363: int gen_fread (char *ptr,int size,int nitems,FILE *stream)
        !           364: {
        !           365:   int n;
        !           366:
        !           367:   if ( _fileno(stream) < 0 )
        !           368:     n = cread(ptr,size,nitems,(STREAM *)stream);
        !           369:   else
        !           370:     n = fread(ptr,size,nitems,stream);
        !           371:   if ( !n )
        !           372:     return 0;
        !           373:   else
        !           374:     return n;
        !           375: }
        !           376:
        !           377: int gen_fwrite (char *ptr,int size,int nitems,FILE *stream)
        !           378: {
        !           379:   if ( _fileno(stream) < 0 )
        !           380:     return cwrite(ptr,size,nitems,(STREAM *)stream);
        !           381:   else
        !           382:     return fwrite(ptr,size,nitems,stream);
        !           383: }
        !           384:
        !           385: void write_char(FILE *f,unsigned char *p)
        !           386: {
        !           387:   gen_fwrite(p,sizeof(unsigned char),1,f);
        !           388: }
        !           389:
        !           390: void write_short(FILE *f,unsigned short *p)
        !           391: {
        !           392:   gen_fwrite((char *)p,sizeof(unsigned short),1,f);
        !           393: }
        !           394:
        !           395: void write_int(FILE *f,unsigned int *p)
        !           396: {
        !           397:   gen_fwrite((char *)p,sizeof(unsigned int),1,f);
        !           398: }
        !           399:
        !           400: void write_string(FILE *f,unsigned char *p,int l)
        !           401: {
        !           402:   gen_fwrite(p,sizeof(unsigned char),l,f);
        !           403: }
        !           404:
        !           405: void read_char(FILE *f,unsigned char *p)
        !           406: {
        !           407:   gen_fread((char *)p,sizeof(unsigned char),1,f);
        !           408: }
        !           409:
        !           410: void read_short(FILE *f,unsigned short *p)
        !           411: {
        !           412:   gen_fread((char *)p,sizeof(unsigned short),1,f);
        !           413: }
        !           414:
        !           415: void read_int(FILE *f,unsigned int *p)
        !           416: {
        !           417:   gen_fread((char *)p,sizeof(unsigned int),1,f);
        !           418: }
        !           419:
        !           420: void read_string(FILE *f,unsigned char *p,int l)
        !           421: {
        !           422:   gen_fread((char *)p,sizeof(unsigned char),l,f);
        !           423: }
        !           424:
        !           425: /* dummy functions, alternative functions */
        !           426:
        !           427: double get_current_time()
        !           428: {
        !           429:   return GetTickCount()/1000.0;
        !           430: }
        !           431:
        !           432: void shutdown_all(){}
        !           433:

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