1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
/*
*
* Copyright (C) 2000 Silicon Graphics, Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* Further, this software is distributed without any warranty that it is
* free of the rightful claim of any third person regarding infringement
* or the like. Any license provided herein, whether implied or
* otherwise, applies only to this software file. Patent licenses, if
* any, provided herein do not apply to combinations of this program with
* other software, or any other product whatsoever.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
* Mountain View, CA 94043, or:
*
* http://www.sgi.com
*
* For further information regarding this notice, see:
*
* http://oss.sgi.com/projects/GenInfo/NoticeExplan/
*
*/
//
// Print information about the Structure of a Nodekit class.
//
#include <cstdlib>
#include <cstdio>
#include <dlfcn.h>
#include <unistd.h>
#include <Inventor/SoDB.h>
#include <Inventor/nodekits/SoBaseKit.h>
#include <Inventor/Xt/SoXt.h>
static void
print_usage(const char *progname)
{
(void)fprintf(stderr, "\nThis program prints a diagram and a table of the structure of a nodekit class.\n");
(void)fprintf(stderr, "See the README for details about the diagrams and tables.\n\n");
(void)fprintf(stderr, "Usage: %s [-h] className\n\n", progname);
(void)fprintf(stderr, " -h : This message (help)\n");
(void)fprintf(stderr, "className : The name of any node class");
(void)fprintf(stderr, "derived from SoBaseKit.\n");
(void)fprintf(stderr, " This includes all dragger classes as well.\n");
exit(99);
}
static void
parse_args(int argc, char **argv)
{
int err = 0; // Flag: error in options?
int c;
while ((c = getopt(argc, argv, "h")) != -1) {
switch(c) {
case 'h': // Help
default:
err = 1;
break;
}
}
if (err) {
print_usage(argv[0]);
}
}
int
main(int argc, char **argv)
{
SoXt::init(argv[0]);
// Parse arguments
parse_args(argc, argv);
char *classString;
if (optind != (argc - 1))
print_usage(argv[0]);
else
classString = strdup(argv[optind]);
// 'fromName' takes the name of the Class as it appears in file.
// For the built-in Inventor types, this differs from the class name
// because it has no 'So' prefix.
// Therefore, if the class name begins with 'So', our first try will be
// with the prefix removed.
SbBool startsWithSo = FALSE;
if ( !strncmp( classString, "So", 2 ) ) {
startsWithSo = TRUE;
}
char *lookupString;
if (startsWithSo == TRUE)
lookupString = classString + 2;
else
lookupString = classString;
SoType classType = SoType::fromName(lookupString);
// If we got a bad type and the name began with "So" we will type
// a message and try again with the full name.
if (classType == SoType::badType() && startsWithSo) {
fprintf(stderr,"The className you gave has a prefix of \"So\"\n");
fprintf(stderr,"I tried to remove the prefix and look it up but\n");
fprintf(stderr,"found no such class. Now I'll try again with the\n");
fprintf(stderr,"full string you gave me\n");
classType = SoType::fromName(classString);
}
if (classType == SoType::badType()) {
fprintf(stderr, "ERROR: The given className is not a valid\n");
fprintf(stderr, " node type. Message retrieved \n");
fprintf(stderr, " from dlerror() follows:\n%s\n", dlerror());
exit(0);
}
else if ( ! classType.isDerivedFrom(SoBaseKit::getClassTypeId())) {
fprintf(stderr, "ERROR: The given className is not a subClass\n");
fprintf(stderr, " of SoBaseKit.\n");
exit(0);
}
SoBaseKit *myKit = (SoBaseKit *) classType.createInstance();
// Print the diagram and the table.
myKit->printDiagram();
fprintf(stdout, "\n\n");
myKit->printTable();
return 0;
}
|