[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.3

1.3     ! noro        1: /* $OpenXM: OpenXM_contrib2/asir2000/io/io_win_mini.c,v 1.2 2006/09/29 09:02:49 noro Exp $ */
1.1       noro        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:
1.2       noro       11: #define _NEWNODE(n) ((n)=(NODE)malloc(sizeof(struct oNODE)))
1.1       noro       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)
1.2       noro       15: #define _NEWLIST(l) ((l)=(LIST)malloc(sizeof(struct oLIST)),OID(l)=O_LIST)
1.1       noro       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))
1.2       noro       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))
1.1       noro       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[] = {
1.2       noro       33:        CMO_NULL, CMO_INT32, CMO_STRING,CMO_LIST,
1.1       noro       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;
1.2       noro      202:                case O_LIST:
                    203:                        write_cmo_list(s,(LIST)obj);
                    204:                        break;
1.1       noro      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;
1.2       noro      222:                case O_LIST:
                    223:                        *tag = CMO_LIST; break;
1.1       noro      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:
1.2       noro      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:
1.1       noro      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;
1.2       noro      278:        LIST list;
1.1       noro      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;
1.2       noro      295:                case CMO_LIST:
                    296:                        read_cmo_list(s,&list); *rp = (Obj)list;
                    297:                        break;
1.1       noro      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:
1.2       noro      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:
1.1       noro      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);
1.3     ! noro      355:        t = (char *)malloc(len+1);
        !           356:        if ( len ) read_string(s,t,len);
        !           357:        t[len] = 0;
1.1       noro      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>