Annotation of pgp/contrib/langtool/killdups.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *   killdups.c
                      3:  *     Remove duplicate quoted strings in a file
                      4:  *     After each outputted quoted string, adds the PLACEHOLDER
                      5:  */
                      6: 
                      7: #include <stdio.h>
                      8: #include <string.h>
                      9: #include <stdlib.h>
                     10: 
                     11: #if 0
                     12: #define        PLACEHOLDER     "No translation\n"
                     13: #else
                     14: #define        PLACEHOLDER     ""
                     15: #endif
                     16: 
                     17: struct strbuf {
                     18:        char            *s;
                     19:        struct strbuf   *l, *r;
                     20: }              *top;
                     21: 
                     22: 
                     23: main ()
                     24: {
                     25:        char    *str, *getstr();
                     26: 
                     27:        while (str = getstr()) {
                     28:                if (!inlistadd (str)) {
                     29:                        putstr (str);
                     30:                }
                     31:        }
                     32: }
                     33: 
                     34: 
                     35: char *
                     36: getstr ()
                     37: {
                     38:        static char     buf[4096];
                     39:        char            *bp;
                     40:        int             c;
                     41:        int             bslash;
                     42:        char            *sbuf;
                     43: 
                     44:        bp = buf;
                     45:        while ((c = getchar()) != EOF  &&  c != '"')
                     46:                ;
                     47:        if (c == EOF)
                     48:                return NULL;
                     49:        bslash = 0;
                     50:        while ((c = getchar()) != EOF) {
                     51:                if (bslash) {
                     52:                        *bp++ = c;
                     53:                        bslash = 0;
                     54:                } else {
                     55:                        if (c == '"')
                     56:                                break;
                     57:                        if (c == '\\')
                     58:                                bslash = 1;
                     59:                        *bp++ = c;
                     60:                }
                     61:                if (bp - buf >= sizeof(buf)) {
                     62:                        fprintf (stderr, "String too long\n");
                     63:                        exit (2);
                     64:                }
                     65:        }
                     66:        *bp++ = '\0';
                     67:        sbuf = malloc (bp - buf);
                     68:        if (!sbuf) {
                     69:                fprintf (stderr, "Out of memory\n");
                     70:                exit (1);
                     71:        }
                     72:        strcpy (sbuf, buf);
                     73:        return sbuf;
                     74: }
                     75: 
                     76: int
                     77: putstr (s)
                     78: char           *s;
                     79: {
                     80:        printf ("\"%s\"\n%s\n", s, PLACEHOLDER);
                     81: }
                     82: 
                     83: int
                     84: inlistadd (s)
                     85: char           *s;
                     86: {
                     87:        int             delta;
                     88:        struct strbuf   *list;
                     89: 
                     90:        if (top == NULL) {
                     91:                newentry (&top, s);
                     92:                return 0;
                     93:        }
                     94:        list = top;
                     95:        for ( ; ; ) {
                     96:                delta = strcmp (s, list->s);
                     97:                if (delta == 0)
                     98:                        return 1;       /* Already in list */
                     99:                if (delta > 0) {
                    100:                        if (list->r == NULL) {
                    101:                                newentry (&list->r, s);
                    102:                                return 0;
                    103:                        } else
                    104:                                list = list->r;
                    105:                } else {
                    106:                        if (list->l == NULL) {
                    107:                                newentry (&list->l, s);
                    108:                                return 0;
                    109:                        } else
                    110:                                list = list->l;
                    111:                }
                    112:        }
                    113: }
                    114: 
                    115: int
                    116: newentry (alist, s)
                    117: struct strbuf  **alist;
                    118: char           *s;
                    119: {
                    120:        *alist = (struct strbuf *)malloc (sizeof(struct strbuf));
                    121:        if (*alist == NULL) {
                    122:                fprintf (stderr, "Out of memory\n");
                    123:                exit (3);
                    124:        }
                    125:        (*alist)->s = s;
                    126:        (*alist)->l = (*alist)->r = NULL;
                    127: }

unix.superglobalmegacorp.com

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