Annotation of researchv10no/cmd/cfront/munch2.1.c, revision 1.1.1.1

1.1       root        1: /*ident        "@(#)ctrans:lib/static/munch.c  1.4.1.2" */
                      2: /**************************************************************************
                      3:                        Copyright (c) 1984 AT&T
                      4:                          All Rights Reserved   
                      5: 
                      6:        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T
                      7:        
                      8:        The copyright notice above does not evidence any        
                      9:        actual or intended publication of such source code.
                     10: 
                     11: *****************************************************************************/
                     12: /*
                     13:        scan nm output and detect constructors and destructors for static objects.
                     14:        the name on an nm output line is expected to be in the right hand margin.
                     15:        the name is expected to be on the form __std__ or __sti__ and less than
                     16:        100 characters long.
                     17:        nm output lines are assumed to be less than 256 characters long.
                     18:        constructors found are called by _main() called from main().
                     19:        destructors found are called by exit().
                     20:        return 1 if no constructor or destructor is found;
                     21:        otherwise, returns 0
                     22:        The output is redirected by CC into _ctdt.c
                     23:        
                     24: */
                     25: 
                     26: #include <stdio.h>
                     27: #include <ctype.h>
                     28: #include <stdlib.h>
                     29: //extern int strcpy(char*, char*);
                     30: //extern char * strtok(char*, char*);
                     31: 
                     32: struct sbuf {
                     33:        sbuf* next;
                     34:        char str[100];
                     35:        sbuf(sbuf* l, char* p);
                     36: };
                     37: 
                     38: sbuf::sbuf(sbuf* l, char* p)
                     39: {
                     40:        next=l;
                     41:        // strcpy(str,strtok(p," |"));
                     42:        // ``unrolled'' since strtok() is not on bsd systems
                     43:        register char* s = str;
                     44:        for (register char c = *p++; c && c!=' ' && c!='|'; c = *p++) *s++ = c;
                     45:        *s = 0; 
                     46: }
                     47: 
                     48: sbuf* dtor;    // list of constructors
                     49: sbuf* ctor;    // list of destructors
                     50: 
                     51: main (int, char* argv[])
                     52: {
                     53:        char buf[256];
                     54:        register char* p;
                     55: 
                     56: newline:
                     57:        p = buf;
                     58:        for(;;) {
                     59:                int c;
                     60:                switch (c=getchar()) {
                     61:                case EOF:
                     62:                        goto done;
                     63:                case '\n':
                     64:                {       *p = 0;         // terminate string
                     65:                        p = buf;
                     66:                        while (*p!='_') if (*p++ == 0) goto newline;
                     67:                        if (p!=buf && !isspace( *(p-1))) goto newline; // '_' not first character
                     68:                         // accept __st and ___st
                     69:                         if (*++p != '_') goto newline; // need '__'
                     70:                        if (*++p != '_')
                     71:                           { p--; 
                     72:                             p--;
                     73:                           }
                     74:                         else
                     75:                             p--;
                     76: 
                     77:                        register char* st = p;
                     78:                        if (st[0]!='_' || st[1]!='_' || 
                     79:                            st[2]!='s' || st[3]!='t' ||
                     80:                            st[5]!='_' || st[6]!='_' ) 
                     81:                                goto newline;
                     82:                        switch (st[4]) {
                     83:                        case 'd':
                     84:                                dtor = new sbuf(dtor,st);
                     85:                                goto newline;
                     86:                        case 'i':
                     87:                                ctor = new sbuf(ctor,st);
                     88:                        default:
                     89:                                goto newline;
                     90:                        }
                     91:                }
                     92:                default:
                     93:                        *p++ = c;
                     94:                }
                     95:        }
                     96: 
                     97: done:
                     98:        int cond = dtor||ctor;
                     99:        if (cond == 0) exit(1);
                    100: 
                    101:        printf("typedef int (*PFV)();\n");      // "int" to dodge bsd4.2 bug
                    102:        if (ctor) {
                    103:                for (sbuf* p = ctor; p; p=p->next) printf("int %s();\n",p->str);
                    104:                printf("extern PFV _ctors[];\nPFV _ctors[] = {\n");
                    105:                for (sbuf* q = ctor; q; q=q->next) printf("\t%s,\n",q->str);
                    106:                printf("\t0\n};\n");
                    107:        }
                    108: 
                    109:        if (dtor) {
                    110:                for (sbuf* p = dtor; p; p=p->next) printf("int %s();\n",p->str);
                    111:                printf("extern PFV _dtors[];\nPFV _dtors[] = {\n");
                    112:                for (sbuf* q = dtor; q; q=q->next) printf("\t%s,\n",q->str);
                    113:                printf("\t0\n};\n");
                    114:        }
                    115: 
                    116:        exit(0);
                    117: }
                    118: 

unix.superglobalmegacorp.com

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