[BACK]Return to fep_util.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / fep

Annotation of OpenXM_contrib2/fep/fep_util.c, Revision 1.1

1.1     ! noro        1: /*     Copyright (c) 1987, 1988 by Software Research Associates, Inc.  */
        !             2:
        !             3: #ifndef lint
        !             4: static char rcsid[]=
        !             5: "$Header: fep_util.c,v 4.1 88/08/28 18:57:41 utashiro Exp $ (SRA)";
        !             6: #endif /* lint */
        !             7:
        !             8: #ifndef MKARGDEBUG
        !             9:
        !            10: #include <stdio.h>
        !            11: #include <pwd.h>
        !            12: #include <sys/types.h>
        !            13: #if defined(__CYGWIN__)
        !            14: #include <dirent.h>
        !            15: #else
        !            16: #include <sys/dir.h>
        !            17: #endif
        !            18: #include <ctype.h>
        !            19: #include "fep_defs.h"
        !            20:
        !            21: message(messageString)
        !            22:     char *messageString;
        !            23: {
        !            24:     write (2, messageString, strlen (messageString));
        !            25: }
        !            26:
        !            27: errorBell()
        !            28: {
        !            29:     write (2, "\007", 1);
        !            30: }
        !            31:
        !            32: ctlprint(string)
        !            33:     char *string;
        !            34: {
        !            35:     register char  *cp;
        !            36:
        !            37:     for (cp = string; *cp; cp++) {
        !            38:        if (isctlchar (*cp)) {
        !            39:            putchar ('^');
        !            40:            putchar (unctl (*cp));
        !            41:        }
        !            42:        else
        !            43:            putchar (*cp);
        !            44:     }
        !            45:     fputs ("\r\n", stdout);
        !            46:     fflush (stdout);
        !            47: }
        !            48:
        !            49: /*
        !            50:  * Print string using "^" for control characters
        !            51:  */
        !            52: printS (string)
        !            53:     char *string;
        !            54: {
        !            55:     char *cp;
        !            56:
        !            57:     for (cp = string; *cp; cp++)
        !            58:        putChar (*cp);
        !            59: }
        !            60:
        !            61: /*
        !            62:  * Check the line is empty or not
        !            63:  */
        !            64: is_empty_line(line)
        !            65:     char *line;
        !            66: {
        !            67:     register char *cp;
        !            68:
        !            69:     for (cp = line; *cp; cp++) {
        !            70:         if (!isspace(*cp)) {
        !            71:            return(0);
        !            72:        }
        !            73:     }
        !            74:     return(1);
        !            75: }
        !            76:
        !            77: /*
        !            78:  * Put character using "^" for control characters
        !            79:  */
        !            80: putChar(c)
        !            81:     char c;
        !            82: {
        !            83:     if (isctlchar(c)) {
        !            84:        (void) putchar('^');
        !            85:        (void) putchar(unctl(c));
        !            86:     }
        !            87:     else
        !            88:        (void) putchar(c);
        !            89: }
        !            90:
        !            91: char *
        !            92: x_dirname (dir)
        !            93:     char *dir;
        !            94: {
        !            95:     static char dirname [256];
        !            96:     char *index();
        !            97:
        !            98:     if (*dir != '~')
        !            99:        strcpy (dirname, dir);
        !           100:     else {
        !           101:        struct passwd *pw;
        !           102:
        !           103:        if (*(dir+1) == '/' || *(dir+1) == '\0') {
        !           104:            pw = getpwuid (getuid ());
        !           105:        }
        !           106:        else {
        !           107:            char user [64], *sp, *dp;
        !           108:
        !           109:            for (sp = dir+1, dp = user; *sp && *sp != '/'; sp++, dp++)
        !           110:                *dp = *sp;
        !           111:            *dp = '\0';
        !           112:            pw = getpwnam (user);
        !           113:        }
        !           114:
        !           115:        if (pw) {
        !           116:            strcpy (dirname, pw->pw_dir);
        !           117:            if (any ('/', dir))
        !           118:                strcat (dirname, index (dir, '/'));
        !           119:        }
        !           120:        else {
        !           121:            strcpy (dirname, dir);
        !           122:        }
        !           123:     }
        !           124:
        !           125:     return (dirname);
        !           126: }
        !           127:
        !           128: DIR *
        !           129: x_opendir (dir)
        !           130:     char *dir;
        !           131: {
        !           132:     return (opendir (x_dirname (dir)));
        !           133: }
        !           134:
        !           135: /*
        !           136:  * Strring compare for qsort
        !           137:  */
        !           138: scmp (a, b)
        !           139:     char **a, **b;
        !           140: {
        !           141:
        !           142:     return (strcmp (*a, *b));
        !           143: }
        !           144:
        !           145: /*
        !           146:  * Return 1 if "str" is prefixed by "sub"
        !           147:  */
        !           148: prefix (sub, str)
        !           149:     register char *sub, *str;
        !           150: {
        !           151:
        !           152:     for (;;) {
        !           153:        if (*sub == 0)
        !           154:            return (1);
        !           155:        if (*str == 0)
        !           156:            return (0);
        !           157:        if (*sub++ != *str++)
        !           158:            return (0);
        !           159:     }
        !           160: }
        !           161:
        !           162: /*
        !           163:  * Return 1 if s includes character c
        !           164:  */
        !           165: any (c, s)
        !           166:     register int c;
        !           167:     register char *s;
        !           168: {
        !           169:
        !           170:     while (*s)
        !           171:        if (*s++ == c)
        !           172:            return(1);
        !           173:     return(0);
        !           174: }
        !           175:
        !           176: #ifndef max
        !           177: /*
        !           178:  * Return maximum number of d1 and d2
        !           179:  */
        !           180: max (d1, d2)
        !           181:     int d1, d2;
        !           182: {
        !           183:     return (d1 > d2 ? d1 : d2);
        !           184: }
        !           185: #endif /* max */
        !           186:
        !           187: #else /* MKARGDEBUG */
        !           188:
        !           189: #include <stdio.h>
        !           190: #include <ctype.h>
        !           191:
        !           192: #define MAXARGS        64
        !           193:
        !           194: main()
        !           195: {
        !           196:     char s[128];
        !           197:     char *argv[MAXARGS];
        !           198:
        !           199:     while (gets (s)) {
        !           200:        register int c;
        !           201:
        !           202:        showArgs (s);
        !           203:     }
        !           204: }
        !           205: #endif /* MKARGDEBUG */
        !           206:
        !           207: showArgs (comline)
        !           208:     char *comline;
        !           209: {
        !           210:     char *argv[MAXARGS];
        !           211:     register int c;
        !           212:     register char **argp;
        !           213:     register int i;
        !           214:
        !           215:     c = mkargv (comline, argv, MAXARGS);
        !           216:     if (c < 0) {
        !           217:        printf ("%s\n", argv[0]);
        !           218:        return;
        !           219:     }
        !           220:     printf ("argc = %d\n", c);
        !           221:     for (i = 0, argp = argv; *argp; argp++, i++) {
        !           222:        printf ("\"%s\" ", *argp);
        !           223:     }
        !           224:     printf ("\n");
        !           225: }
        !           226:
        !           227: mkargv (s, argv, maxarg)
        !           228:     char *s;
        !           229:     char *argv[];
        !           230:     int maxarg;
        !           231: {
        !           232:     register char *cp;
        !           233:     register int argc = 0;
        !           234:     int insquot = 0, indquot = 0, ignorenext = 0;
        !           235:     enum {STRING, SPACE} status = SPACE;
        !           236:     static char buf[1024], *bp;
        !           237:
        !           238:     for (cp = s, bp = buf; *cp; cp++) {
        !           239:
        !           240:        if (argc > maxarg)
        !           241:            return (argc);
        !           242:
        !           243:        /*
        !           244:         * Found white space
        !           245:         */
        !           246:        if (isspace (*cp)) {
        !           247:            /*
        !           248:             * In outside of quotation
        !           249:             */
        !           250:            if (!ignorenext && !insquot && !indquot) {
        !           251:                /*
        !           252:                 * If status was in string, go next arg
        !           253:                 */
        !           254:                if (status == STRING) {
        !           255:                    status = SPACE;
        !           256:                    *bp++ = '\0';
        !           257:                    continue;
        !           258:                }
        !           259:                else
        !           260:                    continue;
        !           261:            }
        !           262:        }
        !           263:
        !           264: #      define SPECIALCHARS "\"\'\\"
        !           265:        if (!ignorenext && index (SPECIALCHARS, *cp)) {
        !           266:            switch (*cp) {
        !           267:
        !           268:                /*
        !           269:                 * Literal next character
        !           270:                 */
        !           271:                case '\\':
        !           272:                    if (indquot || insquot)
        !           273:                        goto THROUGH;
        !           274:                    else {
        !           275:                        ignorenext = 1;
        !           276:                        continue;
        !           277:                    }
        !           278:
        !           279:                /*
        !           280:                 * Double quotation
        !           281:                 */
        !           282:                case '\"':
        !           283:                    if (insquot)
        !           284:                        goto THROUGH;
        !           285:                    if (indquot && *(bp-1) == '\\') {
        !           286:                        bp--;
        !           287:                        goto THROUGH;
        !           288:                    }
        !           289:                    indquot = !indquot;
        !           290:                    break;
        !           291:
        !           292:                /*
        !           293:                 * Single quotation
        !           294:                 */
        !           295:                case '\'':
        !           296:                    if (indquot)
        !           297:                        goto THROUGH;
        !           298:                    if (insquot && *(bp-1) == '\\') {
        !           299:                        bp--;
        !           300:                        goto THROUGH;
        !           301:                    }
        !           302:                    insquot = !insquot;
        !           303:                    break;
        !           304:            }
        !           305:
        !           306:            /*
        !           307:             * Only in " or ' case.
        !           308:             */
        !           309:            if (status == SPACE) {
        !           310:                status = STRING;
        !           311:                argc++;
        !           312:                argv[argc-1] = bp;
        !           313:                *bp = 0;
        !           314:            }
        !           315:            continue;
        !           316:        }
        !           317:
        !           318: THROUGH:
        !           319:        /*
        !           320:         * Found non-space character
        !           321:         */
        !           322:        ignorenext = 0;
        !           323:        if (status == SPACE) {
        !           324:            status = STRING;
        !           325:            argc++;
        !           326:            argv[argc-1] = bp;
        !           327:        }
        !           328:        *bp++ = *cp;
        !           329:     }
        !           330:
        !           331:     if (indquot || insquot) {
        !           332:        argv[0] = indquot ? "Unmatched \"." : "Unmatched \'.";
        !           333:        return (-1);
        !           334:     }
        !           335:
        !           336:     *bp = '\0';
        !           337:     argv[argc] = (char *)0;
        !           338:     return (argc);
        !           339: }
        !           340:
        !           341: reverse_strcpy (to, from)
        !           342:     register char *to, *from;
        !           343: {
        !           344:     register int len;
        !           345:
        !           346:     for (len = strlen (from); len >= 0; len--)
        !           347:        *(to + len) = *(from + len);
        !           348: }
        !           349:
        !           350: char *search_string (s, lookup)
        !           351:     char *s, *lookup;
        !           352: {
        !           353:     int len = strlen (lookup);
        !           354:     enum {SQUOTE, DQUOTE, NORMAL} status = NORMAL;
        !           355:
        !           356:     while (*s) {
        !           357:        switch (*s) {
        !           358:        case '\'':
        !           359:            if (status == DQUOTE) break;
        !           360:            status = (status == SQUOTE) ? NORMAL : SQUOTE;
        !           361:            break;
        !           362:
        !           363:        case '\"':
        !           364:            if (status == SQUOTE) break;
        !           365:            status = (status == DQUOTE) ? NORMAL : DQUOTE;
        !           366:            break;
        !           367:
        !           368:        case '\\':
        !           369:            ++s;
        !           370:            break;
        !           371:        }
        !           372:        if (!*s) break;
        !           373:        if (status == NORMAL && strncmp (s, lookup, len) == 0)
        !           374:            return s;
        !           375:        ++s;
        !           376:     }
        !           377:     return ((char*) 0);
        !           378: }
        !           379:
        !           380: #ifdef KANJI
        !           381: /*
        !           382:  * Uuuuuuuum. I hate search kanji in Shift-JIS code from the end of string
        !           383:  * This function check if i'th character is first byte of KANJI code
        !           384:  * in string starting from s.
        !           385:  * It is assumed that first byte of strint s can't be second byte of KANJI
        !           386:  * code.
        !           387:  */
        !           388: iskanji_in_string (s, i)
        !           389:     char *s;
        !           390:     int i;
        !           391: {
        !           392:     register char *cp = s, *target = s + i;
        !           393:
        !           394:     if (i < 0)
        !           395:        return (0);
        !           396:
        !           397:     while (cp < target) {
        !           398:        if (iskanji (*cp))
        !           399:            cp += 2;
        !           400:        else
        !           401:            cp++;
        !           402:     }
        !           403:
        !           404:     if (cp != target)
        !           405:        return (0);
        !           406:     else
        !           407:        return (iskanji (*cp));
        !           408: }
        !           409: #endif /* KANJI */

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