1*a9643ea8Slogwang# 2*a9643ea8Slogwang# Copyright (c) 2001-2003 3*a9643ea8Slogwang# Fraunhofer Institute for Open Communication Systems (FhG Fokus). 4*a9643ea8Slogwang# All rights reserved. 5*a9643ea8Slogwang# 6*a9643ea8Slogwang# Redistribution and use in source and binary forms, with or without 7*a9643ea8Slogwang# modification, are permitted provided that the following conditions 8*a9643ea8Slogwang# are met: 9*a9643ea8Slogwang# 1. Redistributions of source code must retain the above copyright 10*a9643ea8Slogwang# notice, this list of conditions and the following disclaimer. 11*a9643ea8Slogwang# 2. Redistributions in binary form must reproduce the above copyright 12*a9643ea8Slogwang# notice, this list of conditions and the following disclaimer in the 13*a9643ea8Slogwang# documentation and/or other materials provided with the distribution. 14*a9643ea8Slogwang# 15*a9643ea8Slogwang# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16*a9643ea8Slogwang# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17*a9643ea8Slogwang# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18*a9643ea8Slogwang# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19*a9643ea8Slogwang# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20*a9643ea8Slogwang# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21*a9643ea8Slogwang# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22*a9643ea8Slogwang# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23*a9643ea8Slogwang# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24*a9643ea8Slogwang# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25*a9643ea8Slogwang# SUCH DAMAGE. 26*a9643ea8Slogwang# 27*a9643ea8Slogwang# Author: Hartmut Brandt <[email protected]> 28*a9643ea8Slogwang# 29*a9643ea8Slogwang# $Begemot: libunimsg/netnatm/msg/parsemsg.awk,v 1.3 2003/09/19 11:58:15 hbb Exp $ 30*a9643ea8Slogwang# 31*a9643ea8Slogwang# Parse the message definition file 32*a9643ea8Slogwang# 33*a9643ea8Slogwangmatch($0, "Begemot:")!=0 { 34*a9643ea8Slogwang gsub("^[^$]*", "") 35*a9643ea8Slogwang gsub("[^$]*$", "") 36*a9643ea8Slogwang id = $0 37*a9643ea8Slogwang next 38*a9643ea8Slogwang} 39*a9643ea8Slogwang 40*a9643ea8Slogwang/^#/ { 41*a9643ea8Slogwang next 42*a9643ea8Slogwang} 43*a9643ea8SlogwangNF == 0 { 44*a9643ea8Slogwang next 45*a9643ea8Slogwang} 46*a9643ea8SlogwangBEGIN { 47*a9643ea8Slogwang state=0 48*a9643ea8Slogwang id = " * ???" 49*a9643ea8Slogwang mcnt=0 50*a9643ea8Slogwang begin() 51*a9643ea8Slogwang} 52*a9643ea8SlogwangEND { 53*a9643ea8Slogwang end() 54*a9643ea8Slogwang} 55*a9643ea8Slogwang 56*a9643ea8Slogwangstate==0 && $1=="start" { 57*a9643ea8Slogwang if(NF < 3) error("bad number of fields in message start "$0) 58*a9643ea8Slogwang state = 1 59*a9643ea8Slogwang msg = $2 60*a9643ea8Slogwang code = parse_hex($3) 61*a9643ea8Slogwang messages[mcnt] = msg 62*a9643ea8Slogwang msgcond[mcnt] = $4 63*a9643ea8Slogwang msgrep = 0 64*a9643ea8Slogwang msgrepie = 0 65*a9643ea8Slogwang cnt = 0 66*a9643ea8Slogwang if(mcnt == 0) first_entry() 67*a9643ea8Slogwang start_message() 68*a9643ea8Slogwang next 69*a9643ea8Slogwang} 70*a9643ea8Slogwang 71*a9643ea8Slogwangstate==1 && $1=="end" { 72*a9643ea8Slogwang state=0 73*a9643ea8Slogwang mcnt++ 74*a9643ea8Slogwang end_message() 75*a9643ea8Slogwang next 76*a9643ea8Slogwang} 77*a9643ea8Slogwangstate==1 { 78*a9643ea8Slogwang iename[cnt]=$1 79*a9643ea8Slogwang if($2 == "") $2="-" 80*a9643ea8Slogwang if(match($2, "[A-Za-z][A-Za-z0-9_]*/R") == 1) { 81*a9643ea8Slogwang ienum[cnt]=substr($2, 1, length($2)-2) 82*a9643ea8Slogwang ierep[cnt]=1 83*a9643ea8Slogwang msgrepie=1 84*a9643ea8Slogwang } else { 85*a9643ea8Slogwang ierep[cnt]=0 86*a9643ea8Slogwang ienum[cnt]=$2 87*a9643ea8Slogwang } 88*a9643ea8Slogwang if(ienum[cnt] != "-") msgrep = 1 89*a9643ea8Slogwang if($3 == "" || $3 == "-") { 90*a9643ea8Slogwang $3 = "1" 91*a9643ea8Slogwang } else { 92*a9643ea8Slogwang gsub("[a-zA-Z][a-zA-Z0-9]*", "cx->&", $3) 93*a9643ea8Slogwang } 94*a9643ea8Slogwang iecond[cnt] = $3 95*a9643ea8Slogwang cnt++ 96*a9643ea8Slogwang next 97*a9643ea8Slogwang} 98*a9643ea8Slogwang 99*a9643ea8Slogwang{ 100*a9643ea8Slogwang error("bad line: "$0) 101*a9643ea8Slogwang} 102*a9643ea8Slogwang 103*a9643ea8Slogwangfunction parse_hex(str, n) 104*a9643ea8Slogwang{ 105*a9643ea8Slogwang n = 0 106*a9643ea8Slogwang if(substr(str,1,2) != "0x") { 107*a9643ea8Slogwang error("bad hex number" str) 108*a9643ea8Slogwang } 109*a9643ea8Slogwang for(i = 3; i <= length(str); i++) { 110*a9643ea8Slogwang c = substr(str,i,1) 111*a9643ea8Slogwang if(match(c,"[0-9]") != 0) { 112*a9643ea8Slogwang n = 16 * n + c 113*a9643ea8Slogwang } else if(match(c,"[a-f]")) { 114*a9643ea8Slogwang if(c == "a") n = 16 * n + 10 115*a9643ea8Slogwang if(c == "b") n = 16 * n + 11 116*a9643ea8Slogwang if(c == "c") n = 16 * n + 12 117*a9643ea8Slogwang if(c == "d") n = 16 * n + 13 118*a9643ea8Slogwang if(c == "e") n = 16 * n + 14 119*a9643ea8Slogwang if(c == "f") n = 16 * n + 15 120*a9643ea8Slogwang } else if(match(c,"[A-F]")) { 121*a9643ea8Slogwang if(c == "A") n = 16 * n + 10 122*a9643ea8Slogwang if(c == "B") n = 16 * n + 11 123*a9643ea8Slogwang if(c == "C") n = 16 * n + 12 124*a9643ea8Slogwang if(c == "D") n = 16 * n + 13 125*a9643ea8Slogwang if(c == "E") n = 16 * n + 14 126*a9643ea8Slogwang if(c == "F") n = 16 * n + 15 127*a9643ea8Slogwang } else { 128*a9643ea8Slogwang error("bad hex digit '" c "'") 129*a9643ea8Slogwang } 130*a9643ea8Slogwang } 131*a9643ea8Slogwang return n 132*a9643ea8Slogwang} 133*a9643ea8Slogwang 134*a9643ea8Slogwangfunction error(str) 135*a9643ea8Slogwang{ 136*a9643ea8Slogwang print "error:" str >"/dev/stderr" 137*a9643ea8Slogwang exit 1 138*a9643ea8Slogwang} 139