Annotation of 42BSD/ingres/source/ovqp/string.c, revision 1.1

1.1     ! root        1: # include      <ingres.h>
        !             2: # include      <aux.h>
        !             3: # include      <symbol.h>
        !             4: # include      <tree.h>
        !             5: # include      "../decomp/globs.h"
        !             6: # include      <sccs.h>
        !             7: 
        !             8: SCCSID(@(#)string.c    7.1     2/5/81)
        !             9: 
        !            10: /*
        !            11: **     This file contains the string
        !            12: **     manipulation routines
        !            13: */
        !            14: 
        !            15: 
        !            16: 
        !            17: 
        !            18: 
        !            19: 
        !            20: /*
        !            21: **     Concat takes the two character strings in
        !            22: **     s1 and s2 and concatenates them together
        !            23: **     into a new location.
        !            24: **
        !            25: **     trailing blanks are removed from the first symbol.
        !            26: **     The size of the concatenation equals the sum of
        !            27: **     the two original strings.
        !            28: */
        !            29: 
        !            30: concatsym(s1, s2)
        !            31: register SYMBOL        *s1, *s2;
        !            32: {
        !            33:        register char   *p;
        !            34:        int             size1, size2, i;
        !            35:        char            *px;
        !            36:        extern char     *need();
        !            37: 
        !            38:        size1 = size(s1);       /* compute size w/o trailing blanks */
        !            39:        if (size1 == 0 && s1->len != 0)
        !            40:                size1++;        /* don't allow string to be trunc to zero length */
        !            41:        size2 = s2->len & 0377; /* size of second string remains the same */
        !            42:        i = (s1->len & 0377) + size2;   /* i equals sum of original sizes */
        !            43:        if (i > 255)
        !            44:                i = 255;        /* a string can't exceed this size */
        !            45:        if (size2 + size1 > 255)
        !            46:                size2 = 255 - size1;    /* adjust size2 to not exceed 255 */
        !            47: 
        !            48:        px = p = need(De.ov_ovqpbuf, i);        /* request the needed space */
        !            49:        bmove(s1->value.sym_data.cptype, p, size1);     /* copy first string */
        !            50:        p = &p[size1];
        !            51:        bmove(s2->value.sym_data.cptype, p, size2);
        !            52:        p = &p[size2];
        !            53:        s1->value.sym_data.cptype = px;
        !            54:        s1->len = i;
        !            55:        /* pad with blanks if necessary */
        !            56:        i -= size1 - size2;
        !            57:        while (i--)
        !            58:                *p++ = ' ';
        !            59: 
        !            60: #      ifdef xOTR1
        !            61:        if (tTf(82, 1))
        !            62:        {
        !            63:                printf("Concat:");
        !            64:                prstack(s1);
        !            65:        }
        !            66: #      endif
        !            67: }
        !            68: /*
        !            69: **     Size determines the size of a character symbol
        !            70: **     without trailing blanks.
        !            71: */
        !            72: 
        !            73: size(s)
        !            74: register SYMBOL        *s;
        !            75: {
        !            76:        register char           *c;
        !            77:        register int            i;
        !            78: 
        !            79:        c = s->value.sym_data.cptype;
        !            80:        i = s->len & 0377;
        !            81: 
        !            82:        for (c += i; i; i--)
        !            83:                if(*--c != ' ')
        !            84:                        break;
        !            85: 
        !            86:        return (i);
        !            87: }
        !            88: /*
        !            89: **     Converts the numeric symbol to
        !            90: **     ascii. Formats to be used are determined
        !            91: **     by Out_arg.
        !            92: */
        !            93: 
        !            94: ascii(s)
        !            95: register SYMBOL        *s;
        !            96: {
        !            97:        register int            i;
        !            98:        register char           *p;
        !            99:        char                    temp[MAXFIELD];
        !           100:        extern struct out_arg   Out_arg;        /* used for float conversions */
        !           101:        char                    *locv();
        !           102: 
        !           103:        p = temp;
        !           104:        switch(s->type)
        !           105:        {
        !           106: 
        !           107:          case INT:
        !           108:                if (s->len == 4)
        !           109:                {
        !           110:                        i = Out_arg.i4width;
        !           111:                        p = locv(s->value.sym_data.i4type);
        !           112:                }
        !           113:                else
        !           114:                {
        !           115:                        itoa(s->value.sym_data.i2type, p);
        !           116:                        if (s->len == 2)
        !           117:                                i = Out_arg.i2width;
        !           118:                        else
        !           119:                                i = Out_arg.i1width;
        !           120:                }
        !           121:                break;
        !           122: 
        !           123:          case CHAR:
        !           124:                return;
        !           125: 
        !           126:          case FLOAT:
        !           127:                if (s->len == 4)
        !           128:                {
        !           129:                        i = Out_arg.f4width;
        !           130:                        ftoa(s->value.sym_data.f8type, p, i, Out_arg.f4prec, Out_arg.f4style);
        !           131:                }
        !           132:                else
        !           133:                {
        !           134:                        i = Out_arg.f8width;
        !           135:                        ftoa(s->value.sym_data.f8type, p, i, Out_arg.f8prec, Out_arg.f8style);
        !           136:                }
        !           137:        }
        !           138:        s->value.sym_data.cptype = need(De.ov_ovqpbuf, i);
        !           139:        pmove(p, s->value.sym_data.cptype, i, ' ');     /* blank pad to fixed length i */
        !           140:        s->type = CHAR;
        !           141:        s->len = i;
        !           142: }
        !           143: /*
        !           144: **     LEXCOMP performs character comparisons between the two
        !           145: **     strings ss1 and ss2. All blanks and null are ignored in
        !           146: **     both strings. In addition pattern matching is performed
        !           147: **     using the "shell syntax". Pattern matching characters
        !           148: **     are converted to the pattern matching symbols PAT_ANY etc.
        !           149: **     by the scanner.
        !           150: **
        !           151: **     Pattern matching characters can appear in either or
        !           152: **     both strings. Since they cannot be stored in relations,
        !           153: **     pattern matching chars in both strings can only happen
        !           154: **     if the user types in such an expression.
        !           155: **
        !           156: **     examples:
        !           157: **
        !           158: **     "Smith, Homer" = "Smith,Homer"
        !           159: **
        !           160: **     "abcd" < "abcdd"
        !           161: **
        !           162: **     "abcd" = "aPAT_ANYd"
        !           163: **
        !           164: **     returns <0 if s1 < s2
        !           165: **              0 if s1 = s2
        !           166: **             >0 if s1 > s2
        !           167: */
        !           168: 
        !           169: lexcomp(s1, l1, s2, l2)
        !           170: register char  *s1, *s2;
        !           171: register int   l1, l2;
        !           172: {
        !           173:        char            c1, c2;
        !           174: 
        !           175: loop:
        !           176:        while (l1--)
        !           177:        {
        !           178:                switch (c1 = *s1++)
        !           179:                {
        !           180: 
        !           181:                  case ' ':
        !           182:                  case '\0':
        !           183:                        break;
        !           184: 
        !           185:                  case PAT_ANY:
        !           186:                        return (pmatch(s1, l1, s2, l2));
        !           187: 
        !           188:                  case PAT_LBRAC:
        !           189:                        return (lmatch(s1, l1, s2, l2));
        !           190: 
        !           191:                  default:
        !           192:                        while (l2--)
        !           193:                        {
        !           194:                                switch (c2 = *s2++)
        !           195:                                {
        !           196: 
        !           197:                                  case ' ':
        !           198:                                  case '\0':
        !           199:                                        continue;
        !           200: 
        !           201:                                  case PAT_ANY:
        !           202:                                        return (pmatch(s2, l2, --s1, ++l1));
        !           203: 
        !           204:                                  case PAT_LBRAC:
        !           205:                                        return (lmatch(s2, l2, --s1, ++l1));
        !           206: 
        !           207:                                  default:
        !           208:                                        if (c1 == c2)
        !           209:                                                goto loop;
        !           210:                                        if (c1 == PAT_ONE || c2 == PAT_ONE)
        !           211:                                                goto loop;
        !           212:                                        return (c1 - c2);
        !           213:                                }
        !           214:                        }
        !           215:                        return (1);     /* s1 > s2 */
        !           216:                }
        !           217:        }
        !           218: 
        !           219:        /* examine remainder of s2 for any characters */
        !           220:        while (l2--)
        !           221:                if ((c1 = *s2++) != ' ' && (c1 != '\0') && (c1 != PAT_ANY))
        !           222:                        return (-1);    /* s1 < s2 */
        !           223:        return (0);
        !           224: }
        !           225: 
        !           226: 
        !           227: pmatch(pat, plen, str, slength)
        !           228: char   *pat;           /* the string holding the pattern matching char */
        !           229: char   *str;           /* the string to be checked */
        !           230: int    plen, slength;  /* the lengths */
        !           231: {
        !           232:        register char   d, *s;
        !           233:        register int    slen;
        !           234:        char            c;
        !           235: 
        !           236:        s = str;
        !           237:        slen = slength;
        !           238: 
        !           239:        if (plen == 0)
        !           240:                return  (0);    /* a match if no more chars in p */
        !           241: 
        !           242:        /*
        !           243:        ** If the next character in "pat" is not another
        !           244:        ** pattern matching character, then scan until
        !           245:        ** first matching char and continue comparison.
        !           246:        */
        !           247:        if ((c = *pat) != PAT_ANY && c != PAT_LBRAC && c != PAT_ONE)
        !           248:        {
        !           249:                while (slen--)
        !           250:                {
        !           251:                        if ((d = *s) == c || d == PAT_ANY || d == PAT_LBRAC && d != PAT_ONE)
        !           252:                        {
        !           253:                                if (lexcomp(pat, plen, s, slen + 1) == 0)
        !           254:                                        return (0);
        !           255:                        }
        !           256:                        s++;
        !           257:                }
        !           258:        }
        !           259:        else
        !           260:        {
        !           261:                while (slen)
        !           262:                        if (lexcomp(pat, plen, s++, slen--) == 0)
        !           263:                                return (0);     /* match */
        !           264:        }
        !           265:        return (-1);    /* no match */
        !           266: }
        !           267: 
        !           268: lmatch(pat, plen, str, slen)
        !           269: char   *pat;   /* the string holding the pattern matching char */
        !           270: char   *str;   /* the other string */
        !           271: int    plen, slen;     /* their respective sizes */
        !           272: {
        !           273:        register char   *p, *s;
        !           274:        register int    cc;
        !           275:        int             oldc, c, found;
        !           276: 
        !           277:        p = pat;
        !           278:        s = str;
        !           279: 
        !           280:        /* find a non-blank, non-null char in s */
        !           281:        while (slen--)
        !           282:        {
        !           283:                if ((c = *s++) != ' ' && c != '\0')
        !           284:                {
        !           285:                        /* search for a match on 'c' */
        !           286:                        found = 0;      /* assume failure */
        !           287:                        oldc = 0777;    /* make previous char large */
        !           288: 
        !           289:                        while (plen--)
        !           290:                        {
        !           291: 
        !           292:                                switch(cc = *p++)
        !           293:                                {
        !           294: 
        !           295:                                  case PAT_RBRAC:
        !           296:                                        if (found)
        !           297:                                                return (lexcomp(p, plen, s, slen));
        !           298:                                        return (-1);
        !           299: 
        !           300:                                  case '-':
        !           301:                                        if (plen-- == 0)
        !           302:                                                return (-1);    /* not found */
        !           303:                                        if (oldc <= c && c <= (cc = *p++))
        !           304:                                                found++;
        !           305:                                        break;
        !           306: 
        !           307:                                  default:
        !           308:                                        if (c == (oldc = cc))
        !           309:                                                found++;
        !           310:                                }
        !           311:                        }
        !           312:                        return (-1);    /* no match */
        !           313:                }
        !           314:        }
        !           315:        return (1);
        !           316: }

unix.superglobalmegacorp.com

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