version 1.3, 2006/12/05 01:47:08 |
version 1.4, 2018/03/29 01:32:53 |
|
|
/* $OpenXM: OpenXM_contrib2/asir2000/io/io_win_mini.c,v 1.2 2006/09/29 09:02:49 noro Exp $ */ |
/* $OpenXM: OpenXM_contrib2/asir2000/io/io_win_mini.c,v 1.3 2006/12/05 01:47:08 noro Exp $ */ |
|
|
#include "ca.h" |
#include "ca.h" |
#include "parse.h" |
#include "parse.h" |
Line 30 int little_endian=1; |
|
Line 30 int little_endian=1; |
|
int terminate; |
int terminate; |
|
|
static int available_cmo[] = { |
static int available_cmo[] = { |
CMO_NULL, CMO_INT32, CMO_STRING,CMO_LIST, |
CMO_NULL, CMO_INT32, CMO_STRING,CMO_LIST, |
CMO_ERROR, CMO_ERROR2, CMO_ZERO, |
CMO_ERROR, CMO_ERROR2, CMO_ZERO, |
0 |
0 |
}; |
}; |
|
|
int ox_data_is_available(int s) |
int ox_data_is_available(int s) |
{ |
{ |
return FP_DATA_IS_AVAILABLE(iofp[s].in); |
return FP_DATA_IS_AVAILABLE(iofp[s].in); |
} |
} |
|
|
void wait_for_data(int s) |
void wait_for_data(int s) |
{ |
{ |
fd_set r; |
fd_set r; |
int sock; |
int sock; |
|
|
if ( !FP_DATA_IS_AVAILABLE(iofp[s].in) ) { |
if ( !FP_DATA_IS_AVAILABLE(iofp[s].in) ) { |
sock = iofp[s].in->fildes; |
sock = iofp[s].in->fildes; |
FD_ZERO(&r); |
FD_ZERO(&r); |
FD_SET((unsigned int)sock,&r); |
FD_SET((unsigned int)sock,&r); |
select(0,&r,NULL,NULL,NULL); |
select(0,&r,NULL,NULL,NULL); |
} |
} |
} |
} |
|
|
void ox_send_data(int s,pointer p) |
void ox_send_data(int s,pointer p) |
{ |
{ |
ERR err; |
ERR err; |
|
|
if ( !valid_as_cmo(p) ) |
if ( !valid_as_cmo(p) ) |
return; |
return; |
ox_write_int(s,OX_DATA); |
ox_write_int(s,OX_DATA); |
ox_write_int(s,ox_serial++); |
ox_write_int(s,ox_serial++); |
ox_write_cmo(s,p); |
ox_write_cmo(s,p); |
ox_flush_stream(s); |
ox_flush_stream(s); |
} |
} |
|
|
void ox_send_cmd(int s,int id) |
void ox_send_cmd(int s,int id) |
{ |
{ |
ox_write_int(s,OX_COMMAND); |
ox_write_int(s,OX_COMMAND); |
ox_write_int(s,ox_serial++); |
ox_write_int(s,ox_serial++); |
ox_write_int(s,id); |
ox_write_int(s,id); |
ox_flush_stream(s); |
ox_flush_stream(s); |
} |
} |
|
|
void ox_send_sync(int s) |
void ox_send_sync(int s) |
{ |
{ |
ox_write_int(s,OX_SYNC_BALL); |
ox_write_int(s,OX_SYNC_BALL); |
ox_write_int(s,ox_serial++); |
ox_write_int(s,ox_serial++); |
ox_flush_stream(s); |
ox_flush_stream(s); |
} |
} |
|
|
unsigned int ox_recv(int s, int *id, Obj *p) |
unsigned int ox_recv(int s, int *id, Obj *p) |
{ |
{ |
unsigned int cmd,serial; |
unsigned int cmd,serial; |
USINT ui; |
USINT ui; |
|
|
wait_for_data(s); |
wait_for_data(s); |
if ( terminate ) return -1; |
if ( terminate ) return -1; |
ox_read_int(s,id); |
ox_read_int(s,id); |
ox_read_int(s,&serial); |
ox_read_int(s,&serial); |
switch ( *id ) { |
switch ( *id ) { |
case OX_COMMAND: |
case OX_COMMAND: |
ox_read_int(s,&cmd); |
ox_read_int(s,&cmd); |
_MKUSINT(ui,cmd); |
_MKUSINT(ui,cmd); |
*p = (Obj)ui; |
*p = (Obj)ui; |
break; |
break; |
case OX_DATA: |
case OX_DATA: |
ox_read_cmo(s,p); |
ox_read_cmo(s,p); |
break; |
break; |
default: |
default: |
*p = 0; |
*p = 0; |
break; |
break; |
} |
} |
return serial; |
return serial; |
} |
} |
|
|
void ox_get_result(int s,Obj *rp) |
void ox_get_result(int s,Obj *rp) |
{ |
{ |
int id; |
int id; |
Obj obj,r; |
Obj obj,r; |
int level; |
int level; |
|
|
level = 0; |
level = 0; |
r = 0; |
r = 0; |
do { |
do { |
ox_recv(s,&id,&obj); |
ox_recv(s,&id,&obj); |
if ( id == OX_COMMAND ) { |
if ( id == OX_COMMAND ) { |
switch ( ((USINT)obj)->body ) { |
switch ( ((USINT)obj)->body ) { |
case SM_beginBlock: |
case SM_beginBlock: |
level++; |
level++; |
break; |
break; |
case SM_endBlock: |
case SM_endBlock: |
level--; |
level--; |
} |
} |
} else |
} else |
r = obj; |
r = obj; |
} while ( level ); |
} while ( level ); |
*rp = r; |
*rp = r; |
} |
} |
|
|
void ox_read_int(int s, int *n) |
void ox_read_int(int s, int *n) |
{ |
{ |
read_int((FILE *)iofp[s].in,n); |
read_int((FILE *)iofp[s].in,n); |
} |
} |
|
|
void ox_read_cmo(int s, Obj *rp) |
void ox_read_cmo(int s, Obj *rp) |
{ |
{ |
read_cmo((FILE *)iofp[s].in,rp); |
read_cmo((FILE *)iofp[s].in,rp); |
} |
} |
|
|
void ox_write_int(int s, int n) |
void ox_write_int(int s, int n) |
{ |
{ |
write_int((FILE *)iofp[s].out,&n); |
write_int((FILE *)iofp[s].out,&n); |
} |
} |
|
|
void ox_write_cmo(int s, Obj obj) |
void ox_write_cmo(int s, Obj obj) |
{ |
{ |
write_cmo((FILE *)iofp[s].out,obj); |
write_cmo((FILE *)iofp[s].out,obj); |
} |
} |
|
|
void ox_flush_stream(int s) |
void ox_flush_stream(int s) |
{ |
{ |
if ( ox_batch ) |
if ( ox_batch ) |
return; |
return; |
if ( _fileno(&iofp[s].out->fp) < 0 ) |
if ( _fileno(&iofp[s].out->fp) < 0 ) |
cflush(iofp[s].out); |
cflush(iofp[s].out); |
else |
else |
fflush((FILE *)iofp[s].out); |
fflush((FILE *)iofp[s].out); |
} |
} |
|
|
void ox_flush_stream_force(int s) |
void ox_flush_stream_force(int s) |
{ |
{ |
if ( _fileno(&iofp[s].out->fp) < 0 ) |
if ( _fileno(&iofp[s].out->fp) < 0 ) |
cflush(iofp[s].out); |
cflush(iofp[s].out); |
else |
else |
fflush((FILE *)iofp[s].out); |
fflush((FILE *)iofp[s].out); |
} |
} |
|
|
/* CMO I/O functions */ |
/* CMO I/O functions */ |
|
|
int valid_as_cmo(Obj obj) |
int valid_as_cmo(Obj obj) |
{ |
{ |
NODE m; |
NODE m; |
|
|
if ( !obj ) |
if ( !obj ) |
return 1; |
return 1; |
switch ( OID(obj) ) { |
switch ( OID(obj) ) { |
case O_STR: case O_ERR: case O_USINT: |
case O_STR: case O_ERR: case O_USINT: |
return 1; |
return 1; |
default: |
default: |
return 0; |
return 0; |
} |
} |
} |
} |
|
|
void write_cmo(FILE *s,Obj obj) |
void write_cmo(FILE *s,Obj obj) |
{ |
{ |
int r; |
int r; |
char errmsg[BUFSIZ]; |
char errmsg[BUFSIZ]; |
|
|
if ( !obj ) { |
if ( !obj ) { |
r = CMO_NULL; write_int(s,&r); |
r = CMO_NULL; write_int(s,&r); |
return; |
return; |
} |
} |
switch ( OID(obj) ) { |
switch ( OID(obj) ) { |
case O_STR: |
case O_STR: |
write_cmo_string(s,(STRING)obj); |
write_cmo_string(s,(STRING)obj); |
break; |
break; |
case O_USINT: |
case O_USINT: |
write_cmo_uint(s,(USINT)obj); |
write_cmo_uint(s,(USINT)obj); |
break; |
break; |
case O_LIST: |
case O_LIST: |
write_cmo_list(s,(LIST)obj); |
write_cmo_list(s,(LIST)obj); |
break; |
break; |
case O_ERR: |
case O_ERR: |
write_cmo_error(s,(ERR)obj); |
write_cmo_error(s,(ERR)obj); |
break; |
break; |
} |
} |
} |
} |
|
|
int cmo_tag(Obj obj,int *tag) |
int cmo_tag(Obj obj,int *tag) |
{ |
{ |
if ( !obj ) { |
if ( !obj ) { |
*tag = CMO_NULL; |
*tag = CMO_NULL; |
return 1; |
return 1; |
} |
} |
switch ( OID(obj) ) { |
switch ( OID(obj) ) { |
case O_STR: |
case O_STR: |
*tag = CMO_STRING; break; |
*tag = CMO_STRING; break; |
case O_USINT: |
case O_USINT: |
*tag = CMO_INT32; break; |
*tag = CMO_INT32; break; |
case O_LIST: |
case O_LIST: |
*tag = CMO_LIST; break; |
*tag = CMO_LIST; break; |
case O_ERR: |
case O_ERR: |
*tag = CMO_ERROR2; break; |
*tag = CMO_ERROR2; break; |
default: |
default: |
return 0; |
return 0; |
} |
} |
return 1; |
return 1; |
} |
} |
|
|
void write_cmo_uint(FILE *s,USINT ui) |
void write_cmo_uint(FILE *s,USINT ui) |
{ |
{ |
unsigned int r; |
unsigned int r; |
|
|
r = CMO_INT32; write_int(s,&r); |
r = CMO_INT32; write_int(s,&r); |
r = ui->body; write_int(s,&r); |
r = ui->body; write_int(s,&r); |
} |
} |
|
|
void write_cmo_string(FILE *s,STRING str) |
void write_cmo_string(FILE *s,STRING str) |
{ |
{ |
int r; |
int r; |
int size; |
int size; |
char *p; |
char *p; |
|
|
r = CMO_STRING; write_int(s,&r); |
r = CMO_STRING; write_int(s,&r); |
p = BDY(str); |
p = BDY(str); |
size = p ? strlen(p) : 0; |
size = p ? strlen(p) : 0; |
write_int(s,&size); |
write_int(s,&size); |
if ( size ) |
if ( size ) |
write_string(s,p,size); |
write_string(s,p,size); |
} |
} |
|
|
void write_cmo_list(FILE *s,LIST list) |
void write_cmo_list(FILE *s,LIST list) |
{ |
{ |
NODE m; |
NODE m; |
int i,n,r; |
int i,n,r; |
|
|
for ( n = 0, m = BDY(list); m; m = NEXT(m), n++ ); |
for ( n = 0, m = BDY(list); m; m = NEXT(m), n++ ); |
r = CMO_LIST; write_int(s,&r); |
r = CMO_LIST; write_int(s,&r); |
write_int(s,&n); |
write_int(s,&n); |
for ( i = 0, m = BDY(list); i < n; i++, m = NEXT(m) ) |
for ( i = 0, m = BDY(list); i < n; i++, m = NEXT(m) ) |
write_cmo(s,BDY(m)); |
write_cmo(s,BDY(m)); |
} |
} |
|
|
void write_cmo_error(FILE *s,ERR e) |
void write_cmo_error(FILE *s,ERR e) |
{ |
{ |
int r; |
int r; |
|
|
r = CMO_ERROR2; write_int(s,&r); |
r = CMO_ERROR2; write_int(s,&r); |
write_cmo(s,BDY(e)); |
write_cmo(s,BDY(e)); |
} |
} |
|
|
void read_cmo(FILE *s,Obj *rp) |
void read_cmo(FILE *s,Obj *rp) |
{ |
{ |
int id; |
int id; |
STRING str; |
STRING str; |
LIST list; |
LIST list; |
USINT t; |
USINT t; |
Obj obj; |
Obj obj; |
ERR e; |
ERR e; |
|
|
read_int(s,&id); |
read_int(s,&id); |
switch ( id ) { |
switch ( id ) { |
/* level 0 objects */ |
/* level 0 objects */ |
case CMO_NULL: |
case CMO_NULL: |
*rp = 0; |
*rp = 0; |
break; |
break; |
case CMO_INT32: |
case CMO_INT32: |
read_cmo_uint(s,&t); *rp = (Obj)t; |
read_cmo_uint(s,&t); *rp = (Obj)t; |
break; |
break; |
case CMO_STRING: |
case CMO_STRING: |
loadstring(s,&str); *rp = (Obj)str; |
loadstring(s,&str); *rp = (Obj)str; |
break; |
break; |
case CMO_LIST: |
case CMO_LIST: |
read_cmo_list(s,&list); *rp = (Obj)list; |
read_cmo_list(s,&list); *rp = (Obj)list; |
break; |
break; |
case CMO_ERROR: |
case CMO_ERROR: |
_MKERR(e,0); *rp = (Obj)e; |
_MKERR(e,0); *rp = (Obj)e; |
break; |
break; |
case CMO_ERROR2: |
case CMO_ERROR2: |
read_cmo(s,&obj); _MKERR(e,obj); *rp = (Obj)e; |
read_cmo(s,&obj); _MKERR(e,obj); *rp = (Obj)e; |
break; |
break; |
case CMO_ZERO: |
case CMO_ZERO: |
*rp = 0; |
*rp = 0; |
break; |
break; |
default: |
default: |
_MKUSINT(t,id); |
_MKUSINT(t,id); |
t->id = O_VOID; |
t->id = O_VOID; |
*rp = (Obj)t; |
*rp = (Obj)t; |
break; |
break; |
} |
} |
} |
} |
|
|
void read_cmo_uint(FILE *s,USINT *rp) |
void read_cmo_uint(FILE *s,USINT *rp) |
{ |
{ |
unsigned int body; |
unsigned int body; |
|
|
read_int(s,&body); |
read_int(s,&body); |
_MKUSINT(*rp,body); |
_MKUSINT(*rp,body); |
} |
} |
|
|
void read_cmo_list(FILE *s,Obj *rp) |
void read_cmo_list(FILE *s,Obj *rp) |
{ |
{ |
int len; |
int len; |
Obj *w; |
Obj *w; |
int i; |
int i; |
NODE n0,n1; |
NODE n0,n1; |
LIST list; |
LIST list; |
|
|
read_int(s,&len); |
read_int(s,&len); |
w = (Obj *)ALLOCA(len*sizeof(Obj)); |
w = (Obj *)ALLOCA(len*sizeof(Obj)); |
for ( i = 0; i < len; i++ ) |
for ( i = 0; i < len; i++ ) |
read_cmo(s,&w[i]); |
read_cmo(s,&w[i]); |
for ( i = len-1, n0 = 0; i >= 0; i-- ) { |
for ( i = len-1, n0 = 0; i >= 0; i-- ) { |
_MKNODE(n1,w[i],n0); n0 = n1; |
_MKNODE(n1,w[i],n0); n0 = n1; |
} |
} |
_MKLIST(list,n0); |
_MKLIST(list,n0); |
*rp = (Obj)list; |
*rp = (Obj)list; |
} |
} |
|
|
void loadstring(FILE *s,STRING *p) |
void loadstring(FILE *s,STRING *p) |
{ |
{ |
char *t; |
char *t; |
|
|
loadstr(s,&t); _MKSTR(*p,t); |
loadstr(s,&t); _MKSTR(*p,t); |
} |
} |
|
|
void loadstr(FILE *s,char **p) |
void loadstr(FILE *s,char **p) |
{ |
{ |
int len; |
int len; |
char *t; |
char *t; |
|
|
read_int(s,&len); |
read_int(s,&len); |
t = (char *)malloc(len+1); |
t = (char *)malloc(len+1); |
if ( len ) read_string(s,t,len); |
if ( len ) read_string(s,t,len); |
t[len] = 0; |
t[len] = 0; |
*p = t; |
*p = t; |
} |
} |
|
|
/* low level buffered I/O functions */ |
/* low level buffered I/O functions */ |
|
|
int gen_fread (char *ptr,int size,int nitems,FILE *stream) |
int gen_fread (char *ptr,int size,int nitems,FILE *stream) |
{ |
{ |
int n; |
int n; |
|
|
if ( _fileno(stream) < 0 ) |
if ( _fileno(stream) < 0 ) |
n = cread(ptr,size,nitems,(STREAM *)stream); |
n = cread(ptr,size,nitems,(STREAM *)stream); |
else |
else |
n = fread(ptr,size,nitems,stream); |
n = fread(ptr,size,nitems,stream); |
if ( !n ) |
if ( !n ) |
return 0; |
return 0; |
else |
else |
return n; |
return n; |
} |
} |
|
|
int gen_fwrite (char *ptr,int size,int nitems,FILE *stream) |
int gen_fwrite (char *ptr,int size,int nitems,FILE *stream) |
{ |
{ |
if ( _fileno(stream) < 0 ) |
if ( _fileno(stream) < 0 ) |
return cwrite(ptr,size,nitems,(STREAM *)stream); |
return cwrite(ptr,size,nitems,(STREAM *)stream); |
else |
else |
return fwrite(ptr,size,nitems,stream); |
return fwrite(ptr,size,nitems,stream); |
} |
} |
|
|
void write_char(FILE *f,unsigned char *p) |
void write_char(FILE *f,unsigned char *p) |
{ |
{ |
gen_fwrite(p,sizeof(unsigned char),1,f); |
gen_fwrite(p,sizeof(unsigned char),1,f); |
} |
} |
|
|
void write_short(FILE *f,unsigned short *p) |
void write_short(FILE *f,unsigned short *p) |
{ |
{ |
gen_fwrite((char *)p,sizeof(unsigned short),1,f); |
gen_fwrite((char *)p,sizeof(unsigned short),1,f); |
} |
} |
|
|
void write_int(FILE *f,unsigned int *p) |
void write_int(FILE *f,unsigned int *p) |
{ |
{ |
gen_fwrite((char *)p,sizeof(unsigned int),1,f); |
gen_fwrite((char *)p,sizeof(unsigned int),1,f); |
} |
} |
|
|
void write_string(FILE *f,unsigned char *p,int l) |
void write_string(FILE *f,unsigned char *p,int l) |
{ |
{ |
gen_fwrite(p,sizeof(unsigned char),l,f); |
gen_fwrite(p,sizeof(unsigned char),l,f); |
} |
} |
|
|
void read_char(FILE *f,unsigned char *p) |
void read_char(FILE *f,unsigned char *p) |
{ |
{ |
gen_fread((char *)p,sizeof(unsigned char),1,f); |
gen_fread((char *)p,sizeof(unsigned char),1,f); |
} |
} |
|
|
void read_short(FILE *f,unsigned short *p) |
void read_short(FILE *f,unsigned short *p) |
{ |
{ |
gen_fread((char *)p,sizeof(unsigned short),1,f); |
gen_fread((char *)p,sizeof(unsigned short),1,f); |
} |
} |
|
|
void read_int(FILE *f,unsigned int *p) |
void read_int(FILE *f,unsigned int *p) |
{ |
{ |
gen_fread((char *)p,sizeof(unsigned int),1,f); |
gen_fread((char *)p,sizeof(unsigned int),1,f); |
} |
} |
|
|
void read_string(FILE *f,unsigned char *p,int l) |
void read_string(FILE *f,unsigned char *p,int l) |
{ |
{ |
gen_fread((char *)p,sizeof(unsigned char),l,f); |
gen_fread((char *)p,sizeof(unsigned char),l,f); |
} |
} |
|
|
/* dummy functions, alternative functions */ |
/* dummy functions, alternative functions */ |
|
|
double get_current_time() |
double get_current_time() |
{ |
{ |
return GetTickCount()/1000.0; |
return GetTickCount()/1000.0; |
} |
} |
|
|
void shutdown_all(){} |
void shutdown_all(){} |