[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     ! 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