12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#!/bin/sh
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# Copyright (c) 1990, 1996
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#	John Robert LoVerso. All rights reserved.
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# SMIv2 parsing copyright (c) 1999
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#	William C. Fenner.
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# Redistribution and use in source and binary forms, with or without
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# modification, are permitted provided that the following conditions
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# are met:
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# 1. Redistributions of source code must retain the above copyright
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#    notices, this list of conditions and the following disclaimer.
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# 2. Redistributions in binary form must reproduce the above copyright
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#    notices, this list of conditions and the following disclaimer in the
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#    documentation and/or other materials provided with the distribution.
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
3053f17a9db278d33517d9888dd77848f554522a38JP Abgrall# @(#) $Id: makemib,v 1.3 2001-09-17 22:16:52 fenner Exp $ (jlv)
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# This script will read either ASN.1-style MIB files or the ".defs" files
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# created by the ISODE "mosy" program on such files.
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# The output of this script is the "mib.h" file used by tcpdumps' ASN.1/SNMP
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# decoding code.
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# This script needs to be run by "gawk" (GNU awk).  "nawk" will work, but
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# dump will get a recursion error if you process LARGE mibs.  While it would
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# by farily easy to rewrite this not to use recursion (and also easy to
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# eliminate use of gsub and functions to use classic "awk"), you have to 
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# order the structure declarations in defined-first order for the compiler
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# not to barf; too bad tsort doesn't take arguments.
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcat << EOF
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * This file was generated by tcpdump/makemib on `date`
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * You probably don't want to edit this by hand!
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * struct mib somename = { desc, oid-octet, type, child-pointer, next-pointer 
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source ProjectEOF
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectawk '
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source ProjectBEGIN {
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	debug=0;
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	# for sanity, we prep the namespace with objects from RFC-1155
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	# (we manually establish the root)
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	oid["iso"]=1
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	oidadd("org", "iso", 3)
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	oidadd("dod", "org", 6)
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	oidadd("internet", "dod", 1)
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	oidadd("directory", "internet", 1)
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	oidadd("mgmt", "internet", 2)
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#XXX	oidadd("mib", "mgmt", 1)
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	oidadd("mib-2", "mgmt", 1)
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	oidadd("experimental", "internet", 3)
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	oidadd("private", "internet", 4)
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	oidadd("enterprises", "private", 1)
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	oidadd("ip", "mib-2", 4)
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	oidadd("transmission", "mib-2", 10)
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	holddesc="none"
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# Read mosy "*.defs" file.  mosy does all the parsing work; we just read
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# its simple and straightforward output.  It would not be too hard to make
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# tcpdump directly read mosy output, but...
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# Ignore these unless the current file is called something.defs; false
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# positives are too common in DESCRIPTIONs.
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source ProjectNF > 1 && index($2,".")>0 && FILENAME ~ /\.defs/ {
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	# currently ignore items of the form "{ iso.3.6.1 }"
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (split($2, p, ".") == 2) {
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		oidadd($1, p[1], p[2])
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	next
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# Must be a MIB file
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# Make it easier to parse - used to be done by sed
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ sub(/--\*.*\*--/, ""); sub(/--.*/, ""); gsub(/[{}]/, " & "); }
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# this next section is simple and naive, but does the job ok
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# foo OBJECT IDENTIFIER ::= { baz 17 }
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# or
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# foo OBJECT IDENTIFIER ::=
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# { baz 17 }
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project$2$3$4 == "OBJECTIDENTIFIER::=" {
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	holddesc="none"
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (NF == 8)
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		oidadd($1, $6, $7)
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (NF == 4)
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		holddesc=$1
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	next
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project$1 == "{" && holddesc != "none" && NF == 4 {
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	oidadd(holddesc, $2, $3)
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	holddesc="none"
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# foo OBJECT IDENTIFIER
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#  ::= { bar 1 }
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project$2$3 == "OBJECTIDENTIFIER" && $1 != "SYNTAX" && NF == 3 {
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	holddesc=$1
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# foo
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# OBJECT IDENTIFIER ::= { bar 1 }
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# a couple of heuristics to exclude single words in e.g. long
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#  DESCRIPTION clauses
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source ProjectNF == 1 && $1 ~ "[a-z][a-z]*[A-Z]" && $1 !~ /[(){}.,]/ && holddesc == "none" {
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	holddesc=$1
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project$1$2$3 == "OBJECTIDENTIFIER::=" && holddesc != "none" {
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	oidadd(holddesc, $5, $6)
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	holddesc="none"
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# "normal" style
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# foo OBJECT-TYPE ...
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# ...
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#   ::= { baz 5 }
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project$2 == "MODULE-IDENTITY" || $2 == "MODULE-COMPLIANCE" ||
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	$2 == "OBJECT-IDENTITY" || $2 == "OBJECT-TYPE" ||
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	$2 == "OBJECT-GROUP" ||
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	$2 == "NOTIFICATION-TYPE" || $2 == "NOTIFICATION-GROUP" {
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	holddesc=$1
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project$1 == "::=" && holddesc != "none" && NF == 5 {
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	oidadd(holddesc, $3, $4)
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	holddesc="none"
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# foo ::= { baz 17 }
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project$2$3 == "::={" {
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	oidadd($1,$4,$5)
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	holddesc="none"
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# 
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# End of the road - output the data.
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source ProjectEND {
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	print "struct obj"
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dump("iso")
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	print "*mibroot = &_iso_obj;"
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectfunction inn(file) {
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (file == "" || file == "-")
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return ""
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return " in " file
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# add a new object to the tree
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#		new OBJECT IDENTIFIER ::= { parent value }
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectfunction oidadd(new, parent, value) {
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	# Ignore 0.0
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (parent == "0" && value == 0)
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (debug)
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		print "/* oidadd" inn(FILENAME) ":", new, "in", parent, "as", value, "line", $0, "*/"
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	# use safe C identifiers
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	gsub(/[-&\/]/,"",new)
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	gsub(/[-&\/]/,"",parent)
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	# check if parent missing
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (oid[parent] == "") {
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf "/* parse problem%s: no parent for %s.%s(%d) */\n", \
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			inn(FILENAME), parent, new, value
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	# check if parent.value already exists
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (oid[new] > 0 && oid[new] != value) {
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf "/* parse problem%s: dup %s.%s(%d) != old (%d) */\n", \
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			inn(FILENAME), parent, new, value, oid[new]
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	# check for new name for parent.value
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (child[parent] != "") {
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (sib = child[parent]; sib != ""; sib = sibling[sib])
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (oid[sib] == value) {
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (new != sib)
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf "/* parse problem%s: new name" \
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						" \"%s\"" \
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						" for %s.%s(%d) ignored */\n", \
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						inn(FILENAME), new, parent, \
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						sib, value
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	oid[new]=value
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (child[parent] == "") {
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		child[parent] = new
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sibling[new] = child[parent]
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		child[parent] = new
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project# old(?) routine to recurse down the tree (in postfix order for convenience)
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectfunction dump(item, c, s) {
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#	newitem=sofar"."item"("oid[item]")"
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#	printf "/* %s c=%s s=%s */\n", newitem, child[item], sibling[item]
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	c="NULL"
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (child[item] != "") {
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dump(child[item])
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		c = "&_"child[item]"_obj"
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	s="NULL"
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sibling[item] != "") {
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dump(sibling[item])
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		s = "&_"sibling[item]"_obj"
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf "_%s_obj = {\n\t\"%s\", %d, 0,\n\t%s, %s\n},\n", \
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		item, item, oid[item], c, s
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project' $@
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectexit 0
250