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

Annotation of OpenXM_contrib2/asir2000/io/ox_asir.c, Revision 1.1

1.1     ! noro        1: /* $OpenXM: OpenXM/src/asir99/io/ox_asir.c,v 1.5 1999/11/18 02:24:02 noro Exp $ */
        !             2: #include "ca.h"
        !             3: #include "parse.h"
        !             4: #include "ox.h"
        !             5: #include "version.h"
        !             6:
        !             7: void ox_usr1_handler();
        !             8:
        !             9: extern jmp_buf environnement;
        !            10:
        !            11: extern int do_message;
        !            12: extern int ox_flushing;
        !            13: extern jmp_buf ox_env;
        !            14: extern MATHCAP my_mathcap;
        !            15:
        !            16: int ox_sock_id;
        !            17:
        !            18: static int asir_OperandStackSize;
        !            19: static Obj *asir_OperandStack;
        !            20: static int asir_OperandStackPtr = -1;
        !            21:
        !            22: static void create_error(ERR *,unsigned int ,char *);
        !            23: static void ox_io_init();
        !            24: static void ox_asir_init(int,char **);
        !            25: static Obj asir_pop_one();
        !            26: static void asir_push_one(Obj);
        !            27: static void asir_end_flush();
        !            28: static void asir_executeFunction(int);
        !            29: static int asir_executeString();
        !            30: static void asir_evalName(unsigned int);
        !            31: static void asir_setName(unsigned int);
        !            32: static void asir_pops();
        !            33: static void asir_popString();
        !            34: static void asir_popCMO(unsigned int);
        !            35: static void asir_popSerializedLocalObject();
        !            36: static LIST asir_GetErrorList();
        !            37: static char *name_of_cmd(unsigned int);
        !            38: static char *name_of_id(int);
        !            39: static void asir_do_cmd(unsigned int,unsigned int);
        !            40:
        !            41: #if MPI
        !            42: extern int mpi_nprocs,mpi_myid;
        !            43:
        !            44: void ox_mpi_master_init() {
        !            45:        int i,idx,ret;
        !            46:
        !            47:        for ( i = 1; i < mpi_nprocs; i++ ) {
        !            48:                /* client mode */
        !            49:                idx = get_iofp(i,0,0);
        !            50:                ret = register_server(idx,idx);
        !            51:        }
        !            52: }
        !            53:
        !            54: void ox_mpi_slave_init() {
        !            55:        endian_init();
        !            56:        /* server mode */
        !            57:        get_iofp(0,0,1);
        !            58:        fclose(stdin);
        !            59:        asir_OperandStackSize = BUFSIZ;
        !            60:        asir_OperandStack = (Obj *)CALLOC(asir_OperandStackSize,sizeof(Obj));
        !            61:        asir_OperandStackPtr = -1;
        !            62: }
        !            63: #endif
        !            64:
        !            65: static void create_error(ERR *err,unsigned int serial,char *msg)
        !            66: {
        !            67:        int len;
        !            68:        USINT ui;
        !            69:        NODE n,n1;
        !            70:        LIST list;
        !            71:        char *msg1;
        !            72:        STRING errmsg;
        !            73:
        !            74:        MKUSINT(ui,serial);
        !            75:        len = strlen(msg);
        !            76:        msg1 = (char *)MALLOC(len+1);
        !            77:        strcpy(msg1,msg);
        !            78:        MKSTR(errmsg,msg1);
        !            79:        MKNODE(n1,errmsg,0); MKNODE(n,ui,n1); MKLIST(list,n);
        !            80:        MKERR(*err,list);
        !            81: }
        !            82:
        !            83: void ox_main(int argc,char **argv) {
        !            84:        int id;
        !            85:        unsigned int cmd;
        !            86:        Obj obj;
        !            87:        USINT ui;
        !            88:        ERR err;
        !            89:        LIST list;
        !            90:        NODE n,n1;
        !            91:        unsigned int serial;
        !            92:        int ret;
        !            93:        extern char LastError[];
        !            94:
        !            95:        ox_asir_init(argc,argv);
        !            96:        if ( do_message )
        !            97:                fprintf(stderr,"I'm an ox_asir, Version %d.\n",ASIR_VERSION);
        !            98:        if ( setjmp(ox_env) ) {
        !            99:                while ( NEXT(asir_infile) )
        !           100:                        closecurrentinput();
        !           101:                ox_send_sync(0);
        !           102:        }
        !           103:        while ( 1 ) {
        !           104:                extern int recv_intr;
        !           105:
        !           106:                serial = ox_recv(0,&id,&obj);
        !           107: #if defined(VISUAL)
        !           108:                if ( recv_intr ) {
        !           109:                        if ( recv_intr == 1 ) {
        !           110:                                recv_intr = 0;
        !           111:                                int_handler(SIGINT);
        !           112:                        } else {
        !           113:                                recv_intr = 0;
        !           114:                                ox_usr1_handler(0);
        !           115:                        }
        !           116:                }
        !           117: #endif
        !           118:                if ( do_message )
        !           119:                        fprintf(stderr,"#%d Got %s",serial,name_of_id(id));
        !           120:                switch ( id ) {
        !           121:                        case OX_COMMAND:
        !           122:                                cmd = ((USINT)obj)->body;
        !           123:                                if ( ox_flushing )
        !           124:                                        break;
        !           125:                                if ( do_message )
        !           126:                                        fprintf(stderr," %s\n",name_of_cmd(cmd));
        !           127:                                if ( ret = setjmp(env) ) {
        !           128:                                        if ( ret == 1 ) {
        !           129:                                                create_error(&err,serial,LastError);
        !           130:                                                asir_push_one((Obj)err);
        !           131:                                        }
        !           132:                                        break;
        !           133:                                }
        !           134:                                asir_do_cmd(cmd,serial);
        !           135:                                break;
        !           136:                        case OX_DATA:
        !           137:                        case OX_LOCAL_OBJECT_ASIR:
        !           138:                                if ( ox_flushing )
        !           139:                                        break;
        !           140:                                if ( do_message )
        !           141:                                        fprintf(stderr," -> data pushed");
        !           142:                                asir_push_one(obj);
        !           143:                                break;
        !           144:                        case OX_SYNC_BALL:
        !           145:                                asir_end_flush();
        !           146:                                break;
        !           147:                        default:
        !           148:                                break;
        !           149:                }
        !           150:                if ( do_message )
        !           151:                        fprintf(stderr,"\n");
        !           152:        }
        !           153: }
        !           154:
        !           155: static void asir_do_cmd(unsigned int cmd,unsigned int serial)
        !           156: {
        !           157:        MATHCAP client_mathcap;
        !           158:        Q q;
        !           159:        int i;
        !           160:        LIST list;
        !           161:
        !           162:        switch ( cmd ) {
        !           163:                case SM_dupErrors:
        !           164:                        list = asir_GetErrorList();
        !           165:                        asir_push_one((Obj)list);
        !           166:                        break;
        !           167:                case SM_getsp:
        !           168:                        i = asir_OperandStackPtr+1;
        !           169:                        STOQ(i,q);
        !           170:                        asir_push_one((Obj)q);
        !           171:                        break;
        !           172:                case SM_popSerializedLocalObject:
        !           173:                        asir_popSerializedLocalObject();
        !           174:                        break;
        !           175:                case SM_popCMO:
        !           176:                        asir_popCMO(serial);
        !           177:                        break;
        !           178:                case SM_popString:
        !           179:                        asir_popString();
        !           180:                        break;
        !           181:                case SM_setName:
        !           182:                        asir_setName(serial);
        !           183:                        break;
        !           184:                case SM_evalName:
        !           185:                        asir_evalName(serial);
        !           186:                        break;
        !           187:                case SM_executeStringByLocalParser:
        !           188:                        asir_executeString();
        !           189:                        break;
        !           190:                case SM_executeStringByLocalParserInBatchMode:
        !           191:                        asir_executeString();
        !           192:                        asir_pop_one();
        !           193:                        break;
        !           194:                case SM_executeFunction:
        !           195:                        asir_executeFunction(serial);
        !           196:                        break;
        !           197:                case SM_shutdown:
        !           198:                        asir_terminate(2);
        !           199:                        break;
        !           200:                case SM_pops:
        !           201:                        asir_pops();
        !           202:                        break;
        !           203:                case SM_mathcap:
        !           204:                        asir_push_one((Obj)my_mathcap);
        !           205:                        break;
        !           206:                case SM_setMathcap:
        !           207:                        client_mathcap = (MATHCAP)asir_pop_one();
        !           208:                        store_remote_mathcap(0,client_mathcap);
        !           209:                        break;
        !           210:                case SM_nop:
        !           211:                default:
        !           212:                        break;
        !           213:        }
        !           214: }
        !           215:
        !           216: static char *name_of_id(int id)
        !           217: {
        !           218:        switch ( id ) {
        !           219:                case OX_COMMAND:
        !           220:                        return "OX_COMMAND";
        !           221:                        break;
        !           222:                case OX_DATA:
        !           223:                        return "OX_DATA";
        !           224:                        break;
        !           225:                case OX_LOCAL_OBJECT_ASIR:
        !           226:                        return "OX_LOCAL_OBJECT_ASIR";
        !           227:                        break;
        !           228:                case OX_SYNC_BALL:
        !           229:                        return "OX_SYNC_BALL";
        !           230:                        break;
        !           231:                default:
        !           232:                        return "Unknown id";
        !           233:                        break;
        !           234:        }
        !           235: }
        !           236:
        !           237: static char *name_of_cmd(unsigned cmd)
        !           238: {
        !           239:        switch ( cmd ) {
        !           240:                case SM_popSerializedLocalObject:
        !           241:                        return "SM_popSerializedLocalObject";
        !           242:                        break;
        !           243:                case SM_popCMO:
        !           244:                        return "SM_popCMO";
        !           245:                        break;
        !           246:                case SM_popString:
        !           247:                        return "SM_popString";
        !           248:                        break;
        !           249:                case SM_pops:
        !           250:                        return "SM_pops";
        !           251:                        break;
        !           252:                case SM_setName:
        !           253:                        return "SM_setName";
        !           254:                        break;
        !           255:                case SM_evalName:
        !           256:                        return "SM_evalName";
        !           257:                        break;
        !           258:                case SM_executeStringByLocalParser:
        !           259:                        return "SM_executeString";
        !           260:                        break;
        !           261:                case SM_executeFunction:
        !           262:                        return "SM_executeFunction";
        !           263:                        break;
        !           264:                case SM_shutdown:
        !           265:                        return "SM_shutdown";
        !           266:                        break;
        !           267:                case SM_beginBlock:
        !           268:                        return "SM_beginBlock";
        !           269:                        break;
        !           270:                case SM_endBlock:
        !           271:                        return "SM_endBlock";
        !           272:                        break;
        !           273:                case SM_mathcap:
        !           274:                        return "SM_mathcap";
        !           275:                        break;
        !           276:                case SM_setMathcap:
        !           277:                        return "SM_setMathcap";
        !           278:                        break;
        !           279:                case SM_getsp:
        !           280:                        return "SM_setMathcap";
        !           281:                        break;
        !           282:                case SM_dupErrors:
        !           283:                        return "SM_dupErrors";
        !           284:                        break;
        !           285:                case SM_nop:
        !           286:                        return "SM_nop";
        !           287:                default:
        !           288:                        return "Unknown cmd";
        !           289:                        break;
        !           290:        }
        !           291: }
        !           292:
        !           293: static LIST asir_GetErrorList()
        !           294: {
        !           295:        int i;
        !           296:        NODE n,n0;
        !           297:        LIST err;
        !           298:        Obj obj;
        !           299:
        !           300:        for ( i = 0, n0 = 0; i <= asir_OperandStackPtr; i++ )
        !           301:                if ( (obj = asir_OperandStack[i]) && (OID(obj) == O_ERR) ) {
        !           302:                        NEXTNODE(n0,n); BDY(n) = (pointer)obj;
        !           303:                }
        !           304:        if ( n0 )
        !           305:                NEXT(n) = 0;
        !           306:        MKLIST(err,n0);
        !           307:        return err;
        !           308: }
        !           309:
        !           310: static void asir_popSerializedLocalObject()
        !           311: {
        !           312:        Obj obj;
        !           313:        VL t,vl;
        !           314:
        !           315:        obj = asir_pop_one();
        !           316:        get_vars_recursive(obj,&vl);
        !           317:        for ( t = vl; t; t = NEXT(t) )
        !           318:                if ( t->v->attr == (pointer)V_UC )
        !           319:                        error("bsave : not implemented");
        !           320:        ox_send_cmd(0,SM_beginBlock);
        !           321:        ox_send_local_ring(0,vl);
        !           322:        ox_send_local_data(0,obj);
        !           323:        ox_send_cmd(0,SM_endBlock);
        !           324: }
        !           325:
        !           326: static void asir_popCMO(unsigned int serial)
        !           327: {
        !           328:        Obj obj;
        !           329:        ERR err;
        !           330:
        !           331:        obj = asir_pop_one();
        !           332:        if ( valid_as_cmo(obj) )
        !           333:                ox_send_data(0,obj);
        !           334:        else {
        !           335:                create_error(&err,serial,"cannot convert to CMO object");
        !           336:                ox_send_data(0,err);
        !           337:                asir_push_one(obj);
        !           338:        }
        !           339: }
        !           340:
        !           341: static void asir_popString()
        !           342: {
        !           343:        Obj val;
        !           344:        char *buf,*obuf;
        !           345:        int l;
        !           346:        STRING str;
        !           347:
        !           348:        val = asir_pop_one();
        !           349:        if ( !val )
        !           350:                obuf = 0;
        !           351:        else {
        !           352:                l = estimate_length(CO,val);
        !           353:                buf = (char *)ALLOCA(l+1);
        !           354:                soutput_init(buf);
        !           355:                sprintexpr(CO,val);
        !           356:                l = strlen(buf);
        !           357:                obuf = (char *)MALLOC(l+1);
        !           358:                strcpy(obuf,buf);
        !           359:        }
        !           360:        MKSTR(str,obuf);
        !           361:        ox_send_data(0,str);
        !           362: }
        !           363:
        !           364: static void asir_pops()
        !           365: {
        !           366:        int n;
        !           367:
        !           368:        n = (int)(((USINT)asir_pop_one())->body);
        !           369:        asir_OperandStackPtr = MAX(asir_OperandStackPtr-n,-1);
        !           370: }
        !           371:
        !           372: static void asir_setName(unsigned int serial)
        !           373: {
        !           374:        char *name;
        !           375:        int l,n;
        !           376:        char *dummy = "=0;";
        !           377:        SNODE snode;
        !           378:        ERR err;
        !           379:
        !           380:        name = ((STRING)asir_pop_one())->body;
        !           381:        l = strlen(name);
        !           382:        n = l+strlen(dummy)+1;
        !           383:        parse_strp = (char *)ALLOCA(n);
        !           384:        sprintf(parse_strp,"%s%s",name,dummy);
        !           385:        if ( mainparse(&snode) ) {
        !           386:                create_error(&err,serial,"cannot set to variable");
        !           387:                asir_push_one((Obj)err);
        !           388:        } else {
        !           389:                FA1((FNODE)FA0(snode)) = (pointer)mkfnode(1,I_FORMULA,asir_pop_one());
        !           390:                evalstat(snode);
        !           391:        }
        !           392: }
        !           393:
        !           394: static void asir_evalName(unsigned int serial)
        !           395: {
        !           396:        char *name;
        !           397:        int l,n;
        !           398:        SNODE snode;
        !           399:        ERR err;
        !           400:        pointer val;
        !           401:
        !           402:        name = ((STRING)asir_pop_one())->body;
        !           403:        l = strlen(name);
        !           404:        n = l+2;
        !           405:        parse_strp = (char *)ALLOCA(n);
        !           406:        sprintf(parse_strp,"%s;",name);
        !           407:        if ( mainparse(&snode) ) {
        !           408:                create_error(&err,serial,"no such variable");
        !           409:                val = (pointer)err;
        !           410:        } else
        !           411:                val = evalstat(snode);
        !           412:        asir_push_one(val);
        !           413: }
        !           414:
        !           415: static int asir_executeString()
        !           416: {
        !           417:        SNODE snode;
        !           418:        pointer val;
        !           419:        char *cmd;
        !           420: #if PARI
        !           421:        recover(0);
        !           422:        if ( setjmp(environnement) ) {
        !           423:                avma = top; recover(1);
        !           424:                resetenv("");
        !           425:        }
        !           426: #endif
        !           427:        cmd = ((STRING)asir_pop_one())->body;
        !           428:        parse_strp = cmd;
        !           429:        if ( mainparse(&snode) ) {
        !           430:                return -1;
        !           431:        }
        !           432:        val = evalstat(snode);
        !           433:        if ( NEXT(asir_infile) ) {
        !           434:                while ( NEXT(asir_infile) ) {
        !           435:                        if ( mainparse(&snode) ) {
        !           436:                                asir_push_one(val);
        !           437:                                return -1;
        !           438:                        }
        !           439:                        nextbp = 0;
        !           440:                        val = evalstat(snode);
        !           441:                }
        !           442:        }
        !           443:        asir_push_one(val);
        !           444:        return 0;
        !           445: }
        !           446:
        !           447: static void asir_executeFunction(int serial)
        !           448: {
        !           449:        char *func;
        !           450:        int argc;
        !           451:        FUNC f;
        !           452:        Obj result;
        !           453:        VL vl;
        !           454:        NODE n,n1;
        !           455:        STRING fname;
        !           456:        char *path;
        !           457:        USINT ui;
        !           458:        ERR err;
        !           459:        static char buf[BUFSIZ];
        !           460:
        !           461:        func = ((STRING)asir_pop_one())->body;
        !           462:        argc = (int)(((USINT)asir_pop_one())->body);
        !           463:
        !           464:        for ( n = 0; argc; argc-- ) {
        !           465:                NEXTNODE(n,n1);
        !           466:                BDY(n1) = (pointer)asir_pop_one();
        !           467:        }
        !           468:        if ( n )
        !           469:                NEXT(n1) = 0;
        !           470:
        !           471:        if ( !strcmp(func,"load") ) {
        !           472:                fname = (STRING)BDY(n);
        !           473:                if ( OID(fname) == O_STR ) {
        !           474:                        searchasirpath(BDY(fname),&path);
        !           475:                        if ( path ) {
        !           476:                                if ( do_message )
        !           477:                                        fprintf(stderr,"loading %s\n",path);
        !           478:                                execasirfile(path);
        !           479:                        } else
        !           480:                                if ( do_message )
        !           481:                                        fprintf(stderr,"load : %s not found in the search path\n",BDY(fname));
        !           482:                }
        !           483:                result = 0;
        !           484:        } else {
        !           485:                searchf(noargsysf,func,&f);
        !           486:                if ( !f )
        !           487:                        searchf(sysf,func,&f);
        !           488:                if ( !f )
        !           489:                        searchf(ubinf,func,&f);
        !           490:                if ( !f )
        !           491:                        searchf(usrf,func,&f);
        !           492:                if ( !f ) {
        !           493:                        sprintf(buf,"executeFunction : the function %s not found",func);
        !           494:                        create_error(&err,serial,buf);
        !           495:                        result = (Obj)err;
        !           496:                } else {
        !           497:                        result = (Obj)bevalf(f,n);
        !           498:                }
        !           499:        }
        !           500:        asir_push_one(result);
        !           501: }
        !           502:
        !           503: static void asir_end_flush()
        !           504: {
        !           505:        ox_flushing = 0;
        !           506: }
        !           507:
        !           508: /*
        !           509:   asir_OperandStackPtr points to the surface of the stack.
        !           510:   That is, the data at the stack top is
        !           511:        asir_OperandStack[asir_OperandStackPtr].
        !           512: */
        !           513:
        !           514:
        !           515: static void asir_push_one(Obj obj)
        !           516: {
        !           517:        if ( !obj || OID(obj) != O_VOID ) {
        !           518:                asir_OperandStackPtr++;
        !           519:                if ( asir_OperandStackPtr >= asir_OperandStackSize ) {
        !           520:                        asir_OperandStackSize += BUFSIZ;
        !           521:                        asir_OperandStack
        !           522:                                = (Obj *)REALLOC(asir_OperandStack,
        !           523:                                        asir_OperandStackSize*sizeof(Obj));
        !           524:                }
        !           525:                asir_OperandStack[asir_OperandStackPtr] = obj;
        !           526:        }
        !           527: }
        !           528:
        !           529: static Obj asir_pop_one() {
        !           530:        if ( asir_OperandStackPtr < 0 ) {
        !           531:                if ( do_message )
        !           532:                        fprintf(stderr,"OperandStack underflow");
        !           533:                return 0;
        !           534:        } else {
        !           535:                if ( do_message )
        !           536:                        fprintf(stderr,"pop at %d\n",asir_OperandStackPtr);
        !           537:                return asir_OperandStack[asir_OperandStackPtr--];
        !           538:        }
        !           539: }
        !           540:
        !           541: static void ox_asir_init(int argc,char **argv)
        !           542: {
        !           543:        int tmp;
        !           544:        char ifname[BUFSIZ];
        !           545:        extern int GC_dont_gc;
        !           546:        extern int read_exec_file;
        !           547:        extern int do_asirrc;
        !           548:        extern int do_server_in_X11;
        !           549:        char *getenv();
        !           550:        static ox_asir_initialized = 0;
        !           551:        FILE *ifp;
        !           552:
        !           553: #if !defined(VISUAL) && !MPI
        !           554:        do_server_in_X11 = 1; /* XXX */
        !           555: #endif
        !           556:        asir_save_handler();
        !           557: #if PARI
        !           558:        risa_pari_init();
        !           559: #endif
        !           560:        srandom((int)get_current_time());
        !           561:
        !           562: #if defined(THINK_C)
        !           563:        param_init();
        !           564: #endif
        !           565:        StackBottom = &tmp + 1; /* XXX */
        !           566:        rtime_init();
        !           567:        env_init();
        !           568:        endian_init();
        !           569: #if !defined(VISUAL) && !defined(THINK_C)
        !           570: /*     check_key(); */
        !           571: #endif
        !           572:        GC_init();
        !           573:        process_args(--argc,++argv);
        !           574:        output_init();
        !           575:        arf_init();
        !           576:        nglob_init();
        !           577:        glob_init();
        !           578:        sig_init();
        !           579:        tty_init();
        !           580:        debug_init();
        !           581:        pf_init();
        !           582:        sysf_init();
        !           583:        parif_init();
        !           584: #if defined(VISUAL)
        !           585:        init_socket();
        !           586: #endif
        !           587: #if defined(UINIT)
        !           588:        reg_sysf();
        !           589: #endif
        !           590: #if defined(THINK_C)
        !           591:        sprintf(ifname,"asirrc");
        !           592: #else
        !           593:        sprintf(ifname,"%s/.asirrc",getenv("HOME"));
        !           594: #endif
        !           595:        if ( do_asirrc && (ifp = fopen(ifname,"r")) ) {
        !           596:                input_init(ifp,ifname);
        !           597:                if ( !setjmp(env) ) {
        !           598:                        read_exec_file = 1;
        !           599:                        read_eval_loop();
        !           600:                        read_exec_file = 0;
        !           601:                }
        !           602:                fclose(ifp);
        !           603:        }
        !           604:        input_init(0,"string");
        !           605: #if !MPI
        !           606:        ox_io_init();
        !           607: #endif
        !           608:        create_my_mathcap("ox_asir");
        !           609: }
        !           610:
        !           611: static void ox_io_init() {
        !           612:        unsigned char c,rc;
        !           613:        extern int little_endian,ox_sock_id;
        !           614:
        !           615:        endian_init();
        !           616: #if defined(VISUAL)
        !           617:        if ( !ox_sock_id )
        !           618:                exit(0);
        !           619:        iofp[0].in = WSIO_open(ox_sock_id,"r");
        !           620:        iofp[0].out = WSIO_open(ox_sock_id,"w");
        !           621: #else
        !           622:        iofp[0].in = fdopen(3,"r");
        !           623:        iofp[0].out = fdopen(4,"w");
        !           624:
        !           625:        setbuffer(iofp[0].in,(char *)malloc(LBUFSIZ),LBUFSIZ);
        !           626:        setbuffer(iofp[0].out,(char *)malloc(LBUFSIZ),LBUFSIZ);
        !           627:        signal(SIGUSR1,ox_usr1_handler);
        !           628: #endif
        !           629:        asir_OperandStackSize = BUFSIZ;
        !           630:        asir_OperandStack = (Obj *)CALLOC(asir_OperandStackSize,sizeof(Obj));
        !           631:        asir_OperandStackPtr = -1;
        !           632:        if ( little_endian )
        !           633:                c = 1;
        !           634:        else
        !           635:                c = 0xff;
        !           636:        /* server : write -> read */
        !           637:        write_char(iofp[0].out,&c); ox_flush_stream_force(0);
        !           638:        read_char(iofp[0].in,&rc);
        !           639:        iofp[0].conv = c == rc ? 0 : 1;
        !           640: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>