gensym.awk - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       gensym.awk (2508B)
       ---
            1 #
            2 # Copyright (c) 1994, 1998 University of Utah and the Flux Group.
            3 # All rights reserved.
            4 # 
            5 # This file is part of the Flux OSKit.  The OSKit is free software, also known
            6 # as "open source;" you can redistribute it and/or modify it under the terms
            7 # of the GNU General Public License (GPL), version 2, as published by the Free
            8 # Software Foundation (FSF).  To explore alternate licensing terms, contact
            9 # the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271.
           10 # 
           11 # The OSKit is distributed in the hope that it will be useful, but WITHOUT ANY
           12 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
           13 # FOR A PARTICULAR PURPOSE.  See the GPL for more details.  You should have
           14 # received a copy of the GPL along with the OSKit; see the file COPYING.  If
           15 # not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA.
           16 #
           17 
           18 # This awk program takes a `.sym' file and produces a `.c' file,
           19 # which can then be compiled to assembly language
           20 # and run through a magic sed transformation (see GNUmakerules),
           21 # to produce a `.h' file containing absolute numeric symbol definitions
           22 # suitable for inclusion in assembly language source files and such.
           23 # This way, convenient symbols can be defined based on structure offsets,
           24 # arbitrary C expressions including sizeof() expressions, etc.
           25 #
           26 # Since this mechanism doesn't depend on running a program
           27 # on the machine the code is to run on (the host machine),
           28 # things still work fine during cross-compilation.
           29 #
           30 
           31 BEGIN {
           32         bogus_printed = "no"
           33 
           34         # De-privatize all class members so we can take their offsets.
           35         print "#define class struct";
           36         print "#define private public";
           37 }
           38 
           39 # Start the bogus function just before the first sym directive,
           40 # so that any #includes higher in the file don't get stuffed inside it.
           41 /^[a-z]/ {
           42         if (bogus_printed == "no")
           43         {
           44                 print "void bogus() {";
           45                 bogus_printed = "yes";
           46         }
           47 }
           48 
           49 # Take an arbitrarily complex C symbol or expression
           50 # and turn it into a simple #define'd constant symbol.
           51 /^expr/ {
           52         printf "__asm (\"\\n#define %s mAgIc%%0\" : : \"i\" (%s));\n", $2, $3;
           53 }
           54 
           55 # Output a symbol defining the size of a C structure.
           56 /^size/ {
           57         printf "__asm (\"\\n#define %s mAgIc%%0\" : : \"i\" (sizeof(struct %s)));\n",
           58                 $2, $3;
           59 }
           60 
           61 # Output a symbol defining the byte offset of an element of a C structure.
           62 /^offset/ {
           63         printf "__asm (\"\\n#define %s mAgIc%%0\" : : \"i\" (&((struct %s*)0)->%s));\n",
           64                 $2, $3, $4;
           65 }
           66 
           67 # Copy through all preprocessor directives.
           68 /^#/ {
           69         print
           70 }
           71 
           72 END {
           73         print "}"
           74 }
           75