[BACK]Return to genassym.sh CVS log [TXT][DIR] Up to [local] / sys / kern

Annotation of sys/kern/genassym.sh, Revision 1.1.1.1

1.1       nbrk        1: #      $OpenBSD: genassym.sh,v 1.11 2004/02/01 13:13:37 miod Exp $
                      2: #      $NetBSD: genassym.sh,v 1.9 1998/04/25 19:48:27 matthias Exp $
                      3:
                      4: #
                      5: # Copyright (c) 1997 Matthias Pfaller.
                      6: # All rights reserved.
                      7: #
                      8: # Redistribution and use in source and binary forms, with or without
                      9: # modification, are permitted provided that the following conditions
                     10: # are met:
                     11: # 1. Redistributions of source code must retain the above copyright
                     12: #    notice, this list of conditions and the following disclaimer.
                     13: # 2. Redistributions in binary form must reproduce the above copyright
                     14: #    notice, this list of conditions and the following disclaimer in the
                     15: #    documentation and/or other materials provided with the distribution.
                     16: # 3. All advertising materials mentioning features or use of this software
                     17: #    must display the following acknowledgement:
                     18: #      This product includes software developed by Matthias Pfaller.
                     19: # 4. The name of the author may not be used to endorse or promote products
                     20: #    derived from this software without specific prior written permission
                     21: #
                     22: # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     23: # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     24: # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     25: # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     26: # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     27: # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     28: # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     29: # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     30: # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     31: # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     32: #
                     33:
                     34: # If first argument is -c, create a temporary C file,
                     35: # compile it and execute the result.
                     36:
                     37: awk=${AWK:-awk}
                     38:
                     39: if [ "x$1" = "x-c" ] ; then
                     40:        shift
                     41:        ccode=1
                     42: else
                     43:        ccode=0
                     44: fi
                     45:
                     46: TMPC=`mktemp /tmp/genassym_c.XXXXXXXXXX` || exit 1
                     47: TMP=`mktemp /tmp/genassym.XXXXXXXXXX` || {
                     48:        rm -f ${TMPC}
                     49:        exit 1
                     50: }
                     51: trap "rm -f $TMPC $TMP" 0 1 2 3 15
                     52:
                     53: $awk '
                     54: BEGIN {
                     55:        printf("#ifndef _KERNEL\n#define _KERNEL\n#endif\n");
                     56:        printf("#define offsetof(type, member) ((size_t)(&((type *)0)->member))\n");
                     57:        defining = 0;
                     58:        type = "long";
                     59:        asmtype = "n";
                     60:        asmprint = "";
                     61: }
                     62:
                     63: $0 ~ /^[ \t]*#.*/ || $0 ~ /^[ \t]*$/ {
                     64:        # Just ignore comments and empty lines
                     65:        next;
                     66: }
                     67:
                     68: $0 ~ /^config[ \t]/ {
                     69:        type = $2;
                     70:        asmtype = $3;
                     71:        asmprint = $4;
                     72:        next;
                     73: }
                     74:
                     75: /^include[ \t]/ {
                     76:        if (defining != 0) {
                     77:                defining = 0;
                     78:                printf("}\n");
                     79:        }
                     80:        if (includes[$2] == 0) {
                     81:                printf("#%s\n", $0);
                     82:                includes[$2] = 1;
                     83:        }
                     84:        next;
                     85: }
                     86:
                     87: $0 ~ /^if[ \t]/ ||
                     88: $0 ~ /^ifdef[ \t]/ ||
                     89: $0 ~ /^ifndef[ \t]/ ||
                     90: $0 ~ /^else/ ||
                     91: $0 ~ /^elif[ \t]/ ||
                     92: $0 ~ /^endif/ {
                     93:        printf("#%s\n", $0);
                     94:        next;
                     95: }
                     96:
                     97: /^union[ \t]/ {
                     98:        structname = $2;
                     99:        prefixname = toupper($3);
                    100:        structtype = "union"
                    101:        if (union[structname] == 1)
                    102:                next;
                    103:        else {
                    104:                union[structname] = 1;
                    105:                $0 = "define " toupper(structname) "_SIZEOF sizeof(union " structname ")";
                    106:        }
                    107:        # fall through
                    108: }
                    109:
                    110: /^struct[ \t]/ {
                    111:        structname = $2;
                    112:        prefixname = toupper($3);
                    113:        structtype = "struct"
                    114:        if (struct[structname] == 1)
                    115:                next;
                    116:        else {
                    117:                struct[structname] = 1;
                    118:                $0 = "define " toupper(structname) "_SIZEOF sizeof(struct " structname ")";
                    119:        }
                    120:        # fall through
                    121: }
                    122:
                    123: /^member[ \t]/ {
                    124:        if (NF > 2)
                    125:                $0 = "define " prefixname toupper($2) " offsetof(" structtype " " structname ", " $3 ")";
                    126:        else
                    127:                $0 = "define " prefixname toupper($2) " offsetof(" structtype " " structname ", " $2 ")";
                    128:        # fall through
                    129: }
                    130:
                    131: /^export[ \t]/ {
                    132:        $0 = "define " $2 " " $2;
                    133:        # fall through
                    134: }
                    135:
                    136: /^define[ \t]/ {
                    137:        if (defining == 0) {
                    138:                defining = 1;
                    139:                printf("void f" FNR "(void);\n");
                    140:                printf("void f" FNR "() {\n");
                    141:                if (ccode)
                    142:                        call[FNR] = "f" FNR;
                    143:                defining = 1;
                    144:        }
                    145:        value = $0
                    146:        gsub("^define[ \t]+[A-Za-z_][A-Za-z_0-9]*[ \t]+", "", value)
                    147:        if (ccode)
                    148:                printf("printf(\"#define " $2 " %%ld\\n\", (%s)" value ");\n", type);
                    149:        else
                    150:                printf("__asm(\"XYZZY %s %%%s0\" : : \"%s\" (%s));\n", $2, asmprint, asmtype, value);
                    151:        next;
                    152: }
                    153:
                    154: /^quote[ \t]/ {
                    155:        gsub("^quote[ \t]+", "");
                    156:        print;
                    157:        next;
                    158: }
                    159:
                    160: {
                    161:        printf("syntax error in line %d\n", FNR) >"/dev/stderr";
                    162:        exit(1);
                    163: }
                    164:
                    165: END {
                    166:        if (defining != 0) {
                    167:                defining = 0;
                    168:                printf("}\n");
                    169:        }
                    170:        if (ccode) {
                    171:                printf("int main(int argc, char **argv) {");
                    172:                for (i in call)
                    173:                        printf(call[i] "();");
                    174:                printf("return(0); }\n");
                    175:        }
                    176: }
                    177: ' ccode=$ccode > $TMPC || exit 1
                    178:
                    179: if [ $ccode = 1 ] ; then
                    180:        "$@" -x c $TMPC -o $TMP && $TMP
                    181: else
                    182:        # Kill all of the "#" and "$" modifiers; locore.s already
                    183:        # prepends the correct "constant" modifier.
                    184:        "$@" -x c -S ${TMPC} -o ${TMP} || exit 1
                    185:        sed -e 's/#//g' -e 's/\$//g' ${TMP} | sed -n 's/.*XYZZY/#define/gp'
                    186: fi

CVSweb