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>