The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/ngatm/netnatm/msg/genmsgc.awk

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 #
    2 # Copyright (c) 2001-2003
    3 # Fraunhofer Institute for Open Communication Systems (FhG Fokus).
    4 #       All rights reserved.
    5 #
    6 # Redistribution and use in source and binary forms, with or without
    7 # modification, are permitted provided that the following conditions
    8 # are met:
    9 # 1. Redistributions of source code must retain the above copyright
   10 #    notice, this list of conditions and the following disclaimer.
   11 # 2. Redistributions in binary form must reproduce the above copyright
   12 #    notice, this list of conditions and the following disclaimer in the
   13 #    documentation and/or other materials provided with the distribution.
   14 #
   15 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   16 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   17 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   18 # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   19 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   20 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   21 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   22 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   23 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   24 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   25 # SUCH DAMAGE.
   26 #
   27 # Author: Hartmut Brandt <harti@freebsd.org>
   28 #
   29 # $Begemot: libunimsg/netnatm/msg/genmsgc.awk,v 1.6 2004/07/08 08:22:04 brandt Exp $
   30 #
   31 # Generate message functions.
   32 #
   33 function begin() {
   34 }
   35 
   36 function first_entry() {
   37         print "/* This file was created automatically"
   38         print " * Source file: " id
   39         print " */"
   40         print ""
   41         print "#include <sys/types.h>"
   42         print "#include <sys/param.h>"
   43         print ""
   44         print "#ifdef _KERNEL"
   45         print "#include <sys/libkern.h>"
   46         print "#else"
   47         print "#include <string.h>"
   48         print "#endif"
   49         print "#include <netnatm/unimsg.h>"
   50         print "#include <netnatm/msg/unistruct.h>"
   51         print "#include <netnatm/msg/unimsglib.h>"
   52         print "#include <netnatm/msg/priv.h>"
   53         print "#include <netnatm/msg/privmsg.c>"
   54 }
   55 
   56 function end() {
   57         print ""
   58         print "const struct msgdecl *uni_msgtable[256] = {"
   59         for(i = 0; i < 256; i++) {
   60                 if(decl[i] == "") {
   61                         printf "\t&decl_unknown,"
   62                 } else {
   63                         printf "\t&%s,", decl[i]
   64                 }
   65                 printf "\t/* 0x%02x */\n", i
   66         }
   67         print "};"
   68 }
   69 
   70 function start_message() {
   71 }
   72 
   73 function end_message() {
   74                 gen_print()
   75                 gen_check()
   76                 gen_encode()
   77                 gen_decode()
   78                 gen_reg()
   79 }
   80 
   81 function gen_print() {
   82         print ""
   83         print "static void"
   84         print "print_" msg "(struct uni_" msg " *msg, struct unicx *cx)"
   85         print "{"
   86         if(msgrep) {
   87                 print "\tu_int i;"
   88                 print ""
   89         }
   90         for(i = 0; i < cnt; i++) {
   91                 ie = iename[i]
   92                 uie = toupper(iename[i])
   93                 if(ierep[i]) {
   94                         print "\tif(msg->" ie "_repeat.h.present & UNI_IE_PRESENT)"
   95                         print "\t\tuni_print_ie_internal(UNI_IE_REPEAT, (union uni_ieall *)&msg->" ie "_repeat, cx);"
   96                 }
   97                 if(ienum[i] == "-") {
   98                         print "\tif(msg->" ie ".h.present & UNI_IE_PRESENT)"
   99                         print "\t\tuni_print_ie_internal(UNI_IE_" uie ", (union uni_ieall *)&msg->" ie ", cx);"
  100                 } else {
  101                         print "\tfor(i = 0; i < " ienum[i] "; i++)"
  102                         print "\t\tif(msg->" ie "[i].h.present & UNI_IE_PRESENT)"
  103                         print "\t\t\tuni_print_ie_internal(UNI_IE_" uie ", (union uni_ieall *)&msg->" ie "[i], cx);"
  104                 }
  105         }
  106         print "}"
  107 }
  108 
  109 function gen_check() {
  110         print ""
  111         print "static int"
  112         print "check_" msg "(struct uni_" msg " *m, struct unicx *cx)"
  113         print "{"
  114         print "\tint ret = 0;"
  115         if(msgrep) {
  116                 print "\tu_int i;"
  117         }
  118         print ""
  119         for(i = 0; i < cnt; i++) {
  120                 ie = iename[i]
  121                 if(ierep[i]) {
  122                         if(iecond[i] == "1") {
  123                                 print "\tret |= uni_check_ie(UNI_IE_REPEAT, (union uni_ieall *)&m->" ie "_repeat, cx);"
  124                         } else {
  125                                 print "\tif(!(" iecond[i] "))"
  126                                 print "\t\tret |= IE_ISPRESENT(m->" ie "_repeat);"
  127                                 print "\telse"
  128                                 print "\t\tret |= uni_check_ie(UNI_IE_REPEAT, (union uni_ieall *)&m->" ie "_repeat, cx);"
  129                         }
  130                 }
  131                 if(ienum[i] == "-") {
  132                         if(iecond[i] == "1") {
  133                                 print "\tret |= uni_check_ie(UNI_IE_" toupper(ie) ", (union uni_ieall *)&m->" ie ", cx);"
  134                         } else {
  135                                 print "\tif(!(" iecond[i] "))"
  136                                 print "\t\tret |= IE_ISPRESENT(m->" ie ");"
  137                                 print "\telse"
  138                                 print "\t\tret |= uni_check_ie(UNI_IE_" toupper(ie) ", (union uni_ieall *)&m->" ie ", cx);"
  139                         }
  140                 } else {
  141                         print "\tfor(i = 0; i < " ienum[i]" ; i++) {"
  142                         if(iecond[i] == "1") {
  143                                 print "\t\tret |= uni_check_ie(UNI_IE_" toupper(ie) ", (union uni_ieall *)&m->" ie "[i], cx);"
  144                         } else {
  145                                 print "\t\tif(!(" iecond[i] "))"
  146                                 print "\t\t\tret |= IE_ISPRESENT(m->" ie "[i]);"
  147                                 print "\t\telse"
  148                                 print "\t\t\tret |= uni_check_ie(UNI_IE_" toupper(ie) ", (union uni_ieall *)&m->" ie "[i], cx);"
  149                         }
  150                         print "\t}"
  151                 }
  152         }
  153         print ""
  154         print "\treturn ret;"
  155         print "}"
  156 }
  157 
  158 function gen_encode() {
  159         print ""
  160         print "static int"
  161         print "encode_" msg "(struct uni_msg *msg, struct uni_" msg " *p, struct unicx *cx)"
  162         print "{"
  163         print "\tu_int mlen;"
  164         if(msgrep) {
  165                 print "\tu_int i;"
  166         }
  167         print ""
  168         print "\tif(uni_encode_msg_hdr(msg, &p->hdr, UNI_" toupper(msg) ", cx, &mlen))"
  169         print "\t\treturn (-2);"
  170         print ""
  171         for(i = 0; i < cnt; i++) {
  172                 ie = iename[i]
  173                 if(ierep[i]) {
  174                         print "\tif((p->" ie "_repeat.h.present & UNI_IE_PRESENT) &&"
  175                         print "\t   uni_encode_ie(UNI_IE_" toupper(ie) ", msg, (union uni_ieall *)&p->" ie "_repeat, cx))"
  176                         print "\t\treturn (0x10000000 + UNI_IE_" toupper(ie) ");"
  177                 }
  178                 if(ienum[i] == "-") {
  179                         print "\tif((p->" ie ".h.present & UNI_IE_PRESENT) &&"
  180                         print "\t   uni_encode_ie(UNI_IE_" toupper(ie) ", msg, (union uni_ieall *)&p->" ie ", cx))"
  181                         print "\t\treturn (UNI_IE_" toupper(ie) ");"
  182                 } else {
  183                         print "\tfor(i = 0; i < " ienum[i] "; i++)"
  184                         print "\t\tif((p->" ie "[i].h.present & UNI_IE_PRESENT) &&"
  185                         print "\t\t   uni_encode_ie(UNI_IE_" toupper(ie) ", msg, (union uni_ieall *)&p->" ie "[i], cx))"
  186                         print "\t\treturn ((i << 16) + UNI_IE_" toupper(ie) ");"
  187                 }
  188         }
  189         print ""
  190         print "\tmsg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;"
  191         print "\tmsg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;"
  192         print ""
  193         print "\treturn (0);"
  194         print "}"
  195 }
  196 
  197 function gen_decode() {
  198         print ""
  199         print "static int"
  200         print "decode_" msg "(struct uni_" msg " *out, struct uni_msg *msg,"
  201         print "    enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,"
  202         print "    struct unicx *cx)"
  203         print "{"
  204         if (msgrep) {
  205                 print " u_int i;"
  206                 print ""
  207         }
  208         print " switch (ie) {"
  209 
  210         rep=0
  211         for (i = 0; i < cnt; i++) {
  212                 ie = iename[i]
  213                 print ""
  214                 print "   case UNI_IE_" toupper(ie) ":"
  215                 if (iecond[i] != "1") {
  216                         print "         if (!(" iecond[i] "))"
  217                         print "                 return (DEC_ILL);"
  218                 }
  219                 if (ierep[i]) {
  220                         rep=1
  221                         print "         if (IE_ISPRESENT(cx->repeat))"
  222                         print "                 out->" ie "_repeat = cx->repeat;"
  223                 }
  224                 if (ienum[i] == "-") {
  225                         print "         out->" ie ".h = *hdr;"
  226                         print "         if (hdr->present & UNI_IE_ERROR)"
  227                         print "                 return (DEC_ERR);"
  228                         print "         if(uni_decode_ie_body(UNI_IE_"toupper(ie)", (union uni_ieall *)&out->"ie", msg, ielen, cx))"
  229                         print "                 return (DEC_ERR);"
  230 
  231                 } else {
  232                         print "         for(i = 0; i < " ienum[i] "; i++)"
  233                         print "                 if (!IE_ISPRESENT(out->" ie "[i])) {"
  234                         print "                         out->" ie "[i].h = *hdr;"
  235                         print "                         if (hdr->present & UNI_IE_ERROR)"
  236                         print "                                 return (DEC_ERR);"
  237                         print "                         if(uni_decode_ie_body(UNI_IE_"toupper(ie)", (union uni_ieall *)&out->"ie"[i], msg, ielen, cx))"
  238                         print "                                 return (DEC_ERR);"
  239                         print "                         break;"
  240                         print "                 }"
  241                 }
  242                 print "         break;"
  243         }
  244         if(rep) {
  245                 print ""
  246                 print "   case UNI_IE_REPEAT:"
  247                 print "         cx->repeat.h = *hdr;"
  248                 print "         if (hdr->present & UNI_IE_ERROR)"
  249                 print "                 return (DEC_ERR);"
  250                 print "         if (uni_decode_ie_body(UNI_IE_REPEAT, (union uni_ieall *)&cx->repeat, msg, ielen, cx))"
  251                 print "                 return (DEC_ERR);"
  252                 print "         break;"
  253         }
  254 
  255         print ""
  256         print "   default:"
  257         print "         return (DEC_ILL);"
  258         print " }"
  259         print " return (DEC_OK);"
  260         print "}"
  261 }
  262 
  263 function gen_reg() {
  264         print ""
  265         print "static const struct msgdecl decl_" msg " = {"
  266         print "\t0,"
  267         print "\t\"" msg "\","
  268         print "\t(uni_msg_print_f)print_" msg ","
  269         print "\t(uni_msg_check_f)check_" msg ","
  270         print "\t(uni_msg_encode_f)encode_" msg ","
  271         print "\t(uni_msg_decode_f)decode_" msg
  272         print "};"
  273         decl[code] = "decl_" msg
  274 }

Cache object: 7f211d8ce180f5911aef1a4d459affe3


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.