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

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>