Annotation of researchv8dc/cmd/cfront/munch.c, revision 1.1.1.1

1.1       root        1: /*
                      2:        scan nm output and detect constructors and destructors for static objects.
                      3:        the name on an nm output line is expected to be in the right hand margin.
                      4:        the name is expected to be on the form __STD*_ or __STI*_ and less than
                      5:        32 characters long.
                      6:        nm output lines are assumed to be less than 256 characters long.
                      7:        constructors found are called by _main() called from main().
                      8:        destructors found is called by exit().
                      9:        return 0 if no constructor or destructor is found otherwise.
                     10:        The output is ?
                     11:        
                     12: */
                     13: 
                     14: #include <stdio.h>
                     15: extern int strcpy(char*, char*);
                     16: 
                     17: struct sbuf {
                     18:        sbuf* next;
                     19:        char str[100];
                     20:        sbuf(sbuf* l, char* p) { next=l; strcpy(str,p); }
                     21: };
                     22: 
                     23: sbuf* dtor;    // list of constructors
                     24: sbuf* ctor;    // list of destructors
                     25: void _main() { };
                     26: main (int argc, char* argv[])
                     27: {
                     28:        char buf[256];
                     29:        register char* p;
                     30:        int monitor = argc-1;   // -p or no argument
                     31: 
                     32: newline:
                     33:        p = buf;
                     34:        for(;;) {
                     35:                register char* st;
                     36:                int c;
                     37:                switch (c=getchar()) {
                     38:                case EOF:
                     39:                        goto done;
                     40:                case '\n':
                     41:                        if (p[-1] != '_') goto newline;
                     42:                        *p = 0;         // terminate string
                     43:                        p = buf;
                     44:                        while (*p++!='_');
                     45:                        for (p--; *p == '_'; p++) ;
                     46:                        p--;
                     47:                        st = p;
                     48:                        if (st[0]!='_') goto newline;
                     49:                        if (st[1]!='S') goto newline;
                     50:                        if (st[2]!='T') goto newline;
                     51:                        switch (st[3]) {
                     52:                        case 'D':
                     53:                                dtor = new sbuf(dtor,st);
                     54:                                goto newline;
                     55:                        case 'I':
                     56:                                ctor = new sbuf(ctor,st);
                     57:                                goto newline;
                     58:                        default:
                     59:                                goto newline;
                     60:                        }
                     61:                default:
                     62:                        *p++ = c;
                     63:                }
                     64:        }
                     65: 
                     66: done:
                     67:        int cond = dtor||ctor;
                     68: 
                     69:        if (cond == 0) return 0;
                     70: 
                     71:        printf("typedef int (*PFV)();\n");      // "int" to dodge bsd4.2 bug
                     72:        if (monitor) printf("int monitor();\n");
                     73:        if (ctor||monitor) {
                     74:                for (sbuf* p = ctor; p; p=p->next) printf("int %s();\n",p->str);
                     75:                printf("extern PFV _ctors[];\nPFV _ctors[] = {\n");
                     76:                if (monitor) printf("\tmonitor,\n");
                     77:                for (sbuf* q = ctor; q; q=q->next) printf("\t%s,\n",q->str);
                     78:                printf("\t0\n};\n");
                     79:        }
                     80: 
                     81:        if (dtor||monitor) {
                     82:                for (sbuf* p = dtor; p; p=p->next) printf("int %s();\n",p->str);
                     83:                printf("extern PFV _dtors[];\nPFV _dtors[] = {\n");
                     84:                for (sbuf* q = dtor; q; q=q->next) printf("\t%s,\n",q->str);
                     85:                if (monitor)
                     86:                        printf("\tmonitor,\n\t0\n};\n");
                     87:                else
                     88:                        printf("\t0\n};\n");
                     89:        }
                     90: 
                     91:        return 1;
                     92: }

unix.superglobalmegacorp.com

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