Annotation of coherent/g/usr/lib/misc/replace.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * replace(s1, pat, s3, all, matcher)
                      3:  * find pat in s1 and replace it with s3
                      4:  * return the result in a new malloced string.
                      5:  * or NULL if s1 not in pat. Set all to 1 to
                      6:  * replace all occurances 0 to replace the first.
                      7:  */
                      8: #include "local_misc.h"
                      9: 
                     10: char *
                     11: replace(s1, pat, s3, all, matcher)
                     12: char *s1, *pat, *s3;
                     13: int all;
                     14: char * (*matcher)();
                     15: {
                     16:        int i;
                     17:        char *w1, *w2, *w3, *w;
                     18: 
                     19:        if (NULL == (w2 = (*matcher)(s1, pat, &w3)))
                     20:                return (NULL);
                     21:        w = w1 = alloc(strlen(s1) + 1 + (i=strlen(s3)) + (int)ptrdiff(w2, w3));
                     22:        for (; s1 != w2;)
                     23:                *w1++ = *s1++;
                     24:        strcpy(w1, s3);
                     25:        if (!all || (NULL == (w2 = replace(w3, pat, s3, all, matcher)))) {
                     26:                strcpy(w1 + i, w3);
                     27:                return (w);
                     28:        }
                     29:        strcpy((w3 = alloc(strlen(w2) + 1 + (i = strlen(w)))), w);
                     30:        free(w);
                     31:        strcpy(w3 + i, w2);
                     32:        free(w2);
                     33:        return (w3);
                     34: }
                     35: #ifdef TEST
                     36: extern char *strstr();
                     37: 
                     38: /*
                     39:  * function to find by string
                     40:  */
                     41: char *
                     42: strfind(s1, s2, fin)
                     43: char *s1, *s2, **fin;
                     44: {
                     45:        char *w1;
                     46: 
                     47:        if (NULL == (w1 = strstr(s1, s2)))
                     48:                return (NULL);
                     49:        *fin = w1 + strlen(s2);
                     50:        return (w1);
                     51: }
                     52: 
                     53: main()
                     54: {
                     55:        if (yn("Match by pattern "))
                     56:                for (;;) {
                     57:                        char s1[80], pat[80], s3[80], *s;
                     58:                        int all;
                     59: 
                     60:                        ask(s1, "S1 ");
                     61:                        if (!strcmp(s1, "quit"))
                     62:                                exit(0);
                     63:                        ask(pat, "pat");
                     64:                        ask(s3, "S3 ");
                     65:                        all = yn("all");
                     66:                        if (NULL == (s = replace(s1, pat, s3, all, match)))
                     67:                                printf("Not found\n");
                     68:                        else {
                     69:                                printf("%s\n", s);
                     70:                                free(s);
                     71:                        }
                     72:                }
                     73:        else
                     74:                for (;;) {
                     75:                        char s1[80], s2[80], s3[80], *s;
                     76:                        int all;
                     77: 
                     78:                        ask(s1, "S1");
                     79:                        if (!strcmp(s1, "quit"))
                     80:                                exit(0);
                     81:                        ask(s2, "S2");
                     82:                        ask(s3, "S3");
                     83:                        all = yn("all");
                     84:                        if (NULL == (s = replace(s1, s2, s3, all, strfind)))
                     85:                                printf("Not found\n");
                     86:                        else {
                     87:                                printf("%s\n", s);
                     88:                                free(s);
                     89:                        }
                     90:                }
                     91: }
                     92: #endif

unix.superglobalmegacorp.com

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