annotate packages/net/snmp/lib/current/src/parse.c @ 3292:7f8e529b4d82 default tip

Fix FREESCALE_EDMA_NBYTES_MLOFFYES_MLOFF() so it works with negative offsets.
author vae
date Wed, 29 Apr 2015 23:31:48 +0000
parents 74dbf4c3f2e1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
103
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3 // ./lib/current/src/parse.c
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
4 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
5 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
6 //==========================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
7 // ####ECOSGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
8 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
9 // This file is part of eCos, the Embedded Configurable Operating System.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
10 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 103
diff changeset
11 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
12 // eCos is free software; you can redistribute it and/or modify it under
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
13 // the terms of the GNU General Public License as published by the Free
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
14 // Software Foundation; either version 2 or (at your option) any later
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
15 // version.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 103
diff changeset
16 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
17 // eCos is distributed in the hope that it will be useful, but WITHOUT
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
18 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
20 // for more details.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 103
diff changeset
21 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
22 // You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
23 // along with eCos; if not, write to the Free Software Foundation, Inc.,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
24 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 103
diff changeset
25 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
26 // As a special exception, if other files instantiate templates or use
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
27 // macros or inline functions from this file, or you compile this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
28 // and link it with other works to produce a work based on this file,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
29 // this file does not by itself cause the resulting work to be covered by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
30 // the GNU General Public License. However the source code for this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
31 // must still be made available in accordance with section (3) of the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
32 // General Public License v2.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 103
diff changeset
33 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
34 // This exception does not invalidate any other reasons why a work based
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
35 // on this file might be covered by the GNU General Public License.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
36 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
37 // ####ECOSGPLCOPYRIGHTEND####
103
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
38 //####UCDSNMPCOPYRIGHTBEGIN####
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
39 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
40 // -------------------------------------------
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
41 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
42 // Portions of this software may have been derived from the UCD-SNMP
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
43 // project, <http://ucd-snmp.ucdavis.edu/> from the University of
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
44 // California at Davis, which was originally based on the Carnegie Mellon
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
45 // University SNMP implementation. Portions of this software are therefore
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
46 // covered by the appropriate copyright disclaimers included herein.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
47 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
48 // The release used was version 4.1.2 of May 2000. "ucd-snmp-4.1.2"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
49 // -------------------------------------------
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
50 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
51 //####UCDSNMPCOPYRIGHTEND####
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
52 //==========================================================================
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
53 //#####DESCRIPTIONBEGIN####
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
54 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
55 // Author(s): hmt
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
56 // Contributors: hmt
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
57 // Date: 2000-05-30
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
58 // Purpose: Port of UCD-SNMP distribution to eCos.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
59 // Description:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
60 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
61 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
62 //####DESCRIPTIONEND####
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
63 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
64 //==========================================================================
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
65 /********************************************************************
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
66 Copyright 1989, 1991, 1992 by Carnegie Mellon University
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
67
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
68 Derivative Work -
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
69 Copyright 1996, 1998, 1999, 2000 The Regents of the University of California
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
70
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
71 All Rights Reserved
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
72
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
73 Permission to use, copy, modify and distribute this software and its
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
74 documentation for any purpose and without fee is hereby granted,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
75 provided that the above copyright notice appears in all copies and
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
76 that both that copyright notice and this permission notice appear in
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
77 supporting documentation, and that the name of CMU and The Regents of
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
78 the University of California not be used in advertising or publicity
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
79 pertaining to distribution of the software without specific written
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
80 permission.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
81
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
82 CMU AND THE REGENTS OF THE UNIVERSITY OF CALIFORNIA DISCLAIM ALL
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
83 WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
84 WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL CMU OR
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
85 THE REGENTS OF THE UNIVERSITY OF CALIFORNIA BE LIABLE FOR ANY SPECIAL,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
86 INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
87 FROM THE LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
88 CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
89 CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
90 *********************************************************************/
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
91 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
92 * parse.c
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
93 *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
94 * Update: 1998-09-22 <mslifcak@iss.net>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
95 * Clear nbuckets in init_node_hash.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
96 * New method xcalloc returns zeroed data structures.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
97 * New method alloc_node encapsulates common node creation.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
98 * New method to configure terminate comment at end of line.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
99 * New method to configure accept underscore in labels.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
100 *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
101 * Update: 1998-10-10 <daves@csc.liv.ac.uk>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
102 * fully qualified OID parsing patch
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
103 *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
104 * Update: 1998-10-20 <daves@csc.liv.ac.uk>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
105 * merge_anon_children patch
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
106 *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
107 * Update: 1998-10-21 <mslifcak@iss.net>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
108 * Merge_parse_objectid associates information with last node in chain.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
109 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
110 /******************************************************************
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
111 Copyright 1989, 1991, 1992 by Carnegie Mellon University
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
112
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
113 All Rights Reserved
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
114
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
115 Permission to use, copy, modify, and distribute this software and its
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
116 documentation for any purpose and without fee is hereby granted,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
117 provided that the above copyright notice appear in all copies and that
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
118 both that copyright notice and this permission notice appear in
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
119 supporting documentation, and that the name of CMU not be
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
120 used in advertising or publicity pertaining to distribution of the
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
121 software without specific, written prior permission.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
122
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
123 CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
124 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
125 CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
126 ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
127 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
128 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
129 SOFTWARE.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
130 ******************************************************************/
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
131 #include <config.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
132 #include <snmp_logging.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
133 #include <stdio.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
134 #if HAVE_STDLIB_H
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
135 #include <stdlib.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
136 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
137 #if HAVE_STRING_H
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
138 #include <string.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
139 #else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
140 #include <strings.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
141 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
142 #include <ctype.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
143 #include <sys/types.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
144 #ifndef __ECOS
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
145 #include <sys/stat.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
146 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
147
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
148 /* Wow. This is ugly. -- Wes */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
149 #if HAVE_DIRENT_H
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
150 # include <dirent.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
151 # define NAMLEN(dirent) strlen((dirent)->d_name)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
152 #else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
153 # define dirent direct
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
154 # define NAMLEN(dirent) (dirent)->d_namlen
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
155 # if HAVE_SYS_NDIR_H
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
156 # include <sys/ndir.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
157 # endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
158 # if HAVE_SYS_DIR_H
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
159 # include <sys/dir.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
160 # endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
161 # if HAVE_NDIR_H
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
162 # include <ndir.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
163 # endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
164 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
165 #if HAVE_WINSOCK_H
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
166 #include <winsock.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
167 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
168 #if HAVE_NETINET_IN_H
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
169 #include <netinet/in.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
170 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
171 #if defined(HAVE_REGEX_H) && defined(HAVE_REGCOMP)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
172 #include <regex.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
173 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
174 #if HAVE_DMALLOC_H
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
175 #include <dmalloc.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
176 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
177
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
178 #include "system.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
179 #include "parse.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
180 #include "asn1.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
181 #include "mib.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
182 #include "snmp_api.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
183 #include "snmp_debug.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
184 #include "snmp_logging.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
185 #include "default_store.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
186 #include "tools.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
187
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
188 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
189 * This is one element of an object identifier with either an integer
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
190 * subidentifier, or a textual string label, or both.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
191 * The subid is -1 if not present, and label is NULL if not present.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
192 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
193 struct subid_s {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
194 int subid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
195 int modid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
196 char *label;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
197 };
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
198
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
199 #define MAXTC 1024
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
200 struct tc { /* textual conventions */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
201 int type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
202 int modid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
203 char *descriptor;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
204 char *hint;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
205 struct enum_list *enums;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
206 struct range_list *ranges;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
207 } tclist[MAXTC];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
208
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
209 int Line = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
210 const char *File = "(none)";
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
211 static int anonymous = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
212
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
213 #define SYNTAX_MASK 0x80
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
214 /* types of tokens
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
215 Tokens wiht the SYNTAX_MASK bit set are syntax tokens */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
216 #define CONTINUE -1
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
217 #define ENDOFFILE 0
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
218 #define LABEL 1
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
219 #define SUBTREE 2
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
220 #define SYNTAX 3
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
221 #define OBJID (4 | SYNTAX_MASK)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
222 #define OCTETSTR (5 | SYNTAX_MASK)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
223 #define INTEGER (6 | SYNTAX_MASK)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
224 #define INTEGER32 INTEGER
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
225 #define NETADDR (7 | SYNTAX_MASK)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
226 #define IPADDR (8 | SYNTAX_MASK)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
227 #define COUNTER (9 | SYNTAX_MASK)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
228 #define GAUGE (10 | SYNTAX_MASK)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
229 #define TIMETICKS (11 | SYNTAX_MASK)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
230 #define KW_OPAQUE (12 | SYNTAX_MASK)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
231 #define NUL (13 | SYNTAX_MASK)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
232 #define SEQUENCE 14
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
233 #define OF 15 /* SEQUENCE OF */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
234 #define OBJTYPE 16
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
235 #define ACCESS 17
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
236 #define READONLY 18
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
237 #define READWRITE 19
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
238 #define WRITEONLY 20
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
239 #define NOACCESS 21
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
240 #define STATUS 22
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
241 #define MANDATORY 23
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
242 #define KW_OPTIONAL 24
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
243 #define OBSOLETE 25
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
244 /* #define RECOMMENDED 26 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
245 #define PUNCT 27
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
246 #define EQUALS 28
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
247 #define NUMBER 29
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
248 #define LEFTBRACKET 30
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
249 #define RIGHTBRACKET 31
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
250 #define LEFTPAREN 32
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
251 #define RIGHTPAREN 33
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
252 #define COMMA 34
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
253 #define DESCRIPTION 35
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
254 #define QUOTESTRING 36
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
255 #define INDEX 37
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
256 #define DEFVAL 38
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
257 #define DEPRECATED 39
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
258 #define SIZE 40
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
259 #define BITSTRING (41 | SYNTAX_MASK)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
260 #define NSAPADDRESS (42 | SYNTAX_MASK)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
261 #define COUNTER64 (43 | SYNTAX_MASK)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
262 #define OBJGROUP 44
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
263 #define NOTIFTYPE 45
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
264 #define AUGMENTS 46
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
265 #define COMPLIANCE 47
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
266 #define READCREATE 48
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
267 #define UNITS 49
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
268 #define REFERENCE 50
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
269 #define NUM_ENTRIES 51
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
270 #define MODULEIDENTITY 52
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
271 #define LASTUPDATED 53
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
272 #define ORGANIZATION 54
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
273 #define CONTACTINFO 55
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
274 #define UINTEGER32 (56 | SYNTAX_MASK)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
275 #define CURRENT 57
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
276 #define DEFINITIONS 58
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
277 #define END 59
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
278 #define SEMI 60
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
279 #define TRAPTYPE 61
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
280 #define ENTERPRISE 62
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
281 /* #define DISPLAYSTR (63 | SYNTAX_MASK) */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
282 #define BEGIN 64
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
283 #define IMPORTS 65
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
284 #define EXPORTS 66
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
285 #define ACCNOTIFY 67
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
286 #define BAR 68
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
287 #define RANGE 69
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
288 #define CONVENTION 70
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
289 #define DISPLAYHINT 71
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
290 #define FROM 72
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
291 #define CAPABILITIES 73
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
292 #define MACRO 74
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
293 #define IMPLIED 75
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
294
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
295 struct tok {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
296 const char *name; /* token name */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
297 int len; /* length not counting nul */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
298 int token; /* value */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
299 int hash; /* hash of name */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
300 struct tok *next; /* pointer to next in hash table */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
301 };
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
302
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
303
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
304 static struct tok tokens[] = {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
305 { "obsolete", sizeof ("obsolete")-1, OBSOLETE },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
306 { "Opaque", sizeof ("Opaque")-1, KW_OPAQUE },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
307 { "optional", sizeof ("optional")-1, KW_OPTIONAL },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
308 { "LAST-UPDATED", sizeof ("LAST-UPDATED")-1, LASTUPDATED },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
309 { "ORGANIZATION", sizeof ("ORGANIZATION")-1, ORGANIZATION },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
310 { "CONTACT-INFO", sizeof ("CONTACT-INFO")-1, CONTACTINFO },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
311 { "MODULE-IDENTITY", sizeof ("MODULE-IDENTITY")-1, MODULEIDENTITY },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
312 { "MODULE-COMPLIANCE", sizeof ("MODULE-COMPLIANCE")-1, COMPLIANCE },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
313 { "DEFINITIONS", sizeof("DEFINITIONS")-1, DEFINITIONS},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
314 { "END", sizeof("END")-1, END},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
315 { "AUGMENTS", sizeof ("AUGMENTS")-1, AUGMENTS },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
316 { "not-accessible", sizeof ("not-accessible")-1, NOACCESS },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
317 { "write-only", sizeof ("write-only")-1, WRITEONLY },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
318 { "NsapAddress", sizeof("NsapAddress")-1, NSAPADDRESS},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
319 { "UNITS", sizeof("Units")-1, UNITS},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
320 { "REFERENCE", sizeof("REFERENCE")-1, REFERENCE},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
321 { "NUM-ENTRIES", sizeof("NUM-ENTRIES")-1, NUM_ENTRIES},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
322 { "BITSTRING", sizeof("BITSTRING")-1, BITSTRING},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
323 { "BIT", sizeof("BIT")-1, CONTINUE},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
324 { "BITS", sizeof("BITS")-1, BITSTRING},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
325 { "Counter64", sizeof("Counter64")-1, COUNTER64},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
326 { "TimeTicks", sizeof ("TimeTicks")-1, TIMETICKS },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
327 { "NOTIFICATION-TYPE", sizeof ("NOTIFICATION-TYPE")-1, NOTIFTYPE },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
328 { "OBJECT-GROUP", sizeof ("OBJECT-GROUP")-1, OBJGROUP },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
329 { "OBJECT-IDENTITY", sizeof ("OBJECT-IDENTITY")-1, OBJGROUP },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
330 { "OBJECTIDENTIFIER", sizeof ("OBJECTIDENTIFIER")-1, OBJID },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
331 { "OBJECT", sizeof ("OBJECT")-1, CONTINUE },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
332 { "NetworkAddress", sizeof ("NetworkAddress")-1, NETADDR },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
333 { "Gauge", sizeof ("Gauge")-1, GAUGE },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
334 { "Gauge32", sizeof ("Gauge32")-1, GAUGE },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
335 { "Unsigned32", sizeof ("Unsigned32")-1, GAUGE },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
336 { "read-write", sizeof ("read-write")-1, READWRITE },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
337 { "read-create", sizeof ("read-create")-1, READCREATE },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
338 { "OCTETSTRING", sizeof ("OCTETSTRING")-1, OCTETSTR },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
339 { "OCTET", sizeof ("OCTET")-1, CONTINUE },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
340 { "OF", sizeof ("OF")-1, OF },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
341 { "SEQUENCE", sizeof ("SEQUENCE")-1, SEQUENCE },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
342 { "NULL", sizeof ("NULL")-1, NUL },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
343 { "IpAddress", sizeof ("IpAddress")-1, IPADDR },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
344 { "UInteger32", sizeof ("UInteger32")-1, UINTEGER32 },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
345 { "INTEGER", sizeof ("INTEGER")-1, INTEGER },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
346 { "Integer32", sizeof ("Integer32")-1, INTEGER32 },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
347 { "Counter", sizeof ("Counter")-1, COUNTER },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
348 { "Counter32", sizeof ("Counter32")-1, COUNTER },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
349 { "read-only", sizeof ("read-only")-1, READONLY },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
350 { "DESCRIPTION", sizeof ("DESCRIPTION")-1, DESCRIPTION },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
351 { "INDEX", sizeof ("INDEX")-1, INDEX },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
352 { "DEFVAL", sizeof ("DEFVAL")-1, DEFVAL },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
353 { "deprecated", sizeof ("deprecated")-1, DEPRECATED },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
354 { "SIZE", sizeof ("SIZE")-1, SIZE },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
355 { "MAX-ACCESS", sizeof ("MAX-ACCESS")-1, ACCESS },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
356 { "ACCESS", sizeof ("ACCESS")-1, ACCESS },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
357 { "mandatory", sizeof ("mandatory")-1, MANDATORY },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
358 { "current", sizeof ("current")-1, CURRENT },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
359 { "STATUS", sizeof ("STATUS")-1, STATUS },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
360 { "SYNTAX", sizeof ("SYNTAX")-1, SYNTAX },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
361 { "OBJECT-TYPE", sizeof ("OBJECT-TYPE")-1, OBJTYPE },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
362 { "TRAP-TYPE", sizeof ("TRAP-TYPE")-1, TRAPTYPE },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
363 { "ENTERPRISE", sizeof ("ENTERPRISE")-1, ENTERPRISE },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
364 { "BEGIN", sizeof ("BEGIN")-1, BEGIN },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
365 { "IMPORTS", sizeof ("IMPORTS")-1, IMPORTS },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
366 { "EXPORTS", sizeof ("EXPORTS")-1, EXPORTS },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
367 { "accessible-for-notify", sizeof ("accessible-for-notify")-1, ACCNOTIFY },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
368 { "TEXTUAL-CONVENTION", sizeof ("TEXTUAL-CONVENTION")-1, CONVENTION },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
369 { "NOTIFICATION-GROUP", sizeof ("NOTIFICATION-GROUP")-1, NOTIFTYPE },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
370 { "DISPLAY-HINT", sizeof ("DISPLAY-HINT")-1, DISPLAYHINT },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
371 { "FROM", sizeof ("FROM")-1, FROM },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
372 { "AGENT-CAPABILITIES", sizeof ("AGENT-CAPABILITIES")-1, CAPABILITIES },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
373 { "MACRO", sizeof ("MACRO")-1, MACRO },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
374 { "IMPLIED", sizeof ("IMPLIED")-1, IMPLIED },
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
375 { NULL }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
376 };
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
377
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
378 static struct module_compatability *module_map_head;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
379 static struct module_compatability module_map[] = {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
380 { "RFC1065-SMI", "RFC1155-SMI", NULL, 0},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
381 { "RFC1066-MIB", "RFC1156-MIB", NULL, 0},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
382 /* 'mib' -> 'mib-2' */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
383 { "RFC1156-MIB", "RFC1158-MIB", NULL, 0},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
384 /* 'snmpEnableAuthTraps' -> 'snmpEnableAuthenTraps' */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
385 { "RFC1158-MIB", "RFC1213-MIB", NULL, 0},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
386 /* 'nullOID' -> 'zeroDotZero' */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
387 { "RFC1155-SMI", "SNMPv2-SMI", NULL, 0},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
388 { "RFC1213-MIB", "SNMPv2-SMI", "mib-2", 0},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
389 { "RFC1213-MIB", "SNMPv2-MIB", "sys", 3},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
390 { "RFC1213-MIB", "IF-MIB", "if", 2},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
391 { "RFC1213-MIB", "IP-MIB", "ip", 2},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
392 { "RFC1213-MIB", "IP-MIB", "icmp", 4},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
393 { "RFC1213-MIB", "TCP-MIB", "tcp", 3},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
394 { "RFC1213-MIB", "UDP-MIB", "udp", 3},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
395 { "RFC1213-MIB", "SNMPv2-SMI", "transmission", 0},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
396 { "RFC1213-MIB", "SNMPv2-MIB", "snmp", 4},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
397 { "RFC1271-MIB", "RMON-MIB", NULL, 0},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
398 { "RFC1286-MIB", "SOURCE-ROUTING-MIB", "dot1dSr", 7},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
399 { "RFC1286-MIB", "BRIDGE-MIB", NULL, 0},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
400 { "RFC1315-MIB", "FRAME-RELAY-DTE-MIB", NULL, 0},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
401 { "RFC1316-MIB", "CHARACTER-MIB", NULL, 0},
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
402 };
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
403 #define MODULE_NOT_FOUND 0
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
404 #define MODULE_LOADED_OK 1
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
405 #define MODULE_ALREADY_LOADED 2
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
406 /* #define MODULE_LOAD_FAILED 3 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
407 #define MODULE_LOAD_FAILED MODULE_NOT_FOUND
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
408
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
409
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
410 #define HASHSIZE 32
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
411 #define BUCKET(x) (x & (HASHSIZE-1))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
412
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
413 #define NHASHSIZE 128
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
414 #define NBUCKET(x) (x & (NHASHSIZE-1))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
415
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
416 static struct tok *buckets[HASHSIZE];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
417
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
418 static struct node *nbuckets[NHASHSIZE];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
419 static struct tree *tbuckets[NHASHSIZE];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
420 static struct module *module_head = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
421
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
422 struct node *orphan_nodes = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
423 struct tree *tree_head = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
424
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
425 #define NUMBER_OF_ROOT_NODES 3
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
426 static struct module_import root_imports[NUMBER_OF_ROOT_NODES];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
427
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
428 static int current_module = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
429 static int max_module = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
430 static char *last_err_module = 0; /* no repeats on "Cannot find module..." */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
431
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
432 static void tree_from_node(struct tree *tp, struct node *np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
433 static void do_subtree (struct tree *, struct node **);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
434 static void do_linkup (struct module *, struct node *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
435 static void dump_module_list (void);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
436 static int get_token (FILE *, char *, int);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
437 static int parseQuoteString (FILE *, char *, int);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
438 static int tossObjectIdentifier (FILE *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
439 static int name_hash (const char *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
440 static void init_node_hash (struct node *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
441 static void print_error (const char *, const char *, int);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
442 static void free_tree (struct tree *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
443 static void free_partial_tree (struct tree *, int);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
444 static void free_node (struct node *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
445 static void build_translation_table (void);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
446 static void init_tree_roots (void);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
447 static void merge_anon_children (struct tree *, struct tree *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
448 static void unlink_tbucket(struct tree *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
449 static void unlink_tree(struct tree *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
450 static int getoid (FILE *, struct subid_s *, int);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
451 static struct node *parse_objectid (FILE *, char *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
452 static int get_tc (const char *, int, int *, struct enum_list **, struct range_list **, char **);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
453 static int get_tc_index (const char *, int);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
454 static struct enum_list *parse_enumlist (FILE *, struct enum_list **);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
455 static struct range_list *parse_ranges(FILE *fp, struct range_list **);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
456 static struct node *parse_asntype (FILE *, char *, int *, char *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
457 static struct node *parse_objecttype (FILE *, char *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
458 static struct node *parse_objectgroup (FILE *, char *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
459 static struct node *parse_notificationDefinition (FILE *, char *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
460 static struct node *parse_trapDefinition (FILE *, char *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
461 static struct node *parse_compliance (FILE *, char *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
462 static struct node *parse_capabilities(FILE *, char *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
463 static struct node *parse_moduleIdentity (FILE *, char *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
464 static struct node *parse_macro(FILE *, char *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
465 static void parse_imports (FILE *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
466 static struct node *parse (FILE *, struct node *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
467
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
468 static int read_module_internal (const char *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
469 static void read_module_replacements (const char *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
470 static void read_import_replacements (const char *, struct module_import *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
471
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
472 static void new_module (const char *, const char *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
473
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
474 static struct node *merge_parse_objectid (struct node *, FILE *, char *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
475 static struct index_list *getIndexes(FILE *fp, struct index_list **);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
476 static void free_indexes(struct index_list **);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
477 static void free_ranges(struct range_list **);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
478 static void free_enums(struct enum_list **);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
479 static struct range_list * copy_ranges(struct range_list *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
480 static struct enum_list * copy_enums(struct enum_list *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
481 static struct index_list * copy_indexes(struct index_list *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
482
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
483 /* backwards compatibility wrappers */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
484 void snmp_set_mib_errors(int err)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
485 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
486 ds_set_boolean(DS_LIBRARY_ID, DS_LIB_MIB_ERRORS, err);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
487 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
488
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
489 void snmp_set_mib_warnings(int warn)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
490 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
491 ds_set_int(DS_LIBRARY_ID, DS_LIB_MIB_WARNINGS, warn);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
492 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
493
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
494 void snmp_set_save_descriptions(int save)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
495 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
496 ds_set_boolean(DS_LIBRARY_ID, DS_LIB_SAVE_MIB_DESCRS, save);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
497 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
498
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
499 void snmp_set_mib_comment_term(int save)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
500 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
501 /* 0=strict, 1=EOL terminated */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
502 ds_set_boolean(DS_LIBRARY_ID, DS_LIB_MIB_COMMENT_TERM, save);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
503 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
504
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
505 void snmp_set_mib_parse_label(int save)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
506 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
507 /* 0=strict, 1=underscore OK in label */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
508 ds_set_boolean(DS_LIBRARY_ID, DS_LIB_MIB_PARSE_LABEL, save);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
509 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
510
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
511 /* end wrappers */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
512
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
513 void snmp_mib_toggle_options_usage(const char *lead, FILE *outf) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
514 fprintf(outf, "%sMIBOPTS values:\n", lead);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
515 fprintf(outf, "%s u: %sallow the usage of underlines in mib symbols.\n",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
516 lead, ((ds_get_boolean(DS_LIBRARY_ID, DS_LIB_MIB_PARSE_LABEL))?"dis":""));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
517 fprintf(outf, "%s c: %sallow the usage of \"--\" to terminate comments.\n",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
518 lead, ((ds_get_boolean(DS_LIBRARY_ID, DS_LIB_MIB_COMMENT_TERM))?"":"dis"));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
519 fprintf(outf, "%s d: %ssave the descriptions of the mib objects.\n",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
520 lead, ((ds_get_boolean(DS_LIBRARY_ID, DS_LIB_SAVE_MIB_DESCRS))?"don't ":""));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
521 fprintf(outf, "%s e: Disable mib errors of MIB symbols conflicts\n",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
522 lead);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
523 fprintf(outf, "%s w: Enable mib warnings of MIB symbols conflicts\n",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
524 lead);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
525 fprintf(outf, "%s W: Enable detailed warnings of MIB symbols conflicts\n",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
526 lead);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
527 fprintf(outf, "%s R: Replace MIB symbols from latest module\n",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
528 lead);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
529 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
530
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
531 char *snmp_mib_toggle_options(char *options) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
532 if (options) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
533 while(*options) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
534 switch(*options) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
535 case 'u':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
536 ds_set_boolean(DS_LIBRARY_ID, DS_LIB_MIB_PARSE_LABEL, !ds_get_boolean(DS_LIBRARY_ID, DS_LIB_MIB_PARSE_LABEL));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
537 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
538
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
539 case 'c':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
540 ds_toggle_boolean(DS_LIBRARY_ID, DS_LIB_MIB_COMMENT_TERM);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
541 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
542
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
543 case 'e':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
544 ds_toggle_boolean(DS_LIBRARY_ID, DS_LIB_MIB_ERRORS);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
545 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
546
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
547 case 'w':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
548 ds_set_int(DS_LIBRARY_ID, DS_LIB_MIB_WARNINGS, 1);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
549 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
550
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
551 case 'W':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
552 ds_set_int(DS_LIBRARY_ID, DS_LIB_MIB_WARNINGS, 2);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
553 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
554
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
555 case 'd':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
556 ds_toggle_boolean(DS_LIBRARY_ID, DS_LIB_SAVE_MIB_DESCRS);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
557 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
558
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
559 case 'R':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
560 ds_toggle_boolean(DS_LIBRARY_ID, DS_LIB_MIB_REPLACE);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
561 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
562
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
563 default:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
564 /* return at the unknown option */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
565 return options;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
566 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
567 options++;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
568 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
569 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
570 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
571 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
572
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
573 static int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
574 name_hash(const char* name)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
575 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
576 int hash = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
577 const char *cp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
578
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
579 if (name) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
580 for(cp = name; *cp; cp++) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
581 hash += tolower(*cp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
582 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
583 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
584 return(hash);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
585 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
586
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
587 void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
588 init_mib_internals (void)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
589 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
590 register struct tok *tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
591 register int b, i;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
592 int max_modc;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
593
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
594 if (tree_head)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
595 return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
596
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
597 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
598 * Set up hash list of pre-defined tokens
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
599 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
600 memset(buckets, 0, sizeof(buckets));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
601 for (tp = tokens; tp->name; tp++) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
602 tp->hash = name_hash( tp->name );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
603 b = BUCKET(tp->hash);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
604 if (buckets[b])
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
605 tp->next = buckets[b]; /* BUG ??? */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
606 buckets[b] = tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
607 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
608
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
609 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
610 * Initialise other internal structures
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
611 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
612
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
613 max_modc = sizeof(module_map)/sizeof(module_map[0])-1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
614 for ( i = 0; i < max_modc; ++i )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
615 module_map[i].next = &(module_map[i+1]);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
616 module_map[max_modc].next = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
617 module_map_head = module_map;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
618
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
619 memset(nbuckets, 0, sizeof(nbuckets));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
620 memset(tbuckets, 0, sizeof(tbuckets));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
621 memset(tclist, 0, MAXTC * sizeof(struct tc));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
622 build_translation_table();
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
623 init_tree_roots(); /* Set up initial roots */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
624 /* Relies on 'add_mibdir' having set up the modules */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
625 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
626
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
627 static void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
628 init_node_hash(struct node *nodes)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
629 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
630 register struct node *np, *nextp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
631 register int hash;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
632
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
633 memset(nbuckets, 0, sizeof(nbuckets));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
634 for(np = nodes; np;){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
635 nextp = np->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
636 hash = NBUCKET(name_hash(np->parent));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
637 np->next = nbuckets[hash];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
638 nbuckets[hash] = np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
639 np = nextp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
640 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
641 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
642
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
643 static int erroneousMibs = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
644
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
645 int get_mib_parse_error_count(void)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
646 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
647 return erroneousMibs;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
648 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
649
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
650
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
651 static void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
652 print_error(const char *string,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
653 const char *token,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
654 int type)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
655 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
656 erroneousMibs++;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
657 DEBUGMSGTL(("parse-mibs", "\n"));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
658 if (type == ENDOFFILE)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
659 snmp_log(LOG_ERR, "%s (EOF): At line %d in %s\n", string, Line,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
660 File);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
661 else if (token && *token)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
662 snmp_log(LOG_ERR, "%s (%s): At line %d in %s\n", string, token,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
663 Line, File);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
664 else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
665 snmp_log(LOG_ERR, "%s: At line %d in %s\n", string, Line, File);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
666 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
667
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
668 static void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
669 print_module_not_found(const char *cp)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
670 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
671 if (!last_err_module || strcmp(cp, last_err_module))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
672 print_error("Cannot find module", cp, CONTINUE);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
673 if (last_err_module) free(last_err_module);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
674 last_err_module = strdup(cp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
675 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
676
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
677 static struct node *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
678 alloc_node(int modid)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
679 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
680 struct node *np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
681 np = (struct node *) calloc(1, sizeof(struct node));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
682 if (np) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
683 np->tc_index = -1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
684 np->modid = modid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
685 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
686 return np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
687 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
688
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
689 static void unlink_tbucket(struct tree *tp)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
690 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
691 int hash = NBUCKET(name_hash(tp->label));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
692 struct tree *otp = NULL, *ntp = tbuckets[hash];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
693
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
694 while (ntp && ntp != tp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
695 otp = ntp; ntp = ntp->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
696 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
697 if (!ntp) snmp_log(LOG_EMERG, "Can't find %s in tbuckets\n", tp->label);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
698 else if (otp) otp->next = ntp->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
699 else tbuckets[hash] = tp->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
700 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
701
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
702 static void unlink_tree(struct tree *tp)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
703 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
704 struct tree *otp = NULL, *ntp = tp->parent->child_list;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
705
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
706 while (ntp && ntp != tp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
707 otp = ntp; ntp = ntp->next_peer;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
708 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
709 if (!ntp) snmp_log(LOG_EMERG, "Can't find %s in %s's children\n",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
710 tp->label, tp->parent->label);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
711 else if (otp) otp->next_peer = ntp->next_peer;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
712 else tp->parent->child_list = tp->next_peer;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
713 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
714
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
715 static void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
716 free_partial_tree(struct tree *tp, int keep_label)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
717 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
718 if ( !tp)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
719 return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
720
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
721 /* remove the data from this tree node */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
722 free_enums(&tp->enums);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
723 free_ranges(&tp->ranges);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
724 free_indexes(&tp->indexes);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
725 if (!keep_label)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
726 SNMP_FREE(tp->label);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
727 SNMP_FREE(tp->hint);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
728 SNMP_FREE(tp->units);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
729 SNMP_FREE(tp->description);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
730 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
731
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
732 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
733 * free a tree node. Note: the node must already have been unlinked
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
734 * from the tree when calling this routine
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
735 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
736 static void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
737 free_tree(struct tree *Tree)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
738 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
739 if (!Tree)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
740 return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
741
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
742 unlink_tbucket(Tree);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
743 free_partial_tree (Tree, FALSE);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
744 if (Tree->number_modules > 1 )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
745 free((char*)Tree->module_list);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
746 free ((char*)Tree);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
747 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
748
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
749 static void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
750 free_node(struct node *np)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
751 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
752 if ( !np) return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
753
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
754 free_enums(&np->enums);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
755 free_ranges(&np->ranges);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
756 free_indexes(&np->indexes);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
757 if (np->label) free(np->label);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
758 if (np->hint) free(np->hint);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
759 if (np->units) free(np->units);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
760 if (np->description) free(np->description);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
761 if (np->parent) free(np->parent);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
762 free((char*)np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
763 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
764
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
765 #ifdef TEST
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
766 static void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
767 print_nodes(FILE *fp,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
768 struct node *root)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
769 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
770 extern void xmalloc_stats (FILE *);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
771 struct enum_list *ep;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
772 struct index_list *ip;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
773 struct range_list *rp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
774 struct node *np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
775
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
776 for(np = root; np; np = np->next){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
777 fprintf(fp, "%s ::= { %s %ld } (%d)\n", np->label, np->parent,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
778 np->subid, np->type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
779 if (np->tc_index >= 0)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
780 fprintf(fp, " TC = %s\n", tclist[np->tc_index].descriptor);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
781 if (np->enums){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
782 fprintf(fp, " Enums: \n");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
783 for(ep = np->enums; ep; ep = ep->next){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
784 fprintf(fp, " %s(%d)\n", ep->label, ep->value);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
785 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
786 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
787 if (np->ranges){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
788 fprintf(fp, " Ranges: \n");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
789 for(rp = np->ranges; rp; rp = rp->next){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
790 fprintf(fp, " %d..%d\n", rp->low, rp->high);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
791 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
792 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
793 if (np->indexes){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
794 fprintf(fp, " Indexes: \n");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
795 for(ip = np->indexes; ip; ip = ip->next){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
796 fprintf(fp, " %s\n", ip->ilabel);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
797 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
798 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
799 if (np->hint)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
800 fprintf(fp, " Hint: %s\n", np->hint);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
801 if (np->units)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
802 fprintf(fp, " Units: %s\n", np->units);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
803 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
804 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
805 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
806
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
807 void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
808 print_subtree(FILE *f,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
809 struct tree *tree,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
810 int count)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
811 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
812 struct tree *tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
813 int i;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
814 char modbuf[256];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
815
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
816 for(i = 0; i < count; i++)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
817 fprintf(f, " ");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
818 fprintf(f, "Children of %s(%ld):\n", tree->label, tree->subid);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
819 count++;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
820 for(tp = tree->child_list; tp; tp = tp->next_peer){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
821 for(i = 0; i < count; i++)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
822 fprintf(f, " ");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
823 fprintf(f, "%s:%s(%ld) type=%d",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
824 module_name(tp->module_list[0], modbuf),
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
825 tp->label, tp->subid, tp->type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
826 if (tp->tc_index != -1) fprintf(f, " tc=%d", tp->tc_index);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
827 if (tp->hint) fprintf(f, " hint=%s", tp->hint);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
828 if (tp->units) fprintf(f, " units=%s", tp->units);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
829 if (tp->number_modules > 1) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
830 fprintf(f, " modules:");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
831 for (i = 1; i < tp->number_modules; i++)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
832 fprintf(f, " %s", module_name(tp->module_list[i], modbuf));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
833 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
834 fprintf(f, "\n");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
835 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
836 for(tp = tree->child_list; tp; tp = tp->next_peer){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
837 if (tp->child_list)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
838 print_subtree(f, tp, count);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
839 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
840 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
841
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
842 void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
843 print_ascii_dump_tree(FILE *f,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
844 struct tree *tree,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
845 int count)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
846 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
847 struct tree *tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
848
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
849 count++;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
850 for(tp = tree->child_list; tp; tp = tp->next_peer){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
851 fprintf(f, "%s OBJECT IDENTIFIER ::= { %s %ld }\n", tp->label, tree->label, tp->subid);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
852 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
853 for(tp = tree->child_list; tp; tp = tp->next_peer){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
854 if (tp->child_list)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
855 print_ascii_dump_tree(f, tp, count);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
856 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
857 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
858
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
859 static int translation_table[256];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
860
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
861 static void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
862 build_translation_table()
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
863 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
864 int count;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
865
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
866 for(count = 0; count < 256; count++){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
867 switch(count){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
868 case OBJID:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
869 translation_table[count] = TYPE_OBJID;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
870 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
871 case OCTETSTR:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
872 translation_table[count] = TYPE_OCTETSTR;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
873 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
874 case INTEGER:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
875 translation_table[count] = TYPE_INTEGER;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
876 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
877 case NETADDR:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
878 translation_table[count] = TYPE_IPADDR;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
879 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
880 case IPADDR:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
881 translation_table[count] = TYPE_IPADDR;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
882 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
883 case COUNTER:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
884 translation_table[count] = TYPE_COUNTER;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
885 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
886 case GAUGE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
887 translation_table[count] = TYPE_GAUGE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
888 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
889 case TIMETICKS:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
890 translation_table[count] = TYPE_TIMETICKS;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
891 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
892 case KW_OPAQUE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
893 translation_table[count] = TYPE_OPAQUE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
894 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
895 case NUL:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
896 translation_table[count] = TYPE_NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
897 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
898 case COUNTER64:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
899 translation_table[count] = TYPE_COUNTER64;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
900 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
901 case BITSTRING:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
902 translation_table[count] = TYPE_BITSTRING;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
903 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
904 case NSAPADDRESS:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
905 translation_table[count] = TYPE_NSAPADDRESS;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
906 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
907 case UINTEGER32:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
908 translation_table[count] = TYPE_UINTEGER;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
909 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
910 default:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
911 translation_table[count] = TYPE_OTHER;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
912 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
913 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
914 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
915 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
916
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
917 static void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
918 init_tree_roots()
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
919 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
920 struct tree *tp, *lasttp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
921 int base_modid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
922 int hash;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
923
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
924 base_modid = which_module("SNMPv2-SMI");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
925 if (base_modid == -1 )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
926 base_modid = which_module("RFC1155-SMI");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
927 if (base_modid == -1 )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
928 base_modid = which_module("RFC1213-MIB");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
929
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
930 /* build root node */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
931 tp = (struct tree *) calloc(1, sizeof(struct tree));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
932 if (tp == NULL) return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
933 tp->label = strdup("joint-iso-ccitt");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
934 tp->modid = base_modid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
935 tp->number_modules = 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
936 tp->module_list = &(tp->modid);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
937 tp->subid = 2;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
938 tp->tc_index = -1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
939 set_function(tp); /* from mib.c */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
940 hash = NBUCKET(name_hash(tp->label));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
941 tp->next = tbuckets[hash];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
942 tbuckets[hash] = tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
943 lasttp = tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
944 root_imports[0].label = strdup( tp->label );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
945 root_imports[0].modid = base_modid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
946
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
947 /* build root node */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
948 tp = (struct tree *) calloc(1, sizeof(struct tree));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
949 if (tp == NULL) return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
950 tp->next_peer = lasttp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
951 tp->label = strdup("ccitt");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
952 tp->modid = base_modid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
953 tp->number_modules = 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
954 tp->module_list = &(tp->modid);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
955 tp->subid = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
956 tp->tc_index = -1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
957 set_function(tp); /* from mib.c */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
958 hash = NBUCKET(name_hash(tp->label));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
959 tp->next = tbuckets[hash];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
960 tbuckets[hash] = tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
961 lasttp = tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
962 root_imports[1].label = strdup( tp->label );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
963 root_imports[1].modid = base_modid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
964
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
965 /* build root node */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
966 tp = (struct tree *) calloc(1, sizeof(struct tree));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
967 if (tp == NULL) return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
968 tp->next_peer = lasttp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
969 tp->label = strdup("iso");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
970 tp->modid = base_modid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
971 tp->number_modules = 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
972 tp->module_list = &(tp->modid);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
973 tp->subid = 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
974 tp->tc_index = -1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
975 set_function(tp); /* from mib.c */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
976 hash = NBUCKET(name_hash(tp->label));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
977 tp->next = tbuckets[hash];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
978 tbuckets[hash] = tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
979 lasttp = tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
980 root_imports[2].label = strdup( tp->label );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
981 root_imports[2].modid = base_modid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
982
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
983 tree_head = tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
984 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
985
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
986 #ifdef STRICT_MIB_PARSEING
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
987 #define label_compare strcasecmp
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
988 #else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
989 #define label_compare strcmp
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
990 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
991
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
992
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
993 struct tree *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
994 find_tree_node(const char *name,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
995 int modid)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
996 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
997 struct tree *tp, *headtp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
998 int count, *int_p;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
999
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1000 if (!name || !*name)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1001 return(NULL);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1002
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1003 headtp = tbuckets[NBUCKET(name_hash(name))];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1004 for ( tp = headtp ; tp ; tp=tp->next ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1005 if ( !label_compare(tp->label, name) ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1006
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1007 if ( modid == -1 ) /* Any module */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1008 return(tp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1009
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1010 for (int_p = tp->module_list, count=0 ;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1011 count < tp->number_modules ;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1012 ++count, ++int_p )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1013 if ( *int_p == modid )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1014 return(tp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1015 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1016 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1017
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1018 return(NULL);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1019 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1020
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1021 /* computes a value which represents how close name1 is to name2.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1022 * high scores mean a worse match.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1023 * (yes, the algorithm sucks!)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1024 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1025 #define MAX_BAD 0xffffff
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1026
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1027 u_int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1028 compute_match(const char *search_base, const char *key) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1029 #if defined(HAVE_REGEX_H) && defined(HAVE_REGCOMP)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1030 int rc;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1031 regex_t parsetree;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1032 regmatch_t pmatch;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1033
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1034 rc=regcomp(&parsetree, key, REG_ICASE | REG_EXTENDED);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1035 if (rc == 0)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1036 rc=regexec(&parsetree, search_base, 1, &pmatch, 0);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1037 regfree(&parsetree);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1038 if (rc == 0) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1039 /* found */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1040 return pmatch.rm_so;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1041 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1042 #else /* use our own wildcard matcher */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1043 /* first find the longest matching substring (ick) */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1044 char *first = NULL, *result = NULL, *entry;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1045 const char *position;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1046 char *newkey = strdup(key);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1047
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1048
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1049 entry = strtok( newkey, "*" );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1050 position = search_base;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1051 while ( entry ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1052 result = strcasestr(position, entry);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1053
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1054 if (result == NULL) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1055 free(newkey);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1056 return MAX_BAD;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1057 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1058
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1059 if (first == NULL)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1060 first = result;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1061
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1062 position = result + strlen(entry);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1063 entry = strtok( NULL, "*" );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1064 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1065 free(newkey);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1066 if (result)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1067 return(first-search_base);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1068 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1069
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1070 /* not found */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1071 return MAX_BAD;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1072 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1073
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1074 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1075 * Find the tree node that best matches the pattern string.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1076 * Use the "reported" flag such that only one match
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1077 * is attempted for every node.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1078 *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1079 * Warning! This function may recurse.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1080 *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1081 * Caller _must_ invoke clear_tree_flags before first call
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1082 * to this function. This function may be called multiple times
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1083 * to ensure that the entire tree is traversed.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1084 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1085
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1086 struct tree *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1087 find_best_tree_node(const char *pattrn, struct tree *tree_top, u_int *match)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1088 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1089 struct tree *tp, *best_so_far = NULL, *retptr;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1090 u_int old_match=MAX_BAD, new_match=MAX_BAD;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1091
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1092 if (!pattrn || !*pattrn)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1093 return(NULL);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1094
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1095 if (!tree_top)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1096 tree_top = get_tree_head();
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1097
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1098 for ( tp = tree_top ; tp ; tp=tp->next_peer ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1099 if (!tp->reported)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1100 new_match = compute_match(tp->label, pattrn);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1101 tp->reported = 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1102
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1103 if (new_match < old_match) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1104 best_so_far = tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1105 old_match = new_match;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1106 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1107 if (new_match == 0)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1108 break; /* this is the best result we can get */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1109 if (tp->child_list) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1110 retptr = find_best_tree_node(pattrn, tp->child_list, &new_match);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1111 if (new_match < old_match) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1112 best_so_far = retptr;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1113 old_match = new_match;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1114 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1115 if (new_match == 0)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1116 break; /* this is the best result we can get */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1117 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1118 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1119
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1120 if (match)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1121 *match = old_match;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1122 return(best_so_far);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1123 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1124
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1125
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1126 static void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1127 merge_anon_children(struct tree *tp1,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1128 struct tree *tp2)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1129 /* NB: tp1 is the 'anonymous' node */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1130 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1131 struct tree *child1, *child2, *previous;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1132
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1133 for ( child1 = tp1->child_list ; child1 ; ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1134
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1135 for ( child2 = tp2->child_list, previous = NULL ;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1136 child2 ; previous = child2, child2 = child2->next_peer ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1137
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1138 if ( child1->subid == child2->subid ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1139 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1140 * Found 'matching' children,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1141 * so merge them
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1142 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1143 if ( !strncmp( child1->label, ANON, ANON_LEN)) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1144 merge_anon_children( child1, child2 );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1145
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1146 child1->child_list = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1147 previous = child1; /* Finished with 'child1' */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1148 child1 = child1->next_peer;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1149 free_tree( previous );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1150 goto next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1151 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1152
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1153 else if ( !strncmp( child2->label, ANON, ANON_LEN)) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1154 merge_anon_children( child2, child1 );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1155
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1156 if ( previous )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1157 previous->next_peer = child2->next_peer;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1158 else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1159 tp2->child_list = child2->next_peer;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1160 free_tree(child2);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1161
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1162 previous = child1; /* Move 'child1' to 'tp2' */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1163 child1 = child1->next_peer;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1164 previous->next_peer = tp2->child_list;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1165 tp2->child_list = previous;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1166 for ( previous = tp2->child_list ;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1167 previous ;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1168 previous = previous->next_peer )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1169 previous->parent = tp2;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1170 goto next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1171 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1172 else if ( !label_compare( child1->label, child2->label) ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1173 if (ds_get_int(DS_LIBRARY_ID, DS_LIB_MIB_WARNINGS))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1174 snmp_log(LOG_WARNING, "Warning: %s.%ld is both %s and %s (%s)\n",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1175 tp2->label, child1->subid,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1176 child1->label, child2->label, File);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1177 continue;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1178 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1179 else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1180 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1181 * Two copies of the same node.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1182 * 'child2' adopts the children of 'child1'
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1183 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1184
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1185 if ( child2->child_list ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1186 for ( previous = child2->child_list ;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1187 previous->next_peer ;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1188 previous = previous->next_peer )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1189 ; /* Find the end of the list */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1190 previous->next_peer = child1->child_list;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1191 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1192 else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1193 child2->child_list = child1->child_list;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1194 for ( previous = child1->child_list ;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1195 previous ;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1196 previous = previous->next_peer )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1197 previous->parent = child2;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1198 child1->child_list = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1199
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1200 previous = child1; /* Finished with 'child1' */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1201 child1 = child1->next_peer;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1202 free_tree( previous );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1203 goto next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1204 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1205 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1206 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1207 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1208 * If no match, move 'child1' to 'tp2' child_list
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1209 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1210 if ( child1 ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1211 previous = child1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1212 child1 = child1->next_peer;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1213 previous->parent = tp2;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1214 previous->next_peer = tp2->child_list;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1215 tp2->child_list = previous;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1216 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1217 next:;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1218 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1219 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1220
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1221
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1222 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1223 * Find all the children of root in the list of nodes. Link them into the
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1224 * tree and out of the nodes list.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1225 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1226 static void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1227 do_subtree(struct tree *root,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1228 struct node **nodes)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1229 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1230 register struct tree *tp, *anon_tp=NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1231 register struct node *np, **headp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1232 struct node *oldnp = NULL, *child_list = NULL, *childp = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1233 int hash;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1234 int *int_p;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1235
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1236 tp = root;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1237 headp = &nbuckets[NBUCKET(name_hash(tp->label))];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1238 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1239 * Search each of the nodes for one whose parent is root, and
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1240 * move each into a separate list.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1241 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1242 for(np = *headp; np; np = np->next){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1243 if ( !label_compare(tp->label, np->parent)){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1244 /* take this node out of the node list */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1245 if (oldnp == NULL){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1246 *headp = np->next; /* fix root of node list */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1247 } else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1248 oldnp->next = np->next; /* link around this node */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1249 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1250 if (child_list) childp->next = np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1251 else child_list = np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1252 childp = np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1253 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1254 else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1255 oldnp = np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1256 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1257
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1258 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1259 if (childp) childp->next = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1260 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1261 * Take each element in the child list and place it into the tree.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1262 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1263 for(np = child_list; np; np = np->next){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1264 anon_tp = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1265 tp = root->child_list;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1266 while (tp)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1267 if (tp->subid == np->subid) break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1268 else tp = tp->next_peer;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1269 if (tp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1270 if (!label_compare (tp->label, np->label)) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1271 /* Update list of modules */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1272 int_p = (int *) malloc((tp->number_modules+1) * sizeof(int));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1273 if (int_p == NULL) return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1274 memcpy(int_p, tp->module_list, tp->number_modules*sizeof(int));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1275 int_p[tp->number_modules] = np->modid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1276 if (tp->number_modules > 1 )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1277 free((char*)tp->module_list);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1278 ++tp->number_modules;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1279 tp->module_list = int_p;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1280
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1281 if ( ds_get_boolean(DS_LIBRARY_ID, DS_LIB_MIB_REPLACE) ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1282 /* Replace from node */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1283 tree_from_node(tp,np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1284 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1285 /* Handle children */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1286 do_subtree(tp, nodes);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1287 continue;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1288 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1289 if (!strncmp( np->label, ANON, ANON_LEN) ||
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1290 !strncmp( tp->label, ANON, ANON_LEN)) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1291 anon_tp = tp; /* Need to merge these two trees later */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1292 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1293 else if (ds_get_int(DS_LIBRARY_ID, DS_LIB_MIB_WARNINGS))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1294 snmp_log(LOG_WARNING, "Warning: %s.%ld is both %s and %s (%s)\n",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1295 root->label, np->subid, tp->label, np->label, File);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1296 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1297
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1298 tp = (struct tree *) calloc(1, sizeof(struct tree));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1299 if (tp == NULL) return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1300 tp->parent = root;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1301 tp->modid = np->modid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1302 tp->number_modules = 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1303 tp->module_list = &(tp->modid);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1304 tree_from_node(tp, np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1305 tp->next_peer = root->child_list;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1306 root->child_list = tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1307 hash = NBUCKET(name_hash(tp->label));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1308 tp->next = tbuckets[hash];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1309 tbuckets[hash] = tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1310 /* if (tp->type == TYPE_OTHER) */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1311 do_subtree(tp, nodes); /* recurse on this child if it isn't
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1312 an end node */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1313 if ( anon_tp ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1314 if (!strncmp( tp->label, ANON, ANON_LEN)) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1315 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1316 * The new node is anonymous,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1317 * so merge it with the existing one.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1318 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1319 merge_anon_children( tp, anon_tp );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1320
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1321 /* unlink and destroy tp */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1322 unlink_tree(tp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1323 free_tree(tp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1324 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1325 else if (!strncmp( anon_tp->label, ANON, ANON_LEN)) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1326 struct tree *ntp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1327 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1328 * The old node was anonymous,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1329 * so merge it with the existing one,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1330 * and fill in the full information.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1331 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1332 merge_anon_children( anon_tp, tp );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1333
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1334 /* unlink anon_tp from the hash */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1335 unlink_tbucket(anon_tp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1336
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1337 /* get rid of old contents of anon_tp */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1338 free_partial_tree(anon_tp, FALSE);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1339
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1340 /* put in the current information */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1341 anon_tp->label = tp->label;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1342 anon_tp->child_list = tp->child_list;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1343 anon_tp->modid = tp->modid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1344 anon_tp->tc_index = tp->tc_index;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1345 anon_tp->type = tp->type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1346 anon_tp->enums = tp->enums;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1347 anon_tp->indexes = tp->indexes;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1348 anon_tp->ranges = tp->ranges;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1349 anon_tp->hint = tp->hint;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1350 anon_tp->units = tp->units;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1351 anon_tp->description = tp->description;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1352 anon_tp->parent = tp->parent;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1353 set_function(anon_tp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1354
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1355 /* update parent pointer in moved children */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1356 ntp = anon_tp->child_list;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1357 while (ntp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1358 ntp->parent = anon_tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1359 ntp = ntp->next_peer;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1360 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1361
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1362 /* hash in anon_tp in its new place */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1363 hash = NBUCKET(name_hash(anon_tp->label));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1364 anon_tp->next = tbuckets[hash];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1365 tbuckets[hash] = anon_tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1366
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1367 /* unlink and destroy tp */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1368 unlink_tbucket(tp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1369 unlink_tree(tp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1370 free(tp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1371 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1372 else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1373 /* Uh? One of these two should have been anonymous! */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1374 if (ds_get_int(DS_LIBRARY_ID, DS_LIB_MIB_WARNINGS))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1375 snmp_log(LOG_WARNING,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1376 "Warning: expected anonymous node (either %s or %s) in %s\n",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1377 tp->label, anon_tp->label, File);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1378 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1379 anon_tp = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1380 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1381 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1382 /* free all nodes that were copied into tree */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1383 oldnp = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1384 for(np = child_list; np; np = np->next){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1385 if (oldnp)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1386 free_node(oldnp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1387 oldnp = np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1388 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1389 if (oldnp)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1390 free_node(oldnp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1391 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1392
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1393 static void do_linkup(struct module *mp,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1394 struct node *np)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1395 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1396 struct module_import *mip;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1397 struct node *onp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1398 struct tree *tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1399 int i;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1400 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1401 * All modules implicitly import
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1402 * the roots of the tree
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1403 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1404 if (snmp_get_do_debugging() > 1) dump_module_list();
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1405 DEBUGMSGTL(("parse-mibs", "Processing IMPORTS for module %d %s\n", mp->modid, mp->name));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1406 if ( mp->no_imports == 0 ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1407 mp->no_imports = NUMBER_OF_ROOT_NODES;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1408 mp->imports = root_imports;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1409 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1410
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1411 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1412 * Build the tree
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1413 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1414 init_node_hash( np );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1415 for ( i=0, mip=mp->imports ; i < mp->no_imports ; ++i, ++mip ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1416 char modbuf[256];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1417 DEBUGMSGTL(("parse-mibs", " Processing import: %s\n", mip->label));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1418 if (get_tc_index( mip->label, mip->modid ) != -1)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1419 continue;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1420 tp = find_tree_node( mip->label, mip->modid );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1421 if (!tp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1422 if (mip->modid != -1)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1423 snmp_log(LOG_WARNING, "Did not find '%s' in module %s (%s)\n",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1424 mip->label, module_name(mip->modid, modbuf), File);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1425 continue;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1426 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1427 do_subtree( tp, &np );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1428 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1429
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1430 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1431 * If any nodes left over,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1432 * check that they're not the result of a "fully qualified"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1433 * name, and then add them to the list of orphans
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1434 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1435
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1436 if (!np) return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1437 for ( tp = tree_head ; tp ; tp=tp->next_peer )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1438 do_subtree( tp, &np );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1439 if (!np) return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1440 for ( np = orphan_nodes ; np && np->next ; np = np->next )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1441 ; /* find the end of the orphan list */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1442 for (i = 0; i < NHASHSIZE; i++)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1443 if ( nbuckets[i] ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1444 if ( orphan_nodes )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1445 onp = np->next = nbuckets[i];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1446 else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1447 onp = orphan_nodes = nbuckets[i];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1448 nbuckets[i] = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1449 while (onp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1450 if (ds_get_int(DS_LIBRARY_ID, DS_LIB_MIB_WARNINGS))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1451 snmp_log(LOG_WARNING,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1452 "Unlinked OID in %s: %s ::= { %s %ld }\n",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1453 (mp->name ? mp->name : "<no module>"),
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1454 (onp->label ? onp->label : "<no label>"),
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1455 (onp->parent ? onp->parent : "<no parent>"),
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1456 onp->subid);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1457 np = onp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1458 onp = onp->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1459 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1460 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1461
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1462 return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1463 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1464
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1465
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1466 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1467 * Takes a list of the form:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1468 * { iso org(3) dod(6) 1 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1469 * and creates several nodes, one for each parent-child pair.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1470 * Returns 0 on error.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1471 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1472 static int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1473 getoid(FILE *fp,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1474 struct subid_s *id, /* an array of subids */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1475 int length) /* the length of the array */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1476 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1477 register int count;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1478 int type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1479 char token[MAXTOKEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1480
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1481 if ((type = get_token(fp, token, MAXTOKEN)) != LEFTBRACKET){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1482 print_error("Expected \"{\"", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1483 return 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1484 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1485 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1486 for(count = 0; count < length; count++, id++){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1487 id->label = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1488 id->modid = current_module;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1489 id->subid = -1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1490 if (type == RIGHTBRACKET){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1491 return count;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1492 } else if (type != LABEL && type != NUMBER){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1493 print_error("Not valid for object identifier", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1494 return 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1495 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1496 if (type == LABEL){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1497 /* this entry has a label */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1498 id->label = strdup(token);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1499 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1500 if (type == LEFTPAREN){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1501 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1502 if (type == NUMBER){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1503 id->subid = atoi(token);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1504 if ((type = get_token(fp, token, MAXTOKEN)) != RIGHTPAREN){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1505 print_error("Expected a closing parenthesis",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1506 token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1507 return 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1508 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1509 } else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1510 print_error("Expected a number", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1511 return 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1512 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1513 } else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1514 continue;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1515 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1516 } else if (type == NUMBER) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1517 /* this entry has just an integer sub-identifier */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1518 id->subid = atoi(token);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1519 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1520 else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1521 print_error("Expected label or number", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1522 return 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1523 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1524 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1525 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1526 print_error ("Too long OID", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1527 return 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1528 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1529
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1530 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1531 * Parse a sequence of object subidentifiers for the given name.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1532 * The "label OBJECT IDENTIFIER ::=" portion has already been parsed.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1533 *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1534 * The majority of cases take this form :
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1535 * label OBJECT IDENTIFIER ::= { parent 2 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1536 * where a parent label and a child subidentifier number are specified.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1537 *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1538 * Variations on the theme include cases where a number appears with
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1539 * the parent, or intermediate subidentifiers are specified by label,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1540 * by number, or both.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1541 *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1542 * Here are some representative samples :
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1543 * internet OBJECT IDENTIFIER ::= { iso org(3) dod(6) 1 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1544 * mgmt OBJECT IDENTIFIER ::= { internet 2 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1545 * rptrInfoHealth OBJECT IDENTIFIER ::= { snmpDot3RptrMgt 0 4 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1546 *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1547 * Here is a very rare form :
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1548 * iso OBJECT IDENTIFIER ::= { 1 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1549 *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1550 * Returns NULL on error. When this happens, memory may be leaked.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1551 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1552 static struct node *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1553 parse_objectid(FILE *fp,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1554 char *name)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1555 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1556 register int count;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1557 register struct subid_s *op, *nop;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1558 int length;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1559 struct subid_s loid[32];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1560 struct node *np, *root = NULL, *oldnp = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1561 struct tree *tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1562
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1563 if ((length = getoid(fp, loid, 32)) == 0){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1564 print_error("Bad object identifier", NULL, CONTINUE);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1565 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1566 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1567
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1568 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1569 * Handle numeric-only object identifiers,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1570 * by labelling the first sub-identifier
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1571 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1572 op = loid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1573 if ( !op->label )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1574 for ( tp = tree_head ; tp ; tp=tp->next_peer )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1575 if ( (int)tp->subid == op->subid ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1576 op->label = strdup(tp->label);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1577 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1578 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1579
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1580 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1581 * Handle "label OBJECT-IDENTIFIER ::= { subid }"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1582 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1583 if (length == 1) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1584 op = loid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1585 np = alloc_node(op->modid);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1586 if (np == NULL) return(NULL);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1587 np->subid = op->subid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1588 np->label = strdup(name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1589 if (op->label) free(op->label);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1590 return np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1591 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1592
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1593 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1594 * For each parent-child subid pair in the subid array,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1595 * create a node and link it into the node list.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1596 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1597 for(count = 0, op = loid, nop=loid+1; count < (length - 1);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1598 count++, op++, nop++){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1599 /* every node must have parent's name and child's name or number */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1600 /* XX the next statement is always true -- does it matter ?? */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1601 if (op->label && (nop->label || (nop->subid != -1))){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1602 np = alloc_node(nop->modid);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1603 if (np == NULL) return(NULL);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1604 if (root == NULL) root = np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1605
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1606 np->parent = strdup (op->label);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1607 if (count == (length - 2)) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1608 /* The name for this node is the label for this entry */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1609 np->label = strdup (name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1610 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1611 else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1612 if (!nop->label) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1613 nop->label = (char *) malloc(20 + ANON_LEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1614 if (nop->label == NULL) return(NULL);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1615 sprintf(nop->label, "%s%d", ANON, anonymous++);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1616 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1617 np->label = strdup (nop->label);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1618 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1619 if (nop->subid != -1)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1620 np->subid = nop->subid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1621 else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1622 print_error("Warning: This entry is pretty silly",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1623 np->label, CONTINUE);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1624
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1625 /* set up next entry */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1626 if (oldnp) oldnp->next = np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1627 oldnp = np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1628 } /* end if(op->label... */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1629 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1630
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1631 /* free the loid array */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1632 for(count = 0, op = loid; count < length; count++, op++){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1633 if (op->label)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1634 free(op->label);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1635 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1636
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1637 return root;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1638 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1639
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1640 static int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1641 get_tc(const char *descriptor,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1642 int modid,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1643 int *tc_index,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1644 struct enum_list **ep,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1645 struct range_list **rp,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1646 char **hint)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1647 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1648 int i;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1649 struct tc *tcp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1650
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1651 i = get_tc_index(descriptor, modid);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1652 if (tc_index) *tc_index = i;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1653 if (i != -1)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1654 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1655 tcp = &tclist[i];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1656 if (ep) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1657 free_enums(ep);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1658 *ep = copy_enums(tcp->enums);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1659 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1660 if (rp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1661 free_ranges(rp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1662 *rp = copy_ranges(tcp->ranges);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1663 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1664 if (hint) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1665 if (*hint) free(*hint);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1666 *hint = (tcp->hint ? strdup(tcp->hint) : NULL);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1667 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1668 return tcp->type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1669 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1670 return LABEL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1671 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1672
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1673 /* return index into tclist of given TC descriptor
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1674 return -1 if not found
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1675 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1676 static int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1677 get_tc_index(const char *descriptor,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1678 int modid)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1679 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1680 int i;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1681 struct tc *tcp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1682 struct module *mp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1683 struct module_import *mip;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1684
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1685 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1686 * Check that the descriptor isn't imported
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1687 * by searching the import list
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1688 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1689
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1690 for ( mp = module_head ; mp ; mp = mp->next )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1691 if ( mp->modid == modid )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1692 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1693 if ( mp )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1694 for ( i=0, mip=mp->imports ; i < mp->no_imports ; ++i, ++mip ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1695 if ( !label_compare( mip->label, descriptor )) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1696 /* Found it - so amend the module ID */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1697 modid = mip->modid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1698 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1699 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1700 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1701
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1702
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1703 for(i=0, tcp=tclist; i < MAXTC; i++, tcp++){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1704 if (tcp->type == 0)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1705 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1706 if (!label_compare(descriptor, tcp->descriptor) &&
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1707 ((modid == tcp->modid) || (modid == -1))){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1708 return i;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1709 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1710 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1711 return -1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1712 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1713
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1714 /* translate integer tc_index to string identifier from tclist
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1715 *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1716 * Returns pointer to string in table (should not be modified) or NULL
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1717 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1718 const char *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1719 get_tc_descriptor(int tc_index)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1720 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1721 if (tc_index < 0 || tc_index >= MAXTC) return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1722 return (tclist[tc_index].descriptor);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1723 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1724
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1725
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1726 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1727 * Parses an enumeration list of the form:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1728 * { label(value) label(value) ... }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1729 * The initial { has already been parsed.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1730 * Returns NULL on error.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1731 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1732
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1733 static struct enum_list *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1734 parse_enumlist(FILE *fp, struct enum_list **retp)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1735 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1736 register int type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1737 char token [MAXTOKEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1738 struct enum_list *ep = NULL, **epp = &ep;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1739
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1740 free_enums(retp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1741
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1742 while((type = get_token(fp, token, MAXTOKEN)) != ENDOFFILE){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1743 if (type == RIGHTBRACKET)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1744 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1745 if (type == LABEL){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1746 /* this is an enumerated label */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1747 *epp = (struct enum_list *) calloc(1, sizeof(struct enum_list));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1748 if (*epp == NULL) return(NULL);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1749 /* a reasonable approximation for the length */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1750 (*epp)->label = strdup(token);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1751 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1752 if (type != LEFTPAREN) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1753 print_error("Expected \"(\"", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1754 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1755 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1756 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1757 if (type != NUMBER) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1758 print_error("Expected integer", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1759 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1760 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1761 (*epp)->value = atoi(token);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1762 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1763 if (type != RIGHTPAREN) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1764 print_error("Expected \")\"", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1765 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1766 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1767 epp = &(*epp)->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1768 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1769 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1770 if (type == ENDOFFILE){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1771 print_error("Expected \"}\"", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1772 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1773 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1774 *retp = ep;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1775 return ep;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1776 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1777
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1778 static struct range_list *parse_ranges(FILE *fp, struct range_list **retp)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1779 { int low, high;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1780 char nexttoken[MAXTOKEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1781 int nexttype;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1782 struct range_list *rp = NULL, **rpp = &rp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1783 int size = 0, taken = 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1784
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1785 free_ranges(retp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1786
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1787 nexttype = get_token(fp, nexttoken, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1788 if (nexttype == SIZE) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1789 size = 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1790 taken = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1791 nexttype = get_token(fp, nexttoken, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1792 if (nexttype != LEFTPAREN)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1793 print_error("Expected \"(\" after SIZE", nexttoken, nexttype);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1794 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1795
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1796 do {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1797 if (!taken) nexttype = get_token(fp, nexttoken, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1798 else taken = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1799 high = low = atol(nexttoken);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1800 nexttype = get_token(fp, nexttoken, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1801 if (nexttype == RANGE) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1802 nexttype = get_token(fp, nexttoken, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1803 high = atol(nexttoken);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1804 nexttype = get_token(fp, nexttoken, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1805 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1806 *rpp = (struct range_list *)calloc (1, sizeof(struct range_list));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1807 if (*rpp == NULL) break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1808 (*rpp)->low = low;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1809 (*rpp)->high = high;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1810 rpp = &(*rpp)->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1811
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1812 } while (nexttype == BAR);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1813 if (size) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1814 if (nexttype != RIGHTPAREN)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1815 print_error ("Expected \")\" after SIZE", nexttoken, nexttype);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1816 nexttype = get_token(fp, nexttoken, nexttype);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1817 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1818 if (nexttype != RIGHTPAREN)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1819 print_error ("Expected \")\"", nexttoken, nexttype);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1820
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1821 *retp = rp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1822 return rp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1823 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1824
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1825 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1826 * Parses an asn type. Structures are ignored by this parser.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1827 * Returns NULL on error.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1828 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1829 static struct node *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1830 parse_asntype(FILE *fp,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1831 char *name,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1832 int *ntype,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1833 char *ntoken)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1834 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1835 int type, i;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1836 char token[MAXTOKEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1837 char quoted_string_buffer[MAXQUOTESTR];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1838 char *hint = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1839 struct tc *tcp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1840 int level;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1841
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1842 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1843 if (type == SEQUENCE){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1844 level = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1845 while((type = get_token(fp, token, MAXTOKEN)) != ENDOFFILE){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1846 if (type == LEFTBRACKET){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1847 level++;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1848 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1849 else if (type == RIGHTBRACKET && --level == 0){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1850 *ntype = get_token(fp, ntoken, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1851 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1852 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1853 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1854 print_error("Expected \"}\"", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1855 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1856 } else if (type == LEFTBRACKET) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1857 struct node *np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1858 int ch_next = '{';
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1859 ungetc(ch_next, fp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1860 np = parse_objectid (fp, name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1861 if (np != NULL) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1862 *ntype = get_token(fp, ntoken, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1863 return np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1864 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1865 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1866 } else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1867 if (type == CONVENTION) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1868 while (type != SYNTAX && type != ENDOFFILE) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1869 if (type == DISPLAYHINT) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1870 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1871 if (type != QUOTESTRING) print_error("DISPLAY-HINT must be string", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1872 else hint = strdup (token);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1873 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1874 else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1875 type = get_token(fp, quoted_string_buffer, MAXQUOTESTR);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1876 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1877 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1878 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1879
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1880 if (type == LABEL)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1881 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1882 type = get_tc(token, current_module, NULL, NULL, NULL, NULL);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1883 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1884
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1885 /* textual convention */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1886 for(i = 0; i < MAXTC; i++){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1887 if (tclist[i].type == 0)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1888 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1889 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1890
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1891 if (i == MAXTC){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1892 print_error("Too many textual conventions", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1893 SNMP_FREE(hint);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1894 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1895 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1896 if (!(type & SYNTAX_MASK)){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1897 print_error("Textual convention doesn't map to real type", token,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1898 type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1899 SNMP_FREE(hint);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1900 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1901 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1902 tcp = &tclist[i];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1903 tcp->modid = current_module;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1904 tcp->descriptor = strdup(name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1905 tcp->hint = hint;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1906 tcp->type = type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1907 *ntype = get_token(fp, ntoken, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1908 if (*ntype == LEFTPAREN){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1909 tcp->ranges = parse_ranges(fp, &tcp->ranges);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1910 *ntype = get_token(fp, ntoken, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1911 } else if (*ntype == LEFTBRACKET) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1912 /* if there is an enumeration list, parse it */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1913 tcp->enums = parse_enumlist(fp, &tcp->enums);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1914 *ntype = get_token(fp, ntoken, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1915 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1916 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1917 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1918 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1919
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1920
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1921 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1922 * Parses an OBJECT TYPE macro.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1923 * Returns 0 on error.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1924 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1925 static struct node *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1926 parse_objecttype(FILE *fp,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1927 char *name)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1928 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1929 register int type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1930 char token[MAXTOKEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1931 char nexttoken[MAXTOKEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1932 char quoted_string_buffer[MAXQUOTESTR];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1933 int nexttype, tctype;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1934 register struct node *np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1935
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1936 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1937 if (type != SYNTAX){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1938 print_error("Bad format for OBJECT-TYPE", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1939 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1940 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1941 np = alloc_node(current_module);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1942 if (np == NULL) return(NULL);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1943 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1944 if (type == LABEL){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1945 int tmp_index;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1946 tctype = get_tc(token, current_module, &tmp_index,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1947 &np->enums, &np->ranges, &np->hint);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1948 if (tctype == LABEL &&
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1949 ds_get_int(DS_LIBRARY_ID, DS_LIB_MIB_WARNINGS) > 1){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1950 print_error("Warning: No known translation for type", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1951 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1952 type = tctype;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1953 np->tc_index = tmp_index; /* store TC for later reference */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1954 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1955 np->type = type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1956 nexttype = get_token(fp, nexttoken, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1957 switch(type){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1958 case SEQUENCE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1959 if (nexttype == OF){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1960 nexttype = get_token(fp, nexttoken, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1961 nexttype = get_token(fp, nexttoken, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1962 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1963 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1964 case INTEGER:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1965 case UINTEGER32:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1966 case COUNTER:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1967 case GAUGE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1968 case BITSTRING:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1969 case LABEL:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1970 if (nexttype == LEFTBRACKET) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1971 /* if there is an enumeration list, parse it */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1972 np->enums = parse_enumlist(fp, &np->enums);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1973 nexttype = get_token(fp, nexttoken, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1974 } else if (nexttype == LEFTPAREN){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1975 /* if there is a range list, parse it */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1976 np->ranges = parse_ranges(fp, &np->ranges);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1977 nexttype = get_token(fp, nexttoken, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1978 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1979 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1980 case OCTETSTR:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1981 case KW_OPAQUE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1982 /* parse any SIZE specification */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1983 if (nexttype == LEFTPAREN) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1984 nexttype = get_token(fp, nexttoken, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1985 if (nexttype == SIZE) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1986 nexttype = get_token(fp, nexttoken, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1987 if (nexttype == LEFTPAREN) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1988 np->ranges = parse_ranges(fp, &np->ranges);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1989 nexttype = get_token(fp, nexttoken, MAXTOKEN); /* ) */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1990 if (nexttype == RIGHTPAREN)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1991 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1992 nexttype = get_token(fp, nexttoken, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1993 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1994 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1995 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1996 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1997 print_error("Bad SIZE syntax", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1998 free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1999 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2000 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2001 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2002 case OBJID:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2003 case NETADDR:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2004 case IPADDR:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2005 case TIMETICKS:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2006 case NUL:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2007 case NSAPADDRESS:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2008 case COUNTER64:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2009 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2010 default:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2011 print_error("Bad syntax", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2012 free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2013 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2014 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2015 if (nexttype == UNITS){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2016 type = get_token(fp, quoted_string_buffer, MAXQUOTESTR);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2017 if (type != QUOTESTRING) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2018 print_error("Bad UNITS", quoted_string_buffer, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2019 free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2020 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2021 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2022 np->units = strdup (quoted_string_buffer);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2023 nexttype = get_token(fp, nexttoken, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2024 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2025 if (nexttype != ACCESS){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2026 print_error("Should be ACCESS", nexttoken, nexttype);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2027 free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2028 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2029 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2030 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2031 if (type != READONLY && type != READWRITE && type != WRITEONLY
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2032 && type != NOACCESS && type != READCREATE && type != ACCNOTIFY){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2033 print_error("Bad ACCESS type", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2034 free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2035 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2036 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2037 np->access = type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2038 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2039 if (type != STATUS){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2040 print_error("Should be STATUS", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2041 free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2042 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2043 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2044 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2045 if (type != MANDATORY && type != CURRENT && type != KW_OPTIONAL &&
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2046 type != OBSOLETE && type != DEPRECATED){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2047 print_error("Bad STATUS", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2048 free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2049 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2050 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2051 np->status = type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2052 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2053 * Optional parts of the OBJECT-TYPE macro
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2054 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2055 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2056 while (type != EQUALS && type != ENDOFFILE) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2057 switch (type) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2058 case DESCRIPTION:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2059 type = get_token(fp, quoted_string_buffer, MAXQUOTESTR);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2060 if (type != QUOTESTRING) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2061 print_error("Bad DESCRIPTION", quoted_string_buffer, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2062 free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2063 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2064 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2065 if (ds_get_boolean(DS_LIBRARY_ID, DS_LIB_SAVE_MIB_DESCRS)) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2066 np->description = strdup (quoted_string_buffer);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2067 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2068 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2069
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2070 case REFERENCE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2071 type = get_token(fp, quoted_string_buffer, MAXQUOTESTR);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2072 if (type != QUOTESTRING) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2073 print_error("Bad REFERENCE", quoted_string_buffer, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2074 free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2075 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2076 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2077 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2078 case INDEX:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2079 np->indexes = getIndexes(fp, &np->indexes);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2080 if (np->indexes == NULL) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2081 print_error("Bad Index List",token,type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2082 free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2083 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2084 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2085 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2086
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2087 case DEFVAL:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2088 case AUGMENTS:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2089 case NUM_ENTRIES:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2090 if (tossObjectIdentifier(fp) != OBJID) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2091 print_error("Bad Object Identifier", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2092 free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2093 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2094 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2095 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2096
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2097 default:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2098 print_error("Bad format of optional clauses", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2099 free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2100 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2101
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2102 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2103 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2104 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2105 if (type != EQUALS){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2106 print_error("Bad format", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2107 free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2108 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2109 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2110 return merge_parse_objectid(np, fp, name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2111 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2112
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2113 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2114 * Parses an OBJECT GROUP macro.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2115 * Returns 0 on error.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2116 *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2117 * Also parses object-identity, since they are similar (ignore STATUS).
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2118 * - WJH 10/96
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2119 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2120 static struct node *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2121 parse_objectgroup(FILE *fp,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2122 char *name)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2123 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2124 register int type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2125 char token[MAXTOKEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2126 char quoted_string_buffer[MAXQUOTESTR];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2127 register struct node *np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2128
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2129 np = alloc_node(current_module);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2130 if (np == NULL) return(NULL);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2131 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2132 while (type != EQUALS && type != ENDOFFILE) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2133 switch (type) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2134 case DESCRIPTION:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2135 type = get_token(fp, quoted_string_buffer, MAXQUOTESTR);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2136 if (type != QUOTESTRING) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2137 print_error("Bad DESCRIPTION", quoted_string_buffer, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2138 free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2139 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2140 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2141 if (ds_get_boolean(DS_LIBRARY_ID, DS_LIB_SAVE_MIB_DESCRS)) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2142 np->description = strdup (quoted_string_buffer);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2143 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2144 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2145
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2146 case REFERENCE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2147 type = get_token(fp, quoted_string_buffer, MAXQUOTESTR);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2148 if (type != QUOTESTRING) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2149 print_error("Bad REFERENCE", quoted_string_buffer, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2150 free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2151 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2152 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2153 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2154
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2155 default:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2156 /* NOTHING */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2157 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2158 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2159 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2160 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2161 return merge_parse_objectid(np, fp, name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2162 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2163
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2164 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2165 * Parses a NOTIFICATION-TYPE macro.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2166 * Returns 0 on error.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2167 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2168 static struct node *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2169 parse_notificationDefinition(FILE *fp,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2170 char *name)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2171 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2172 register int type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2173 char token[MAXTOKEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2174 char quoted_string_buffer[MAXQUOTESTR];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2175 register struct node *np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2176
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2177 np = alloc_node(current_module);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2178 if (np == NULL) return(NULL);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2179 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2180 while (type != EQUALS && type != ENDOFFILE) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2181 switch (type) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2182 case DESCRIPTION:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2183 type = get_token(fp, quoted_string_buffer, MAXQUOTESTR);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2184 if (type != QUOTESTRING) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2185 print_error("Bad DESCRIPTION", quoted_string_buffer, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2186 free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2187 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2188 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2189 if (ds_get_boolean(DS_LIBRARY_ID, DS_LIB_SAVE_MIB_DESCRS)) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2190 np->description = strdup (quoted_string_buffer);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2191 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2192 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2193
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2194 default:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2195 /* NOTHING */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2196 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2197 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2198 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2199 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2200 return merge_parse_objectid(np, fp, name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2201 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2202
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2203 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2204 * Parses a TRAP-TYPE macro.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2205 * Returns 0 on error.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2206 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2207 static struct node *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2208 parse_trapDefinition(FILE *fp,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2209 char *name)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2210 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2211 register int type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2212 char token[MAXTOKEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2213 char quoted_string_buffer[MAXQUOTESTR];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2214 register struct node *np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2215
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2216 np = alloc_node(current_module);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2217 if (np == NULL) return(NULL);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2218 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2219 while (type != EQUALS && type != ENDOFFILE) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2220 switch (type) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2221 case DESCRIPTION:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2222 type = get_token(fp, quoted_string_buffer, MAXQUOTESTR);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2223 if (type != QUOTESTRING) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2224 print_error("Bad DESCRIPTION", quoted_string_buffer, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2225 free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2226 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2227 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2228 if (ds_get_boolean(DS_LIBRARY_ID, DS_LIB_SAVE_MIB_DESCRS)) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2229 np->description = strdup (quoted_string_buffer);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2230 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2231 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2232 case ENTERPRISE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2233 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2234 if (type == LEFTBRACKET) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2235 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2236 if (type != LABEL) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2237 print_error("Bad Trap Format", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2238 free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2239 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2240 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2241 np->parent = strdup(token);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2242 /* Get right bracket */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2243 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2244 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2245 else if (type == LABEL)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2246 np->parent = strdup(token);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2247 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2248 default:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2249 /* NOTHING */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2250 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2251 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2252 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2253 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2254 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2255
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2256 np->label = strdup(name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2257
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2258 if (type != NUMBER) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2259 print_error("Expected a Number", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2260 free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2261 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2262 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2263 np->subid = atoi(token);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2264 np->next = alloc_node(current_module);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2265 if (np->next == NULL) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2266 free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2267 return(NULL);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2268 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2269 np->next->parent = np->parent;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2270 np->parent = (char *)malloc(strlen(np->parent)+2);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2271 if (np->parent == NULL) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2272 free_node(np->next); free_node(np);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2273 return(NULL);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2274 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2275 strcpy(np->parent, np->next->parent);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2276 strcat(np->parent, "#");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2277 np->next->label = strdup(np->parent);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2278 return np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2279 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2280
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2281
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2282 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2283 * Parses a compliance macro
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2284 * Returns 0 on error.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2285 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2286 static struct node *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2287 parse_compliance(FILE *fp,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2288 char *name)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2289 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2290 register int type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2291 char token[MAXTOKEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2292 char quoted_string_buffer[MAXQUOTESTR];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2293 register struct node *np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2294
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2295 np = alloc_node(current_module);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2296 if (np == NULL) return(NULL);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2297 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2298 while (type != EQUALS && type != ENDOFFILE) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2299 type = get_token(fp, quoted_string_buffer, MAXQUOTESTR);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2300 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2301 return merge_parse_objectid(np, fp, name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2302 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2303
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2304
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2305 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2306 * Parses a capabilities macro
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2307 * Returns 0 on error.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2308 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2309 static struct node *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2310 parse_capabilities(FILE *fp,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2311 char *name)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2312 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2313 register int type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2314 char token[MAXTOKEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2315 char quoted_string_buffer[MAXQUOTESTR];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2316 register struct node *np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2317
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2318 np = alloc_node(current_module);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2319 if (np == NULL) return(NULL);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2320 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2321 while (type != EQUALS && type != ENDOFFILE) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2322 type = get_token(fp, quoted_string_buffer, MAXQUOTESTR);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2323 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2324 return merge_parse_objectid(np, fp, name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2325 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2326
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2327 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2328 * Parses a module identity macro
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2329 * Returns 0 on error.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2330 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2331 static struct node *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2332 parse_moduleIdentity(FILE *fp,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2333 char *name)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2334 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2335 register int type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2336 char token[MAXTOKEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2337 char quoted_string_buffer[MAXQUOTESTR];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2338 register struct node *np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2339
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2340 np = alloc_node(current_module);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2341 if (np == NULL) return(NULL);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2342 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2343 while (type != EQUALS && type != ENDOFFILE) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2344 type = get_token(fp, quoted_string_buffer, MAXQUOTESTR);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2345 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2346 return merge_parse_objectid(np, fp, name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2347 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2348
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2349
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2350 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2351 * Parses a MACRO definition
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2352 * Expect BEGIN, discard everything to end.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2353 * Returns 0 on error.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2354 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2355 static struct node *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2356 parse_macro(FILE *fp,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2357 char *name)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2358 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2359 register int type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2360 char token[MAXTOKEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2361 struct node *np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2362 int iLine = Line;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2363
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2364 np = alloc_node(current_module);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2365 if (np == NULL) return(NULL);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2366 type = get_token(fp, token, sizeof(token));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2367 while (type != EQUALS && type != ENDOFFILE) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2368 type = get_token(fp, token, sizeof(token));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2369 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2370 if (type != EQUALS) return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2371 while (type != BEGIN && type != ENDOFFILE) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2372 type = get_token(fp, token, sizeof(token));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2373 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2374 if (type != BEGIN) return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2375 while (type != END && type != ENDOFFILE) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2376 type = get_token(fp, token, sizeof(token));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2377 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2378 if (type != END) return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2379
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2380 if (ds_get_int(DS_LIBRARY_ID, DS_LIB_MIB_WARNINGS))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2381 snmp_log(LOG_WARNING,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2382 "%s MACRO (lines %d..%d parsed and ignored).\n", name, iLine, Line);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2383
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2384 return np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2385 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2386
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2387 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2388 * Parses a module import clause
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2389 * loading any modules referenced
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2390 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2391 static void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2392 parse_imports(FILE *fp)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2393 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2394 register int type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2395 char token[MAXTOKEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2396 char modbuf[256];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2397 #define MAX_IMPORTS 256
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2398 struct module_import import_list[MAX_IMPORTS];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2399 int this_module, old_current_module;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2400 const char *old_File;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2401 int old_line;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2402 struct module *mp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2403
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2404 int import_count=0; /* Total number of imported descriptors */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2405 int i=0, old_i; /* index of first import from each module */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2406
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2407 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2408
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2409 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2410 * Parse the IMPORTS clause
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2411 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2412 while (type != SEMI && type != ENDOFFILE) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2413 if (type == LABEL ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2414 if (import_count == MAX_IMPORTS ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2415 print_error("Too many imported symbols", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2416 do {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2417 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2418 } while (type != SEMI && type != ENDOFFILE);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2419 return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2420 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2421 import_list[import_count++].label = strdup(token);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2422 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2423 else if ( type == FROM ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2424 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2425 if ( import_count == i ) { /* All imports are handled internally */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2426 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2427 continue;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2428 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2429 this_module = which_module(token);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2430
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2431 for ( old_i=i ; i<import_count ; ++i)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2432 import_list[i].modid = this_module;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2433
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2434 old_current_module = current_module; /* Save state */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2435 old_File = File;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2436 old_line = Line;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2437 current_module = this_module;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2438
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2439 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2440 * Recursively read any pre-requisite modules
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2441 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2442 if (read_module_internal(token) == MODULE_NOT_FOUND ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2443 for ( ; old_i<import_count ; ++old_i ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2444 read_import_replacements( token, &import_list[old_i]);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2445 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2446 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2447
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2448 current_module = old_current_module; /* Restore state */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2449 File = old_File;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2450 Line = old_line;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2451 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2452 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2453 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2454
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2455 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2456 * Save the import information
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2457 * in the global module table
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2458 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2459 for ( mp=module_head ; mp ; mp=mp->next )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2460 if ( mp->modid == current_module) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2461 if ( import_count == 0)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2462 return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2463 if (mp->imports && (mp->imports != root_imports))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2464 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2465 /* this can happen if all modules are in one source file. */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2466 for ( i=0 ; i<mp->no_imports; ++i ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2467 DEBUGMSGTL(("parse-mibs", "#### freeing Module %d '%s' %d\n",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2468 mp->modid, mp->imports[i].label, mp->imports[i].modid));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2469 free((char *)mp->imports[i].label);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2470 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2471 free((char*)mp->imports);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2472 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2473 mp->imports = (struct module_import *)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2474 calloc(import_count, sizeof(struct module_import));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2475 if (mp->imports == NULL) return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2476 for ( i=0 ; i<import_count ; ++i ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2477 mp->imports[i].label = import_list[i].label;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2478 mp->imports[i].modid = import_list[i].modid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2479 DEBUGMSGTL(("parse-mibs", "#### adding Module %d '%s' %d\n",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2480 mp->modid, mp->imports[i].label, mp->imports[i].modid));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2481 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2482 mp->no_imports = import_count;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2483 return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2484 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2485
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2486 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2487 * Shouldn't get this far
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2488 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2489 print_module_not_found(module_name(current_module,modbuf));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2490 return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2491 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2492
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2493
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2494
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2495 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2496 * MIB module handling routines
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2497 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2498
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2499 static void dump_module_list (void)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2500 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2501 struct module *mp = module_head;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2502
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2503 DEBUGMSGTL(("parse-mibs", "Module list:\n"));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2504 while (mp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2505 DEBUGMSGTL(("parse-mibs", " %s %d %s %d\n", mp->name, mp->modid, mp->file, mp->no_imports));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2506 mp = mp->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2507 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2508 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2509
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2510 int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2511 which_module(const char *name)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2512 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2513 struct module *mp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2514
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2515 for ( mp=module_head ; mp ; mp=mp->next )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2516 if ( !label_compare(mp->name, name))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2517 return(mp->modid);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2518
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2519 DEBUGMSGTL(("parse-mibs", "Module %s not found\n", name));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2520 return(-1);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2521 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2522
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2523 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2524 * module_name - copy module name to user buffer, return ptr to same.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2525 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2526 char *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2527 module_name (int modid,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2528 char *cp)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2529 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2530 struct module *mp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2531
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2532 for ( mp=module_head ; mp ; mp=mp->next )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2533 if ( mp->modid == modid )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2534 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2535 strcpy(cp, mp->name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2536 return(cp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2537 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2538
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2539 DEBUGMSGTL(("parse-mibs", "Module %d not found\n", modid));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2540 sprintf(cp, "#%d", modid);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2541 return(cp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2542 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2543
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2544 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2545 * Backwards compatability
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2546 * Read newer modules that replace the one specified:-
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2547 * either all of them (read_module_replacements),
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2548 * or those relating to a specified identifier (read_import_replacements)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2549 * plus an interface to add new replacement requirements
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2550 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2551 void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2552 add_module_replacement(const char *old_module,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2553 const char *new_module_name,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2554 const char *tag,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2555 int len)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2556 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2557 struct module_compatability *mcp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2558
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2559 mcp = (struct module_compatability *)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2560 calloc(1, sizeof( struct module_compatability));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2561 if (mcp == NULL) return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2562
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2563 mcp->old_module = strdup( old_module );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2564 mcp->new_module = strdup( new_module_name );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2565 if (tag)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2566 mcp->tag = strdup( tag );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2567 mcp->tag_len = len;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2568
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2569 mcp->next = module_map_head;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2570 module_map_head = mcp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2571 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2572
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2573 static void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2574 read_module_replacements(const char *name)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2575 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2576 struct module_compatability *mcp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2577
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2578 for ( mcp=module_map_head ; mcp; mcp=mcp->next ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2579 if ( !label_compare( mcp->old_module, name )) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2580 if (ds_get_int(DS_LIBRARY_ID, DS_LIB_MIB_WARNINGS))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2581 snmp_log(LOG_WARNING,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2582 "Loading replacement module %s for %s (%s)\n",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2583 mcp->new_module, name, File);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2584 (void)read_module( mcp->new_module );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2585 return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2586 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2587 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2588 if (!ds_get_boolean(DS_LIBRARY_ID, DS_LIB_MIB_ERRORS))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2589 print_module_not_found(name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2590
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2591 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2592
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2593 static void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2594 read_import_replacements(const char *old_module_name,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2595 struct module_import *identifier)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2596 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2597 struct module_compatability *mcp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2598
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2599 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2600 * Look for matches first
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2601 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2602 for ( mcp=module_map_head ; mcp; mcp=mcp->next ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2603 if ( !label_compare( mcp->old_module, old_module_name )) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2604
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2605 if ( /* exact match */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2606 ( mcp->tag_len==0 &&
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2607 (mcp->tag == NULL ||
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2608 !label_compare( mcp->tag, identifier->label ))) ||
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2609 /* prefix match */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2610 ( mcp->tag_len!=0 &&
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2611 !strncmp( mcp->tag, identifier->label, mcp->tag_len ))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2612 ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2613
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2614 if (ds_get_int(DS_LIBRARY_ID, DS_LIB_MIB_WARNINGS))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2615 snmp_log(LOG_WARNING,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2616 "Importing %s from replacement module %s instead of %s (%s)\n",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2617 identifier->label, mcp->new_module, old_module_name, File);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2618 (void)read_module( mcp->new_module );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2619 identifier->modid = which_module(mcp->new_module);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2620 return; /* finished! */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2621 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2622 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2623 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2624
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2625 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2626 * If no exact match, load everything relevant
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2627 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2628 read_module_replacements( old_module_name );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2629 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2630
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2631
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2632 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2633 * Read in the named module
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2634 * Returns the root of the whole tree
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2635 * (by analogy with 'read_mib')
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2636 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2637 static int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2638 read_module_internal (const char *name)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2639 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2640 struct module *mp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2641 FILE *fp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2642 struct node *np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2643
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2644 if ( tree_head == NULL )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2645 init_mib_internals(); /* was init_mib */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2646
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2647 for ( mp=module_head ; mp ; mp=mp->next )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2648 if ( !label_compare(mp->name, name)) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2649 const char *oldFile = File;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2650 int oldLine = Line;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2651
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2652 if ( mp->no_imports != -1 ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2653 DEBUGMSGTL(("parse-mibs", "Module %s already loaded\n", name));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2654 return MODULE_ALREADY_LOADED;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2655 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2656 if ((fp = fopen(mp->file, "r")) == NULL) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2657 snmp_log_perror(mp->file);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2658 return MODULE_LOAD_FAILED;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2659 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2660 mp->no_imports=0; /* Note that we've read the file */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2661 File = mp->file;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2662 Line = 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2663 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2664 * Parse the file
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2665 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2666 np = parse( fp, NULL );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2667 fclose(fp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2668 File = oldFile;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2669 Line = oldLine;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2670 return MODULE_LOADED_OK;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2671 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2672
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2673 if (ds_get_int(DS_LIBRARY_ID, DS_LIB_MIB_WARNINGS) > 1)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2674 snmp_log(LOG_WARNING, "Module %s not found\n", name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2675 return MODULE_NOT_FOUND;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2676 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2677
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2678 void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2679 adopt_orphans (void)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2680 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2681 struct node *np, *onp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2682 struct tree *tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2683 int i, adopted;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2684
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2685 if ( !orphan_nodes )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2686 return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2687 init_node_hash(orphan_nodes);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2688 orphan_nodes = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2689
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2690 while (1) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2691 adopted = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2692 for ( i = 0; i < NHASHSIZE; i++)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2693 if ( nbuckets[i] ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2694 for ( np = nbuckets[i] ; np!= NULL ; np=np->next )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2695 tp = find_tree_node( np->parent, -1 );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2696 if ( tp ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2697 do_subtree( tp, &np );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2698 adopted = 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2699 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2700 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2701 if ( adopted == 0 )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2702 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2703 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2704
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2705 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2706 * Report on outstanding orphans
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2707 * and link them back into the orphan list
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2708 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2709 for (i = 0; i < NHASHSIZE; i++)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2710 if ( nbuckets[i] ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2711 if ( orphan_nodes )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2712 onp = np->next = nbuckets[i];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2713 else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2714 onp = orphan_nodes = nbuckets[i];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2715 nbuckets[i] = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2716 while (onp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2717 char modbuf[256];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2718 snmp_log (LOG_WARNING,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2719 "Unlinked OID in %s: %s ::= { %s %ld }\n",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2720 module_name(onp->modid, modbuf),
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2721 (onp->label ? onp->label : "<no label>"),
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2722 (onp->parent ? onp->parent : "<no parent>"),
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2723 onp->subid);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2724
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2725 np = onp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2726 onp = onp->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2727 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2728 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2729 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2730
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2731 struct tree *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2732 read_module(const char *name)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2733 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2734 if ( read_module_internal(name) == MODULE_NOT_FOUND )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2735 read_module_replacements( name );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2736 return tree_head;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2737 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2738
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2739 void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2740 unload_module_by_ID( int modID, struct tree *tree_top )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2741 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2742 struct tree *tp, *prev, *next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2743 int i;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2744
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2745 prev = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2746 for ( tp=tree_top ; tp ; tp=next ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2747 next = tp->next_peer;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2748 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2749 * This next section looks rather complex.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2750 * Essentially, this is equivalent to the code fragment:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2751 * if (tp->modID = modID)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2752 * tp->number_modules--;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2753 * but handles one tree node being part of several modules.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2754 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2755 for ( i=0 ; i<tp->number_modules ; i++ ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2756 if ( tp->module_list[i] == modID ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2757 tp->number_modules--;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2758 switch ( tp->number_modules ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2759
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2760 case 0: /* That was the only module */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2761 tp->modid = -1; /* Mark as unused */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2762 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2763
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2764 case 1: /* We did have a list of two, but this is no
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2765 longer needed. Transfer the other entry
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2766 ( i.e. module_list[1-i] - think about it! )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2767 to the 'single' slot tp->modid, and discard
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2768 the list.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2769 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2770 tp->modid = tp->module_list[1-i];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2771 free(tp->module_list);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2772 tp->module_list = NULL; /* let's be tidy */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2773 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2774
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2775 default: /* We still need the list, so shuffle down
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2776 all following entries to close up the gap */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2777 while ( i < tp->number_modules ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2778 tp->module_list[i] = tp->module_list[i+1];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2779 i++;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2780 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2781 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2782 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2783 break; /* Don't need to look through the rest of the list */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2784 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2785 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2786
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2787 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2788 * OK - that's dealt with *this* node.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2789 * Now let's look at the children.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2790 * (Isn't recursion wonderful!)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2791 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2792 if ( tp->child_list )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2793 unload_module_by_ID( modID, tp->child_list );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2794
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2795
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2796 if ( tp->number_modules == 0 ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2797 /* This node isn't needed any more (except perhaps
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2798 for the sake of the children) */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2799 if ( tp->child_list == NULL ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2800 if ( prev )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2801 prev->next_peer = tp->next_peer;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2802 else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2803 tp->parent->child_list = tp->next_peer;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2804 free_tree( tp );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2805 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2806 else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2807 free_partial_tree( tp, TRUE );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2808 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2809 else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2810 prev = tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2811 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2812 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2813
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2814 int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2815 unload_module(const char *name)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2816 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2817 struct module *mp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2818 int modID = -1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2819
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2820 for ( mp=module_head ; mp ; mp=mp->next )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2821 if ( !label_compare(mp->name, name)) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2822 modID = mp->modid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2823 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2824 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2825
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2826 if ( modID == -1 ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2827 DEBUGMSGTL(("unload-mib", "Module %s not found to unload\n", name));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2828 return MODULE_NOT_FOUND;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2829 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2830 unload_module_by_ID( modID, tree_head );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2831 mp->no_imports = -1; /* mark as unloaded */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2832 return MODULE_LOADED_OK; /* Well, you know what I mean! */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2833 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2834
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2835 static void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2836 new_module (const char *name,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2837 const char *file)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2838 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2839 struct module *mp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2840
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2841 for ( mp=module_head ; mp ; mp=mp->next )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2842 if ( !label_compare(mp->name, name)) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2843 DEBUGMSGTL(("parse-mibs", "Module %s already noted\n", name));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2844 /* Not the same file */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2845 if (label_compare(mp->file, file)) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2846 if (ds_get_int(DS_LIBRARY_ID, DS_LIB_MIB_WARNINGS))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2847 snmp_log(LOG_WARNING,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2848 "Warning: Module %s was in %s now is %s\n",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2849 name, mp->file, file);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2850
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2851 /* Use the new one in preference */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2852 free(mp->file);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2853 mp->file = strdup(file);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2854 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2855 return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2856 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2857
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2858 /* Add this module to the list */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2859 DEBUGMSGTL(("parse-mibs", " Module %d %s is in %s\n", max_module, name, file));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2860 mp = (struct module *) calloc(1, sizeof(struct module));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2861 if (mp == NULL) return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2862 mp->name = strdup(name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2863 mp->file = strdup(file);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2864 mp->imports = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2865 mp->no_imports = -1; /* Not yet loaded */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2866 mp->modid = max_module;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2867 ++max_module;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2868
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2869 mp->next = module_head; /* Or add to the *end* of the list? */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2870 module_head = mp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2871 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2872
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2873
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2874
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2875
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2876 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2877 * Parses a mib file and returns a linked list of nodes found in the file.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2878 * Returns NULL on error.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2879 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2880 static struct node *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2881 parse(FILE *fp,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2882 struct node *root)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2883 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2884 char token[MAXTOKEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2885 char name[MAXTOKEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2886 int type = LABEL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2887 int lasttype = LABEL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2888
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2889 #define BETWEEN_MIBS 1
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2890 #define IN_MIB 2
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2891 int state = BETWEEN_MIBS;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2892 struct node *np, *nnp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2893
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2894 DEBUGMSGTL(("parse-file", "Parsing file: %s...\n", File));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2895
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2896 if (last_err_module) free(last_err_module); last_err_module = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2897
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2898 np = root;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2899 if (np != NULL) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2900 /* now find end of chain */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2901 while(np->next)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2902 np = np->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2903 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2904
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2905 while (type != ENDOFFILE){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2906 if (lasttype == CONTINUE) lasttype = type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2907 else type = lasttype = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2908
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2909 switch (type) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2910 case END:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2911 if (state != IN_MIB){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2912 print_error("Error, END before start of MIB", NULL, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2913 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2914 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2915 else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2916 struct module *mp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2917 #ifdef TEST
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2918 printf("\nNodes for Module %s:\n", name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2919 print_nodes( stdout, np );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2920 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2921 for (mp = module_head; mp; mp = mp->next)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2922 if (mp->modid == current_module) break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2923 do_linkup(mp, root);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2924 np = root = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2925 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2926 state = BETWEEN_MIBS;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2927 #ifdef TEST
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2928 if (ds_get_int(DS_LIBRARY_ID, DS_LIB_MIB_WARNINGS))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2929 xmalloc_stats (stderr);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2930 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2931 continue;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2932 case IMPORTS:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2933 parse_imports( fp );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2934 continue;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2935 case EXPORTS:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2936 while (type != SEMI && type != ENDOFFILE)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2937 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2938 continue;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2939 case LABEL:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2940 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2941 case ENDOFFILE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2942 continue;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2943 default:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2944 strcpy(name, token);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2945 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2946 nnp = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2947 if (type == MACRO) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2948 nnp = parse_macro(fp, name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2949 if (nnp == NULL){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2950 print_error("Bad parse of MACRO", NULL, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2951 /*return NULL;*/
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2952 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2953 free_node(nnp); /* IGNORE */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2954 nnp = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2955 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2956 else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2957 print_error(name, "is a reserved word", lasttype);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2958 continue; /* see if we can parse the rest of the file */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2959 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2960 strcpy(name, token);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2961 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2962 nnp = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2963
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2964 /* Handle obsolete method to assign an object identifier to a
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2965 module*/
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2966 if (lasttype == LABEL && type == LEFTBRACKET) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2967 while (type != RIGHTBRACKET && type != ENDOFFILE)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2968 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2969 if (type == ENDOFFILE){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2970 print_error("Expected \"}\"", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2971 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2972 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2973 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2974 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2975
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2976 switch (type) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2977 case DEFINITIONS:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2978 if (state != BETWEEN_MIBS){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2979 print_error("Error, nested MIBS", NULL, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2980 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2981 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2982 state = IN_MIB;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2983 current_module = which_module( name );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2984 if ( current_module == -1 ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2985 new_module(name, File);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2986 current_module = which_module(name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2987 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2988 DEBUGMSGTL(("parse-mibs", "Parsing MIB: %d %s\n", current_module, name));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2989 while ((type = get_token (fp, token, MAXTOKEN)) != ENDOFFILE)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2990 if (type == BEGIN) break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2991 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2992 case OBJTYPE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2993 nnp = parse_objecttype(fp, name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2994 if (nnp == NULL){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2995 print_error("Bad parse of OBJECT-TYPE", NULL, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2996 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2997 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2998 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2999 case OBJGROUP:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3000 nnp = parse_objectgroup(fp, name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3001 if (nnp == NULL){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3002 print_error("Bad parse of OBJECT-GROUP", NULL, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3003 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3004 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3005 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3006 case TRAPTYPE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3007 nnp = parse_trapDefinition(fp, name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3008 if (nnp == NULL){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3009 print_error("Bad parse of TRAP-TYPE", NULL, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3010 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3011 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3012 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3013 case NOTIFTYPE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3014 nnp = parse_notificationDefinition(fp, name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3015 if (nnp == NULL){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3016 print_error("Bad parse of NOTIFICATION-TYPE", NULL, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3017 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3018 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3019 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3020 case COMPLIANCE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3021 nnp = parse_compliance(fp, name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3022 if (nnp == NULL){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3023 print_error("Bad parse of MODULE-COMPLIANCE", NULL, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3024 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3025 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3026 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3027 case CAPABILITIES:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3028 nnp = parse_capabilities(fp, name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3029 if (nnp == NULL){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3030 print_error("Bad parse of AGENT-CAPABILITIES", NULL, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3031 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3032 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3033 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3034 case MACRO:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3035 nnp = parse_macro(fp, name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3036 if (nnp == NULL){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3037 print_error("Bad parse of MACRO", NULL, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3038 /*return NULL;*/
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3039 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3040 free_node(nnp); /* IGNORE */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3041 nnp = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3042 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3043 case MODULEIDENTITY:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3044 nnp = parse_moduleIdentity(fp, name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3045 if (nnp == NULL){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3046 print_error("Bad parse of MODULE-IDENTITY", NULL, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3047 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3048 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3049 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3050 case OBJID:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3051 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3052 if (type != EQUALS){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3053 print_error("Expected \"::=\"", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3054 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3055 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3056 nnp = parse_objectid(fp, name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3057 if (nnp == NULL){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3058 print_error("Bad parse of OBJECT IDENTIFIER", NULL, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3059 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3060 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3061 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3062 case EQUALS:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3063 nnp = parse_asntype(fp, name, &type, token);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3064 lasttype = CONTINUE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3065 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3066 case ENDOFFILE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3067 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3068 default:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3069 print_error("Bad operator", token, type);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3070 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3071 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3072 if (nnp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3073 if (np) np->next = nnp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3074 else np = root = nnp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3075 while (np->next) np = np->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3076 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3077 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3078 DEBUGMSGTL(("parse-file", "End of file (%s)\n", File));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3079 return root;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3080 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3081
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3082 /* return zero if character is not a label character. */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3083 static int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3084 is_labelchar (int ich)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3085 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3086 if ((isalnum(ich)) || (ich == '-'))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3087 return 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3088 if (ich == '_' && ds_get_boolean(DS_LIBRARY_ID, DS_LIB_MIB_PARSE_LABEL))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3089 return 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3090
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3091 return 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3092 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3093
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3094 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3095 * Parses a token from the file. The type of the token parsed is returned,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3096 * and the text is placed in the string pointed to by token.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3097 * Warning: this method may recurse.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3098 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3099 static int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3100 get_token(FILE *fp,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3101 char *token,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3102 int maxtlen)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3103 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3104 register int ch, ch_next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3105 register char *cp = token;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3106 register int hash = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3107 register struct tok *tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3108 int too_long = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3109
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3110 /* skip all white space */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3111 do {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3112 ch = getc(fp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3113 if (ch == '\n')
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3114 Line++;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3115 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3116 while(isspace(ch) && ch != EOF);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3117 *cp++ = ch; *cp = '\0';
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3118 switch (ch) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3119 case EOF:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3120 return ENDOFFILE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3121 case '"':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3122 return parseQuoteString(fp, token, maxtlen);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3123 case '\'': /* binary or hex constant */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3124 while ((ch = getc(fp)) != EOF && ch != '\'' && cp-token < maxtlen-2)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3125 *cp++ = ch;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3126 if (ch == '\'') {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3127 unsigned long val = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3128 *cp++ = '\'';
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3129 *cp++ = ch = getc(fp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3130 *cp = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3131 cp = token+1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3132 switch (ch) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3133 case EOF:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3134 return ENDOFFILE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3135 case 'b':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3136 case 'B':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3137 while ((ch = *cp++) != '\'')
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3138 if (ch != '0' && ch != '1') return LABEL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3139 else val = val * 2 + ch - '0';
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3140 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3141 case 'h':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3142 case 'H':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3143 while ((ch = *cp++) != '\'')
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3144 if ('0' <= ch && ch <= '9') val = val*16+ch-'0';
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3145 else if ('a' <= ch && ch <= 'f') val = val*16+ch-'a'+10;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3146 else if ('A' <= ch && ch <= 'F') val = val*16+ch-'A'+10;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3147 else return LABEL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3148 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3149 default:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3150 return LABEL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3151 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3152 sprintf(token, "%ld", val);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3153 return NUMBER;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3154 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3155 else return LABEL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3156 case '(':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3157 return LEFTPAREN;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3158 case ')':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3159 return RIGHTPAREN;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3160 case '{':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3161 return LEFTBRACKET;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3162 case '}':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3163 return RIGHTBRACKET;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3164 case ';':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3165 return SEMI;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3166 case ',':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3167 return COMMA;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3168 case '|':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3169 return BAR;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3170 case '.':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3171 ch_next = getc(fp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3172 if (ch_next == '.') return RANGE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3173 ungetc(ch_next, fp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3174 return LABEL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3175 case ':':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3176 ch_next = getc(fp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3177 if (ch_next != ':') {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3178 ungetc(ch_next, fp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3179 return LABEL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3180 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3181 ch_next = getc(fp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3182 if (ch_next != '=') {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3183 ungetc(ch_next, fp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3184 return LABEL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3185 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3186 return EQUALS;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3187 case '-':
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3188 ch_next = getc(fp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3189 if (ch_next == '-') {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3190 if (ds_get_boolean(DS_LIBRARY_ID, DS_LIB_MIB_COMMENT_TERM)) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3191 /* Treat the rest of this line as a comment. */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3192 while ((ch_next != EOF) && (ch_next != '\n'))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3193 ch_next = getc(fp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3194 } else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3195 /* Treat the rest of the line or until another '--' as a comment */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3196 /* (this is the "technically" correct way to parse comments) */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3197 ch = ' ';
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3198 ch_next = getc(fp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3199 while (ch_next != EOF && ch_next != '\n' &&
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3200 (ch != '-' || ch_next != '-')) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3201 ch = ch_next; ch_next = getc(fp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3202 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3203 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3204 if (ch_next == EOF) return ENDOFFILE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3205 if (ch_next == '\n') Line++;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3206 return get_token (fp, token, maxtlen);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3207 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3208 ungetc(ch_next, fp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3209 default:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3210 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3211 * Accumulate characters until end of token is found. Then attempt to
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3212 * match this token as a reserved word. If a match is found, return the
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3213 * type. Else it is a label.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3214 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3215 if (!is_labelchar(ch)) return LABEL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3216 hash += tolower(ch);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3217 more:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3218 while (is_labelchar(ch_next = getc(fp))) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3219 hash += tolower(ch_next);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3220 if (cp - token < maxtlen - 1) *cp++ = ch_next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3221 else too_long = 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3222 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3223 ungetc(ch_next, fp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3224 *cp = '\0';
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3225
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3226 if (too_long)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3227 print_error("Warning: token too long", token, CONTINUE);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3228 for (tp = buckets[BUCKET(hash)]; tp; tp = tp->next) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3229 if ((tp->hash == hash) && (!label_compare(tp->name, token)))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3230 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3231 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3232 if (tp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3233 if (tp->token != CONTINUE) return (tp->token);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3234 while (isspace((ch_next = getc(fp))))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3235 if (ch_next == '\n') Line++;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3236 if (ch_next == EOF) return ENDOFFILE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3237 if (isalnum(ch_next)) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3238 *cp++ = ch_next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3239 hash += tolower(ch_next);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3240 goto more;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3241 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3242 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3243 if (token[0] == '-' || isdigit(token[0])) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3244 for(cp = token+1; *cp; cp++)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3245 if (!isdigit(*cp))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3246 return LABEL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3247 return NUMBER;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3248 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3249 return LABEL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3250 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3251 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3252
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3253 int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3254 snmp_get_token(FILE *fp,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3255 char *token,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3256 int maxtlen)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3257 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3258 return get_token(fp, token, maxtlen);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3259 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3260
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3261 int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3262 add_mibdir(const char *dirname)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3263 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3264 #ifndef ECOSFIXME_NEEDFILESYSTEM
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3265 FILE *fp, *ip;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3266 DIR *dir, *dir2;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3267 const char *oldFile = File;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3268 struct dirent *file;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3269 char token[MAXTOKEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3270 char tmpstr[300];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3271 int count = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3272 #ifndef WIN32
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3273 struct stat dir_stat, idx_stat;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3274 char tmpstr1[300];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3275 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3276
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3277 DEBUGMSGTL(("parse-mibs", "Scanning directory %s\n", dirname));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3278 #ifndef WIN32
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3279 sprintf(token, "%s/%s", dirname, ".index");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3280 if (stat(token, &idx_stat) == 0 && stat(dirname, &dir_stat) == 0) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3281 if (dir_stat.st_mtime < idx_stat.st_mtime) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3282 DEBUGMSGTL(("parse-mibs", "The index is good\n"));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3283 if ((ip = fopen(token, "r")) != NULL) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3284 while (fscanf(ip, "%s %s\n", token, tmpstr) == 2) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3285 sprintf(tmpstr1, "%s/%s", dirname, tmpstr);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3286 new_module(token, tmpstr1);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3287 count++;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3288 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3289 fclose(ip);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3290 return count;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3291 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3292 else DEBUGMSGTL(("parse-mibs", "Can't read index\n"));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3293 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3294 else DEBUGMSGTL(("parse-mibs", "Index outdated\n"));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3295 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3296 else DEBUGMSGTL(("parse-mibs", "No index\n"));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3297 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3298
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3299 if ((dir = opendir(dirname))) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3300 sprintf(tmpstr, "%s/.index", dirname);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3301 ip = fopen(tmpstr, "w");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3302 while ((file = readdir(dir))) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3303 /* Only parse file names not beginning with a '.' */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3304 if (file->d_name != NULL && file->d_name[0] != '.') {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3305 sprintf(tmpstr, "%s/%s", dirname, file->d_name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3306 if ((dir2 = opendir(tmpstr))) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3307 /* file is a directory, don't read it */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3308 closedir(dir2);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3309 } else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3310 /* which module is this */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3311 if ((fp = fopen(tmpstr, "r")) == NULL) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3312 snmp_log_perror(tmpstr);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3313 continue;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3314 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3315 DEBUGMSGTL(("parse-mibs", "Checking file: %s...\n", tmpstr));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3316 Line = 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3317 File = tmpstr;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3318 get_token( fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3319 new_module(token, tmpstr);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3320 count++;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3321 fclose (fp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3322 if (ip) fprintf(ip, "%s %s\n", token, file->d_name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3323 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3324 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3325 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3326 File = oldFile;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3327 closedir(dir);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3328 if (ip) fclose(ip);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3329 return(count);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3330 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3331 return(-1);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3332
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3333 #else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3334 // __ECOS
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3335
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3336 #if 0 // MIBS not needed for agent use of library.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3337 int count = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3338 int i;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3339
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3340 static const char *snmp_miblist[] = {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3341 "EtherLike-MIB",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3342 "IANAifType-MIB",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3343 "IF-MIB",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3344 "IP-MIB",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3345 "RFC-1215",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3346 "SNMPv2-CONF",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3347 "SNMPv2-MIB",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3348 "SNMPv2-SMI",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3349 "SNMPv2-TC",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3350 "SNMPv2-TM",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3351 "TCP-MIB",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3352 "UDP-MIB",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3353 };
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3354
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3355 for ( i = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3356 i < sizeof(snmp_miblist)/sizeof(snmp_miblist[0]);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3357 i++ ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3358
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3359 new_module(snmp_miblist[i],snmp_miblist[i]);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3360 count++;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3361 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3362 return(count);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3363 #else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3364 return 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3365 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3366
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3367 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3368 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3369
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3370
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3371 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3372 * Returns the root of the whole tree
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3373 * (for backwards compatability)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3374 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3375 struct tree *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3376 read_mib(const char *filename)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3377 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3378 FILE *fp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3379 char token[MAXTOKEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3380
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3381 fp = fopen(filename, "r");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3382 if (fp == NULL) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3383 snmp_log_perror(filename);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3384 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3385 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3386 Line = 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3387 File = filename;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3388 DEBUGMSGTL(("parse-mibs", "Parsing file: %s...\n", filename));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3389 get_token( fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3390 fclose(fp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3391 new_module(token, filename);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3392 (void) read_module(token);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3393
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3394 return tree_head;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3395 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3396
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3397
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3398 struct tree *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3399 read_all_mibs()
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3400 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3401 struct module *mp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3402
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3403 for ( mp=module_head ; mp ; mp=mp->next )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3404 if ( mp->no_imports == -1 )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3405 read_module( mp->name );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3406 adopt_orphans();
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3407
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3408 return tree_head;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3409 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3410
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3411
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3412 #ifdef TEST
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3413 main(int argc, char *argv[])
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3414 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3415 int i;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3416 struct tree *tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3417 ds_set_int(DS_LIBRARY_ID, DS_LIB_MIB_WARNINGS, 2);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3418
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3419 init_mib();
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3420
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3421 if ( argc == 1 )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3422 (void) read_all_mibs();
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3423 else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3424 for ( i=1 ; i<argc ; i++ )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3425 read_mib( argv[i] );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3426
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3427 for ( tp = tree_head ; tp ; tp=tp->next_peer )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3428 print_subtree( stdout, tp, 0 );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3429 free_tree( tree_head );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3430
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3431 return 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3432 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3433 #endif /* TEST */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3434
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3435 static int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3436 parseQuoteString(FILE *fp,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3437 char *token,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3438 int maxtlen)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3439 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3440 register int ch;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3441 int count = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3442 int too_long = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3443 char *token_start = token;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3444
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3445 for (ch = getc(fp); ch != EOF; ch = getc(fp)) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3446 if (ch == '\r') continue;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3447 if (ch == '\n') {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3448 Line++;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3449 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3450 else if (ch == '"') {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3451 *token = '\0';
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3452 if (too_long &&
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3453 ds_get_int(DS_LIBRARY_ID, DS_LIB_MIB_WARNINGS) > 1)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3454 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3455 /* show short form for brevity sake */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3456 char ch_save = *(token_start + 50);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3457 *(token_start + 50) = '\0';
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3458 print_error ("Warning: string too long",
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3459 token_start, QUOTESTRING);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3460 *(token_start + 50) = ch_save;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3461 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3462 return QUOTESTRING;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3463 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3464 /* maximum description length check. If greater, keep parsing
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3465 but truncate the string */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3466 if (++count < maxtlen)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3467 *token++ = ch;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3468 else too_long = 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3469 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3470
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3471 return 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3472 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3473
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3474 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3475 * struct index_list *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3476 * getIndexes(FILE *fp):
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3477 * This routine parses a string like { blah blah blah } and returns a
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3478 * list of the strings enclosed within it.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3479 *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3480 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3481 static struct index_list *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3482 getIndexes(FILE *fp, struct index_list **retp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3483 int type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3484 char token[MAXTOKEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3485 char nextIsImplied = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3486
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3487 struct index_list *mylist = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3488 struct index_list **mypp = &mylist;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3489
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3490 free_indexes(retp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3491
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3492 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3493
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3494 if (type != LEFTBRACKET) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3495 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3496 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3497
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3498 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3499 while (type != RIGHTBRACKET && type != ENDOFFILE) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3500 if ((type == LABEL) || (type & SYNTAX_MASK)) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3501 *mypp = (struct index_list *) calloc(1, sizeof(struct index_list));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3502 if (*mypp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3503 (*mypp)->ilabel = strdup(token);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3504 (*mypp)->isimplied = nextIsImplied;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3505 mypp = &(*mypp)->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3506 nextIsImplied = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3507 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3508 } else if (type == IMPLIED) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3509 nextIsImplied = 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3510 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3511 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3512 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3513
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3514 *retp = mylist;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3515 return mylist;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3516 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3517
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3518 static void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3519 free_indexes(struct index_list **spp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3520 if (spp && *spp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3521 struct index_list *pp, *npp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3522
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3523 pp = *spp; *spp = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3524
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3525 while(pp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3526 npp = pp->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3527 if (pp->ilabel) free(pp->ilabel);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3528 free(pp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3529 pp = npp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3530 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3531 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3532 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3533
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3534 static void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3535 free_ranges(struct range_list **spp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3536 if (spp && *spp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3537 struct range_list *pp, *npp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3538
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3539 pp = *spp; *spp = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3540
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3541 while(pp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3542 npp = pp->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3543 free(pp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3544 pp = npp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3545 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3546 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3547 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3548
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3549 static void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3550 free_enums(struct enum_list **spp)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3551 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3552 if (spp && *spp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3553 struct enum_list *pp, *npp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3554
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3555 pp = *spp; *spp = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3556
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3557 while(pp)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3558 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3559 npp = pp->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3560 if (pp->label) free(pp->label);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3561 free(pp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3562 pp = npp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3563 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3564 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3565 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3566
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3567 static struct enum_list *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3568 copy_enums (struct enum_list *sp)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3569 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3570 struct enum_list *xp = NULL, **spp = &xp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3571
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3572 while (sp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3573 *spp = (struct enum_list *) calloc(1, sizeof(struct enum_list));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3574 if (!*spp) break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3575 (*spp)->label = strdup(sp->label);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3576 (*spp)->value = sp->value;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3577 spp = &(*spp)->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3578 sp = sp->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3579 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3580 return (xp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3581 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3582
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3583 static struct range_list *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3584 copy_ranges (struct range_list *sp)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3585 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3586 struct range_list *xp = NULL, **spp = &xp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3587
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3588 while (sp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3589 *spp = (struct range_list *) calloc(1, sizeof(struct range_list));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3590 if (!*spp) break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3591 (*spp)->low = sp->low;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3592 (*spp)->high = sp->high;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3593 spp = &(*spp)->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3594 sp = sp->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3595 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3596 return (xp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3597 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3598
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3599 static struct index_list *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3600 copy_indexes (struct index_list *sp)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3601 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3602 struct index_list *xp = NULL, **spp = &xp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3603
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3604 while (sp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3605 *spp = (struct index_list *) calloc(1, sizeof(struct index_list));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3606 if (!*spp) break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3607 (*spp)->ilabel = strdup(sp->ilabel);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3608 spp = &(*spp)->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3609 sp = sp->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3610 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3611 return (xp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3612 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3613
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3614 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3615 * This routine parses a string like { blah blah blah } and returns OBJID if
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3616 * it is well formed, and NULL if not.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3617 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3618 static int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3619 tossObjectIdentifier(FILE *fp)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3620 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3621 int type;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3622 char token[MAXTOKEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3623 int bracketcount = 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3624
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3625 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3626
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3627 if (type != LEFTBRACKET)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3628 return 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3629 while ((type != RIGHTBRACKET || bracketcount > 0) && type != ENDOFFILE )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3630 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3631 type = get_token(fp, token, MAXTOKEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3632 if (type == LEFTBRACKET)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3633 bracketcount++;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3634 else if (type == RIGHTBRACKET)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3635 bracketcount--;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3636 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3637
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3638 if (type == RIGHTBRACKET)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3639 return OBJID;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3640 else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3641 return 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3642 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3643
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3644 struct tree *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3645 find_node(const char *name,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3646 struct tree *subtree) /* Unused */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3647 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3648 return( find_tree_node( name, -1 ));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3649 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3650
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3651 struct module *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3652 find_module(int mid)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3653 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3654 struct module *mp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3655
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3656 for(mp=module_head; mp!=NULL; mp = mp->next) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3657 if (mp->modid == mid)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3658 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3659 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3660 if (mp != 0)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3661 return mp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3662 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3663 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3664
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3665
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3666 static char leave_indent[256];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3667 static int leave_was_simple;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3668
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3669 static void print_mib_leaves(FILE *f, struct tree *tp, int width)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3670 { struct tree *ntp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3671 char *ip = leave_indent+strlen(leave_indent)-1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3672 char last_ipch = *ip;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3673
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3674 *ip = '+';
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3675 if (tp->type == 0)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3676 fprintf(f, "%s--%s(%ld)\n", leave_indent, tp->label, tp->subid);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3677 else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3678 const char *acc, *typ;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3679 int size = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3680 switch (tp->access) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3681 case MIB_ACCESS_NOACCESS: acc = "----"; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3682 case MIB_ACCESS_READONLY: acc = "-R--"; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3683 case MIB_ACCESS_WRITEONLY: acc = "--W-"; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3684 case MIB_ACCESS_READWRITE: acc = "-RW-"; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3685 case MIB_ACCESS_NOTIFY: acc = "---N"; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3686 case MIB_ACCESS_CREATE: acc = "CR--"; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3687 default: acc = " "; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3688 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3689 switch (tp->type) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3690 case TYPE_OBJID: typ = "ObjID "; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3691 case TYPE_OCTETSTR: typ = "String "; size = 1; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3692 case TYPE_INTEGER:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3693 if (tp->enums) typ = "EnumVal ";
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3694 else typ = "Integer "; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3695 case TYPE_NETADDR: typ = "NetAddr "; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3696 case TYPE_IPADDR: typ = "IpAddr "; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3697 case TYPE_COUNTER: typ = "Counter "; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3698 case TYPE_GAUGE: typ = "Gauge "; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3699 case TYPE_TIMETICKS: typ = "TimeTicks"; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3700 case TYPE_OPAQUE: typ = "Opaque "; size = 1; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3701 case TYPE_NULL: typ = "Null "; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3702 case TYPE_COUNTER64: typ = "Counter64"; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3703 case TYPE_BITSTRING: typ = "BitString"; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3704 case TYPE_NSAPADDRESS: typ = "NsapAddr "; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3705 case TYPE_UINTEGER: typ = "UInteger "; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3706 default: typ = " "; break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3707 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3708 fprintf(f, "%s-- %s %s %s(%ld)\n", leave_indent, acc, typ, tp->label, tp->subid);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3709 *ip = last_ipch;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3710 if (tp->tc_index >= 0)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3711 fprintf(f, "%s Textual Convention: %s\n", leave_indent,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3712 tclist[tp->tc_index].descriptor);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3713 if (tp->enums) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3714 struct enum_list *ep = tp->enums;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3715 int cpos = 0, cmax = width - strlen(leave_indent) - 16;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3716 fprintf(f, "%s Values: ", leave_indent);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3717 while (ep) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3718 char buf[80];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3719 int bufw;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3720 if (ep != tp->enums) fprintf(f, ", ");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3721 sprintf(buf, "%s(%d)", ep->label, ep->value);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3722 cpos += (bufw = strlen(buf) + 2);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3723 if (cpos >= cmax) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3724 fprintf(f, "\n%s ", leave_indent);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3725 cpos = bufw;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3726 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3727 fprintf(f, "%s", buf);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3728 ep = ep->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3729 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3730 fprintf(f, "\n");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3731 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3732 if (tp->ranges) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3733 struct range_list *rp = tp->ranges;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3734 if (size) fprintf(f, "%s Size: ", leave_indent);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3735 else fprintf(f, "%s Range: ", leave_indent);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3736 while (rp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3737 if (rp != tp->ranges) fprintf(f, " | ");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3738 if (rp->low == rp->high) fprintf(f, "%d", rp->low);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3739 else fprintf(f, "%d..%d", rp->low, rp->high);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3740 rp = rp->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3741 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3742 fprintf(f, "\n");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3743 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3744 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3745 *ip = last_ipch;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3746 strcat(leave_indent, " |");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3747 leave_was_simple = tp->type != 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3748
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3749 { int i, j, count = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3750 struct leave {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3751 oid id;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3752 struct tree *tp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3753 } *leaves, *lp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3754
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3755 for (ntp = tp->child_list; ntp; ntp = ntp->next_peer) count++;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3756 if (count) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3757 leaves = (struct leave *)calloc(count, sizeof(struct leave));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3758 if (!leaves) return;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3759 for (ntp = tp->child_list, count = 0; ntp; ntp = ntp->next_peer) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3760 for (i = 0, lp = leaves; i < count; i++, lp++)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3761 if (lp->id >= ntp->subid) break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3762 for (j = count; j > i; j--) leaves[j] = leaves[j-1];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3763 lp->id = ntp->subid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3764 lp->tp = ntp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3765 count++;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3766 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3767 for (i = 1, lp = leaves; i <= count; i++, lp++) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3768 if (!leave_was_simple || lp->tp->type == 0)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3769 fprintf(f, "%s\n", leave_indent);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3770 if (i == count) ip[3] = ' ';
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3771 print_mib_leaves(f, lp->tp, width);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3772 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3773 free(leaves);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3774 leave_was_simple = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3775 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3776 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3777 ip[1] = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3778 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3779
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3780 void print_mib_tree(FILE *f, struct tree *tp, int width)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3781 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3782 leave_indent[0] = ' ';
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3783 leave_indent[1] = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3784 leave_was_simple = 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3785 print_mib_leaves(f, tp, width);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3786 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3787
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3788
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3789 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3790 * Merge the parsed object identifier with the existing node.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3791 * If there is a problem with the identifier, release the existing node.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3792 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3793 static struct node *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3794 merge_parse_objectid(struct node *np,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3795 FILE *fp,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3796 char *name)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3797 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3798 struct node *nnp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3799
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3800 nnp = parse_objectid(fp, name);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3801 if (nnp) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3802 /* apply last OID sub-identifier data to the information */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3803 /* already collected for this node. */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3804 struct node *headp, *nextp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3805 int ncount = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3806 nextp = headp = nnp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3807 while (nnp->next) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3808 nextp = nnp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3809 ncount++;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3810 nnp = nnp->next;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3811 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3812
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3813 np->label = nnp->label;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3814 np->subid = nnp->subid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3815 np->modid = nnp->modid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3816 np->parent = nnp->parent;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3817 free(nnp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3818
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3819 if (ncount) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3820 nextp->next = np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3821 np = headp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3822 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3823 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3824 else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3825 free_node(np); np = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3826 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3827
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3828 return np;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3829 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3830
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3831 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3832 * transfer data to tree from node
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3833 *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3834 * move pointers for alloc'd data from np to tp.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3835 * this prevents them from being freed when np is released.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3836 * parent member is not moved.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3837 *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3838 * CAUTION: nodes may be repeats of existing tree nodes.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3839 * This can happen especially when resolving IMPORT clauses.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3840 *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3841 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3842 static void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3843 tree_from_node(struct tree *tp, struct node *np)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3844 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3845 free_partial_tree(tp, FALSE);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3846
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3847 tp->label = np->label; np->label = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3848 tp->enums = np->enums; np->enums = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3849 tp->ranges = np->ranges; np->ranges = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3850 tp->indexes = np->indexes; np->indexes = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3851 tp->hint = np->hint; np->hint = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3852 tp->units = np->units; np->units = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3853 tp->description = np->description; np->description = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3854
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3855 tp->subid = np->subid;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3856 tp->tc_index = np->tc_index;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3857 tp->type = translation_table[np->type];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3858 tp->access = np->access;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3859 tp->status = np->status;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3860 set_function(tp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3861 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3862