Annotation of pgp/src/system.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * system.c
        !             3:  *
        !             4:  * Routines specific for non-MSDOS implementations of pgp.
        !             5:  * 
        !             6:  *     Modified 24-Jun-92 HAJK
        !             7:  *     Adapt for VAX/VMS.
        !             8:  */
        !             9: #include <stdio.h>
        !            10: #include "pgp.h"
        !            11: 
        !            12: 
        !            13: /*===========================================================================*/
        !            14: /*
        !            15:  * UNIX
        !            16:  */
        !            17: 
        !            18: #ifdef UNIX
        !            19: /*
        !            20:  * Define USE_SELECT to use the select() system call to check if
        !            21:  * keyboard input is available. Define USE_NBIO to use non-blocking
        !            22:  * read(). If you don't define anything the FIONREAD ioctl() command
        !            23:  * will be used.
        !            24:  *
        !            25:  * Define NOTERMIO if you don't have the termios stuff
        !            26:  */
        !            27: #include <sys/types.h>
        !            28: #include <fcntl.h>
        !            29: #ifndef NeXT
        !            30: #include <unistd.h>
        !            31: #endif
        !            32: 
        !            33: #ifndef        NOTERMIO
        !            34: #ifndef M_XENIX
        !            35: #include <termios.h>
        !            36: #else
        !            37: #include <termio.h>
        !            38: #endif /* not M_XENIX */
        !            39: #else
        !            40: #include <sgtty.h>
        !            41: #endif
        !            42: 
        !            43: #ifdef USE_SELECT
        !            44: #include <sys/time.h>
        !            45: #else
        !            46: #ifndef USE_NBIO
        !            47: #include <sys/ioctl.h>         /* for FIONREAD */
        !            48: #ifndef FIONREAD
        !            49: #define        FIONREAD        TIOCINQ
        !            50: #endif
        !            51: #endif
        !            52: #endif
        !            53: #include <signal.h>
        !            54: 
        !            55: static void setsigs(void);
        !            56: static void rmsigs(void);
        !            57: static void sig1(int);
        !            58: static void sig2(int);
        !            59: void breakHandler(int);
        !            60: static int ttyfd= -1;
        !            61: #ifndef M_XENIX
        !            62: static void (*savesig)(int);
        !            63: #else
        !            64: static int (*savesig)(int);
        !            65: #endif
        !            66: 
        !            67: void ttycbreak(void);
        !            68: void ttynorm(void);
        !            69: 
        !            70: 
        !            71: #ifndef NOTERMIO
        !            72: #ifndef M_XENIX
        !            73: static struct termios itio, tio;
        !            74: #else
        !            75: static struct termio itio, tio;
        !            76: #endif /* not M_XENIX */
        !            77: #else
        !            78: static struct sgttyb isg, sg;
        !            79: #endif
        !            80: 
        !            81: #ifdef USE_NBIO
        !            82: static int kbuf= -1;   /* buffer to store char read by kbhit() */
        !            83: static int fflags;
        !            84: #endif
        !            85: 
        !            86: static int gottio = 0;
        !            87: 
        !            88: void ttycbreak(void)
        !            89: {
        !            90:        if (ttyfd == -1) {
        !            91:                if ((ttyfd = open("/dev/tty", O_RDWR)) < 0) {
        !            92:                    fprintf(stderr, "cannot open tty, using stdin\n");
        !            93:                        ttyfd = 0;
        !            94:                }
        !            95:        }
        !            96: #ifndef NOTERMIO
        !            97: #ifndef M_XENIX
        !            98:        if (tcgetattr(ttyfd, &tio) < 0)
        !            99: #else
        !           100:        if (ioctl(ttyfd, TCGETA, &tio) < 0)
        !           101: #endif  /* not M_XENIX */
        !           102:        {       fprintf (stderr, "\nUnable to get terminal characteristics: ");
        !           103:                perror("ioctl");
        !           104:                exitPGP(1);
        !           105:        }
        !           106:        itio = tio;
        !           107:        setsigs();
        !           108:        gottio = 1;
        !           109: #ifdef USE_NBIO
        !           110:        tio.c_cc[VMIN] = 0;
        !           111: #else
        !           112:        tio.c_cc[VMIN] = 1;
        !           113: #endif
        !           114:        tio.c_cc[VTIME] = 0;
        !           115:        tio.c_lflag &= ~(ECHO|ICANON);
        !           116: #ifndef M_XENIX
        !           117:        tcsetattr (ttyfd, TCSAFLUSH, &tio);
        !           118: #else
        !           119:        ioctl(ttyfd, TCSETAW, &tio);
        !           120: #endif /* not M_XENIX */
        !           121: #else
        !           122:     if (ioctl(ttyfd, TIOCGETP, &sg) < 0)
        !           123:        {       fprintf (stderr, "\nUnable to get terminal characteristics: ");
        !           124:                perror("ioctl");
        !           125:                exitPGP(1);
        !           126:        }
        !           127:        isg = sg;
        !           128:        setsigs();
        !           129:        gottio = 1;
        !           130:     sg.sg_flags |= CBREAK;
        !           131:        sg.sg_flags &= ~ECHO;
        !           132:     ioctl(ttyfd, TIOCSETP, &sg);
        !           133: #endif /* !NOTERMIO */
        !           134: #ifdef USE_NBIO
        !           135:        if ((fflags = fcntl(ttyfd, F_GETFL)) != -1)
        !           136:                fcntl(ttyfd, F_SETFL, fflags|O_NDELAY);
        !           137: #endif
        !           138: }
        !           139: 
        !           140: 
        !           141: void ttynorm(void)
        !           142: {      gottio = 0;
        !           143: #ifdef USE_NBIO
        !           144:        if (fcntl(ttyfd, F_SETFL, fflags) == -1)
        !           145:                perror("fcntl");
        !           146: #endif
        !           147: #ifndef NOTERMIO
        !           148: #ifndef M_XENIX
        !           149:        tcsetattr (ttyfd, TCSAFLUSH, &itio);
        !           150: #else
        !           151:        ioctl(ttyfd, TCSETAW, &itio);
        !           152: #endif /* not M_XENIX */
        !           153: #else
        !           154:     ioctl(ttyfd, TIOCSETP, &isg);
        !           155: #endif
        !           156:        rmsigs();
        !           157: }
        !           158: 
        !           159: static void sig1 (int sig)
        !           160: {
        !           161: #ifndef NOTERMIO
        !           162: #ifndef M_XENIX
        !           163:        tcsetattr (ttyfd, TCSANOW, &itio);
        !           164: #else
        !           165:        ioctl(ttyfd, TCSETAW, &itio);
        !           166: #endif /* not M_XENIX */
        !           167: #else
        !           168:     ioctl(ttyfd, TIOCSETP, &isg);
        !           169: #endif
        !           170:        signal (sig, SIG_DFL);
        !           171:        if (sig == SIGINT)
        !           172:                breakHandler(SIGINT);
        !           173:        kill (getpid(), sig);
        !           174: }
        !           175: 
        !           176: static void sig2 (int sig)
        !           177: {      if (gottio)
        !           178:                ttycbreak();
        !           179:        else
        !           180:                setsigs();
        !           181: }
        !           182: 
        !           183: static void setsigs(void)
        !           184: {      savesig = signal (SIGINT, sig1);
        !           185: #ifdef SIGTSTP
        !           186:        signal (SIGCONT, sig2);
        !           187:        signal (SIGTSTP, sig1);
        !           188: #endif
        !           189: }
        !           190: 
        !           191: static void rmsigs(void)
        !           192: {      signal (SIGINT, savesig);
        !           193: #ifdef SIGTSTP
        !           194:        signal (SIGCONT, SIG_DFL);
        !           195:        signal (SIGTSTP, SIG_DFL);
        !           196: #endif
        !           197: }
        !           198: 
        !           199: #ifndef CRUDE
        !           200: int kbhit(void)
        !           201: /* Return TRUE if there is a key to be read */
        !           202: {
        !           203: #ifdef USE_SELECT              /* use select() system call */
        !           204:        struct timeval t;
        !           205:        fd_set n;
        !           206:        int r;
        !           207: 
        !           208:        timerclear(&t);
        !           209:        FD_ZERO(&n);
        !           210:        FD_SET(ttyfd, &n);
        !           211:        r = select(32, &n, NULL, NULL, &t);
        !           212:        if (r == -1) {
        !           213:                perror("select");
        !           214:                exitPGP(1);
        !           215:        }
        !           216:        return r > 0;
        !           217: #else
        !           218: #ifdef USE_NBIO                /* use non-blocking read() */
        !           219:        unsigned char ch;
        !           220:        if (kbuf >= 0) 
        !           221:                return(1);
        !           222:        if (read(ttyfd, &ch, 1) == 1) {
        !           223:                kbuf = ch;
        !           224:                return(1);
        !           225:        }
        !           226:        return(0);
        !           227: #else
        !           228:        long lf;
        !           229:        if (ioctl(ttyfd, FIONREAD, &lf) == -1) {
        !           230:                perror("ioctl: FIONREAD");
        !           231:                exitPGP(1);
        !           232:        }
        !           233:        return(lf);
        !           234: #endif
        !           235: #endif
        !           236: }
        !           237: #endif /* !CRUDE */
        !           238: 
        !           239: int getch(void)
        !           240: {
        !           241:        char c;
        !           242: #ifdef USE_NBIO
        !           243:        while (!kbhit());       /* kbhit() does the reading */
        !           244:        c = kbuf;
        !           245:        kbuf = -1;
        !           246: #else
        !           247:        read(ttyfd, &c, 1);
        !           248: #endif
        !           249:        return(c);
        !           250: }
        !           251: 
        !           252: #ifdef BSD_OLD
        !           253: void *memset(s, c, n)
        !           254: void *s;
        !           255: register int c, n;
        !           256: {
        !           257:        register char *p = s;
        !           258:        ++n;
        !           259:        while (--n)
        !           260:                *p++ = c;
        !           261:        return(s);
        !           262: }
        !           263: int memcmp(s1, s2, n)
        !           264: register unsigned char *s1, *s2;
        !           265: register int n;
        !           266: {
        !           267:        if (!n)
        !           268:                return(0);
        !           269:        while (--n && *s1 == *s2) {
        !           270:                ++s1;
        !           271:                ++s2;
        !           272:        }
        !           273:        return(*s1 - *s2);
        !           274: }
        !           275: void *memcpy(s1, s2, n)
        !           276: register char *s1, *s2;
        !           277: register int n;
        !           278: {
        !           279:        char *p = s1;
        !           280:        ++n;
        !           281:        while (--n)
        !           282:                *s1++ = *s2++;
        !           283:        return(p);
        !           284: }
        !           285: #endif /* BSD_OLD */
        !           286: 
        !           287: #ifdef  M_XENIX         /* XENIX/286 specific stuff */
        !           288: int remove(name)
        !           289: char *name;
        !           290: {
        !           291:        return unlink(name);
        !           292: }
        !           293: 
        !           294: int rename(old, new)
        !           295: register char *old, *new;
        !           296: {
        !           297:        (void) unlink(new);
        !           298:        if (link(old, new) < 0)
        !           299:                return -1;
        !           300:        if (unlink(old) < 0) {
        !           301:                (void) unlink(new);
        !           302:                return -1;
        !           303:        }
        !           304:        return 0;
        !           305: }
        !           306: #endif /* M_XENIX */
        !           307: #endif /* UNIX */
        !           308: 
        !           309: 
        !           310: 
        !           311: /*===========================================================================*/
        !           312: /*
        !           313:  * VMS
        !           314:  */
        !           315: 
        !           316: #ifdef VMS                     /* kbhit()/getch() equivalent */
        !           317: 
        !           318: /*
        !           319:  * This code defines an equivalent version of kbhit() and getch() for
        !           320:  * use under VAX/VMS, together with an exit handler to reset terminal
        !           321:  * characteristics.
        !           322:  *
        !           323:  * This code assumes that kbhit() has been invoked to test that there
        !           324:  * are characters in the typeahead buffer before getch() is invoked to
        !           325:  * get the answer.
        !           326:  */
        !           327: 
        !           328: #include <descrip.h>
        !           329: #include <iodef.h>
        !           330: #ifdef VAXC
        !           331: #include <ttdef.h>
        !           332: #include <tt2def.h>
        !           333: #include <dcdef.h>
        !           334: #else /* Probably GNU */
        !           335: #include <vms/$ttdef.h>
        !           336: #include <vms/$tt2def.h>
        !           337: #include <vms/$dcdef.h>
        !           338: #endif /* VAXC */
        !           339: static volatile short  _kbhitChan_ = 0;
        !           340: 
        !           341: static volatile struct IOSB {
        !           342:        unsigned short sts;
        !           343:        unsigned short byteCount;
        !           344:        unsigned short terminator;
        !           345:        unsigned short terminatorSize;
        !           346:        } iosb;
        !           347: static $DESCRIPTOR (kbdev_desc, "SYS$COMMAND:");
        !           348: 
        !           349: static volatile struct {
        !           350:        char Class;
        !           351:        char Type;
        !           352:        unsigned short BufferSize;
        !           353:        unsigned int Mode;
        !           354:        int ExtChar;
        !           355:   } CharBuf, OldCharBuf;
        !           356: 
        !           357: void kbhit_handler(int *sts)
        !           358: {
        !           359:   int mysts;
        !           360: 
        !           361:   CharBuf.Mode = OldCharBuf.Mode;
        !           362:   CharBuf.ExtChar = OldCharBuf.ExtChar;
        !           363:   CharBuf.Mode &= ~TT$M_NOECHO;
        !           364:   CharBuf.ExtChar &= ~TT2$M_PASTHRU;
        !           365:   if ((mysts = sys$qiow (
        !           366:                           0,
        !           367:                           _kbhitChan_,
        !           368:                           IO$_SETMODE,
        !           369:                           &iosb,
        !           370:                           0,
        !           371:                           0,
        !           372:                           &CharBuf,
        !           373:                           12,
        !           374:                           0,
        !           375:                           0,
        !           376:                           0,
        !           377:                           0)) & 01) mysts = iosb.sts;
        !           378:   (void) sys$dassgn (
        !           379:          _kbhitChan_);
        !           380:   _kbhitChan_ = 0;
        !           381:   if (!(mysts & 01)) {
        !           382:        fprintf(stderr,"\nFailed to reset terminal characteristics!");
        !           383:        (void) lib$signal(mysts);
        !           384:   }
        !           385: }
        !           386: 
        !           387: unsigned int exsts;
        !           388: 
        !           389: static struct {
        !           390:        int link;
        !           391:        void *rtn;
        !           392:        int argcnt;
        !           393:        int *stsaddr;
        !           394:    } exhblk = { 0, &(kbhit_handler), 1, &(exsts)};
        !           395: 
        !           396: int kbhit()
        !           397: {
        !           398:   int sts = 1;
        !           399: 
        !           400:   struct {
        !           401:        unsigned short TypAhdCnt;
        !           402:        char FirstChar;
        !           403:        char Reserved[5];
        !           404:   } TypCharBuf;
        !           405: 
        !           406:   if (_kbhitChan_ == 0) {
        !           407:        if ((sts = sys$assign (
        !           408:                           &kbdev_desc,
        !           409:                           &_kbhitChan_,
        !           410:                           0,
        !           411:                           0)) & 1 == 0) lib$stop(sts);
        !           412:        if ((sts = sys$qiow (
        !           413:                           0,
        !           414:                           _kbhitChan_,
        !           415:                           IO$_SENSEMODE,
        !           416:                           &iosb,
        !           417:                           0,
        !           418:                           0,
        !           419:                           &CharBuf,
        !           420:                           12,
        !           421:                           0,
        !           422:                           0,
        !           423:                           0,
        !           424:                           0)) & 01) sts = iosb.sts;
        !           425:        if (sts & 01) {
        !           426:          if (!(CharBuf.Class & DC$_TERM)) {
        !           427:            fprintf(stderr,"\nNot running on a terminal");
        !           428:            exitPGP(1);
        !           429:          } else {
        !           430:            OldCharBuf.Mode = CharBuf.Mode;
        !           431:            OldCharBuf.ExtChar = CharBuf.ExtChar;
        !           432:            CharBuf.Mode |= TT$M_NOECHO;
        !           433:            CharBuf.ExtChar |= TT2$M_PASTHRU;
        !           434:            if ((sts = sys$qiow (
        !           435:                           0,
        !           436:                           _kbhitChan_,
        !           437:                           IO$_SETMODE,
        !           438:                           &iosb,
        !           439:                           0,
        !           440:                           0,
        !           441:                           &CharBuf,
        !           442:                           12,
        !           443:                           0,
        !           444:                           0,
        !           445:                           0,
        !           446:                           0)) & 01) sts = iosb.sts;
        !           447:            if (sts & 01) {
        !           448:          /*
        !           449:          **  Declare Exit Handler
        !           450:          */
        !           451:               (void) sys$dclexh (&exhblk);
        !           452:            } else {
        !           453:               fprintf(stderr,"\nFailed to set terminal characteristics!");
        !           454:              (void) lib$signal(sts);
        !           455:               exitPGP(1);
        !           456:             }
        !           457:          }
        !           458:        }
        !           459:   }
        !           460:   /*
        !           461:   **  Get typeahead count
        !           462:   */
        !           463:   if ((sts = sys$qiow (
        !           464:                           0,
        !           465:                           _kbhitChan_,
        !           466:                           IO$_SENSEMODE | IO$M_TYPEAHDCNT,
        !           467:                           &iosb,
        !           468:                           0,
        !           469:                           0,
        !           470:                           &TypCharBuf,
        !           471:                           8,
        !           472:                           0,
        !           473:                           0,
        !           474:                           0,
        !           475:                           0)) & 01) sts = iosb.sts;
        !           476:   if (sts & 01) return(TypCharBuf.TypAhdCnt>0);
        !           477:   (void) lib$signal(sts);
        !           478:   exitPGP(1);
        !           479: }
        !           480: 
        !           481: int getch()
        !           482: {
        !           483:   unsigned int sts;
        !           484:   volatile char CharBuf;
        !           485: 
        !           486:   if ((sts = sys$qiow (
        !           487:                          0,
        !           488:                          _kbhitChan_,
        !           489:                          IO$_READVBLK,
        !           490:                          &iosb,
        !           491:                          0,
        !           492:                          0,
        !           493:                          &CharBuf,
        !           494:                          1,
        !           495:                          0,
        !           496:                          0,
        !           497:                          0,
        !           498:                          0)) & 01) sts = iosb.sts;
        !           499:   if (sts & 01) return ((int) CharBuf);
        !           500:   fprintf(stderr,"\nFailed to get character");
        !           501:   (void) lib$signal(sts);
        !           502: }
        !           503: 
        !           504: ttynorm()
        !           505: {
        !           506:   int sts;
        !           507: 
        !           508:   if (_kbhitChan_ != 0) {
        !           509:     (void) SYS$CANEXH(&exhblk);
        !           510:     kbhit_handler(&sts);
        !           511:   }
        !           512: }
        !           513: 
        !           514: void ttycbreak ()
        !           515: {
        !           516:    ttynorm();
        !           517: }
        !           518: 
        !           519: unsigned long  vms_clock_bits[2];      /* VMS Hardware Clock */
        !           520: const long     vms_ticks_per_update = 100000L; /* Clock update int. */
        !           521: 
        !           522: #endif /* VMS */
        !           523: 
        !           524: 
        !           525: 
        !           526: /*========================================================================*/
        !           527: /*
        !           528:  * AMIGA
        !           529:  */
        !           530: 
        !           531: #ifdef AMIGA   /* Amiga-specific stuff */
        !           532: 
        !           533: #include <exec/types.h>
        !           534: #include <exec/memory.h>
        !           535: #include <exec/ports.h>
        !           536: #include <libraries/dosextens.h>
        !           537: #ifdef LATTICE
        !           538: #include <proto/exec.h> 
        !           539: #include <proto/dos.h> 
        !           540: #endif /* LATTICE */
        !           541: extern FILE *pgpout;
        !           542: extern int aecho;
        !           543: 
        !           544: FILE *tmpfile()
        !           545: {
        !           546:   FILE *fp;
        !           547: 
        !           548:   if ((fp=fopen("tmpfile.tmp","w+b"))==NULL) {
        !           549:        perror("tmpfile.tmp");
        !           550:        return(NULL);
        !           551:   }
        !           552:   return(fp);
        !           553: 
        !           554: }
        !           555: 
        !           556: /* amiga version of getch() 
        !           557:    Cor Bosman , jul-22-92 
        !           558: */
        !           559: 
        !           560: 
        !           561: sendpacket(struct MsgPort *rec,LONG action,LONG arg1) 
        !           562: {
        !           563:   struct StandardPacket *pkt;
        !           564:   struct msgPort *rp;
        !           565:   LONG res1 = 0L;
        !           566: 
        !           567:   if (rp = (struct MsgPort *)CreatePort(NULL,0L)) {
        !           568:     if (pkt = (struct StandardPacket *)\
        !           569:         AllocMem(sizeof(struct StandardPacket),MEMF_PUBLIC|MEMF_CLEAR)) {
        !           570:           pkt->sp_Msg.mn_Node.ln_Name = (BYTE *)&pkt->sp_Pkt;
        !           571:           pkt->sp_Pkt.dp_Link = &pkt->sp_Msg;
        !           572:           pkt->sp_Pkt.dp_Port = rp;
        !           573:           pkt->sp_Pkt.dp_Type = action;
        !           574:           pkt->sp_Pkt.dp_Arg1 = arg1;
        !           575:           PutMsg(rec,&pkt->sp_Msg);
        !           576:           WaitPort(rp);
        !           577:           GetMsg(rp);
        !           578:           res1 = pkt->sp_Pkt.dp_Res1;
        !           579:           FreeMem((UBYTE*)pkt,sizeof(struct StandardPacket));
        !           580:         }
        !           581:         DeletePort(rp);
        !           582:        }
        !           583:        return(res1);
        !           584: 
        !           585: }
        !           586: 
        !           587: /* ttycbreak for amiga.
        !           588:  * Cor Bosman , jul-30-92
        !           589: */
        !           590: 
        !           591: void ttycbreak()
        !           592: {
        !           593:   BPTR in,out;
        !           594:   char buf[128];
        !           595:   struct MsgPort *ch;
        !           596: 
        !           597:   in=Input();
        !           598:   out=Output();
        !           599:   ch = ((struct FileHandle *)BADDR(in))->fh_Type;
        !           600:   sendpacket(ch,ACTION_SCREEN_MODE,-1L);
        !           601: }
        !           602: 
        !           603: /* ttynorm for amiga
        !           604:  * Cor Bosman , jul-30-92
        !           605: */
        !           606: 
        !           607: void ttynorm()
        !           608: {
        !           609: 
        !           610:   BPTR in,out;
        !           611:   char buf[128];
        !           612:   struct MsgPort *ch;
        !           613: 
        !           614:   in=Input();
        !           615:   out=Output();
        !           616:   ch = ((struct FileHandle *)BADDR(in))->fh_Type;
        !           617:   sendpacket(ch,ACTION_SCREEN_MODE,0L);
        !           618: }
        !           619: 
        !           620: char getch(void)
        !           621: {
        !           622:   char buf[128];
        !           623:   BPTR in,out;
        !           624: 
        !           625:   in = Input();
        !           626:   out = Output();
        !           627:   Read(in,buf,1);
        !           628:   if (aecho) 
        !           629:     Write(out, buf, 1);
        !           630:   return(buf[0]);
        !           631: }
        !           632: 
        !           633: /* kbhit() function for amiga.
        !           634:  * Cor Bosman , jul-30-92
        !           635: */
        !           636: 
        !           637: int kbhit() 
        !           638: {
        !           639:   if(WaitForChar(Input(), 1)) return 1;
        !           640:   return 0;
        !           641: }
        !           642: 
        !           643: #ifdef LATTICE
        !           644: 
        !           645: /*
        !           646:  *  Lattice-C  ^C-Handler 
        !           647: */
        !           648: 
        !           649: int CXBRK()
        !           650: {
        !           651:   BPTR in,out;
        !           652:   struct MsgPort *ch;
        !           653:   in=Input();
        !           654:   out=Output();
        !           655: 
        !           656:   /* it might happen we catch a ^C while in cbreak mode.
        !           657:    * so always set the screen to the normal mode.
        !           658:   */
        !           659: 
        !           660:   ch = ((struct FileHandle *)BADDR(in))->fh_Type;
        !           661:   sendpacket(ch, ACTION_SCREEN_MODE, 0L);
        !           662: 
        !           663: 
        !           664:   fprintf(pgpout, "\n*** Program Aborted.\n");
        !           665:   exitPGP(6); /* INTERRUPT */
        !           666: }
        !           667: #endif
        !           668: 
        !           669: #endif /* AMIGA */
        !           670: 
        !           671: 
        !           672: 
        !           673: /*===========================================================================*/
        !           674: /*
        !           675:  * other stuff for non-MSDOS systems
        !           676:  */
        !           677: 
        !           678: #ifdef ATARI
        !           679: #include <string.h>
        !           680: #endif
        !           681: 
        !           682: #if !defined(MSDOS) && !defined(ATARI)
        !           683: #include <ctype.h>
        !           684: char *strlwr(char *s)
        !           685: {      /*
        !           686:        **        Turns string s into lower case.
        !           687:        */
        !           688:        int c;
        !           689:        char *p = s;
        !           690:        while (c = *p)
        !           691:                *p++ = tolower(c);
        !           692:        return(s);
        !           693: }
        !           694: #endif /* !MSDOS && !ATARI */
        !           695: 
        !           696: 
        !           697: #ifdef strstr
        !           698: #undef strstr
        !           699: /* Not implemented on some systems - return first instance of s2 in s1 */
        !           700: char *mystrstr (char *s1, char *s2)
        !           701: {      int i;
        !           702:        char *strchr();
        !           703: 
        !           704:        if (!s2 || !*s2)
        !           705:                return s1;
        !           706:        for ( ; ; )
        !           707:        {       if (!(s1 = strchr (s1, *s2)))
        !           708:                        return s1;
        !           709:                for (i=1; s2[i] && (s1[i]==s2[i]); ++i)
        !           710:                        ;
        !           711:                if (!s2[i])
        !           712:                        return s1;
        !           713:                ++s1;
        !           714:        }
        !           715: }
        !           716: #endif /* strstr */
        !           717: 
        !           718: 
        !           719: #ifdef fopen
        !           720: #undef fopen
        !           721: 
        !           722: #ifdef ATARI
        !           723: #define F_BUF_SIZE 8192  /* seems to be a good value ... */
        !           724: 
        !           725: FILE *myfopen(const char *filename, const char *mode)
        !           726: /* Open streams with larger buffer to increase disk I/O speed. */
        !           727: /* Adjust F_BUF_SIZE to change buffer size.                    */
        !           728: {
        !           729:     FILE *f;
        !           730: 
        !           731:     if ( (f = fopen(filename, mode)) != NULL )
        !           732:         if (setvbuf(f, NULL, _IOFBF, F_BUF_SIZE)) /* no memory? */
        !           733:         {
        !           734:             fclose(f);                 /* then close it again */
        !           735:             f = fopen(filename, mode); /* and try again in normal mode */
        !           736:         }
        !           737:     return(f);                         /* return either handle or NULL */
        !           738: }
        !           739:        
        !           740: #else /* ATARI */
        !           741: 
        !           742: /* Remove "b" from 2nd arg */
        !           743: FILE *myfopen(char *filename, char *type)
        !           744: {      char buf[10];
        !           745: 
        !           746:        buf[0] = *type++;
        !           747:        if (*type=='b')
        !           748:                ++type;
        !           749:        strcpy(buf+1,type);
        !           750:        return fopen(filename, buf);
        !           751: }
        !           752: #endif /* not ATARI */
        !           753: #endif /* fopen */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.