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