Thomas Schwinge wrote:
Hello!
In the GNU MIG package, I'd like to move the `migcom' program out of
`[exec_prefix]/libexec/' (which is where is currently is being
installed)
and install it alongside the `mig' program into `[exec_prefix]/bin/' for
being able to use it directly, avoiding constructs like ``$(MIG) -cc cat
- /dev/null'' as a replacement for directly calling `migcom'.
This means that `migcom' should support the basics of the GNU coding
standards, i.e. some `--version' and `--help' output. Ben, are you
interested in quickly implementig that? Or is someone else?
Regards,
Thomas
If that's ok, i can add/modify whatever else is needed.
diff -u mig/migcom.c migcom.c
--- mig/migcom.c 2006-07-29 02:55:25.000000000 +0300
+++ migcom.c 2006-11-29 23:08:52.000000000 +0200
@@ -26,6 +26,9 @@
/*
* Switches are;
+ * --help Print the below switches
+ * --version Print MIG version
+ *
* -[v,Q] verbose or not quiet: prints out type
* and routine information as mig runs.
* -[V,q] not verbose or quiet : don't print
@@ -91,6 +94,12 @@
{
switch (argv[0][1])
{
+ case '-':
+ if (!strcmp(argv[0], "--help"))
+ HelpMsg = TRUE;
+ else if (!strcmp(argv[0], "--version"))
+ PrintVersion = TRUE;
+ break;
case 'n':
DefaultFiles = FALSE;
break;
@@ -212,6 +221,48 @@
set_program_name("mig");
parseArgs(argc, argv);
+
+ if (HelpMsg)
+ {
+ printf("Mach Interface Generator (MIG) switches:\n");
+ printf("\t--version Print MIG version\n");
+ printf("\t-[v,Q] verbose or not quiet: prints out type\n");
+ printf("\t\tand routine information as mig runs.\n");
+ printf("\t-[V,q] not verbose or quiet : don't print\n");
+ printf("\t\tinformation during compilation\n");
+ printf("\t\t(this is the default)\n");
+ printf("\t-[r,R] do or don't use rpc calls instead of\n");
+ printf("\t\tsend/receive pairs. Default is -r.\n");
+ printf("\t-[s,S] generate symbol table or not: generate a\n");
+ printf("\t\ttable of rpc-name, number, routine triplets\n");
+ printf("\t\tas an external data structure -- main use is\n");
+ printf("\t\tfor protection system's specification of rights\n");
+ printf("\t\tand for protection dispatch code. Default is -s.\n");
+ printf("\t-i <prefix>\n");
+ printf("\t\tPut each user routine in its own file. The\n");
+ printf("\t\tfile is named <prefix><routine-name>.c.\n");
+ printf("\t-user <name>\n");
+ printf("\t\tName the user-side file <name>\n");
+ printf("\t-server <name>\n");
+ printf("\t\tName the server-side file <name>\n");
+ printf("\t-header <name>\n");
+ printf("\t\tName the user-side header file <name>\n");
+ printf("\t-iheader <name>");
+ printf("\t\tName the user-side internal header file <name>\n");
+ printf("\t-sheader <name>\n");
+ printf("\t\tNAme the server-side header file <name>\n");
+ printf("\nReport bugs to [EMAIL PROTECTED]");
+ exit(0);
+ }
+
+ if (PrintVersion)
+ {
+ printf("GNU MiG 1.3\n");
+ printf("Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n");
+ printf(" Everyone is permitted to copy and distribute verbatim
copies of this license document, but changing it is not allowed.\n");
+ exit(0);
+ }
+
init_global();
init_type();
diff -u mig/global.h global.h
--- mig/global.h 2001-06-08 03:49:10.000000000 +0300
+++ global.h 2006-11-30 00:37:25.000000000 +0200
@@ -32,6 +32,8 @@
#include "boolean.h"
#include "mig_string.h"
+extern boolean_t HelpMsg;
+extern boolean_t PrintVersion;
extern boolean_t DefaultFiles; /* default output file names if no
arguments */
extern boolean_t BeQuiet; /* no warning messages */
extern boolean_t BeVerbose; /* summarize types, routines */
diff -u mig/global.c global.c
--- mig/global.c 2001-06-08 03:49:10.000000000 +0300
+++ global.c 2006-11-30 00:37:39.000000000 +0200
@@ -27,6 +27,8 @@
#include "error.h"
#include "global.h"
+boolean_t PrintVersion = FALSE;
+boolean_t HelpMsg = FALSE;
boolean_t DefaultFiles = TRUE;
boolean_t BeQuiet = FALSE;
boolean_t BeVerbose = FALSE;
------------------------------------------------------------------------
/*
* Mach Operating System
* Copyright (c) 1991,1990 Carnegie Mellon University
* All Rights Reserved.
*
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
*
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* Carnegie Mellon requests users of this software to return to
*
* Software Distribution Coordinator or [EMAIL PROTECTED]
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
*
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*/
#include "error.h"
#include "global.h"
boolean_t PrintVersion = FALSE;
boolean_t HelpMsg = FALSE;
boolean_t DefaultFiles = TRUE;
boolean_t BeQuiet = FALSE;
boolean_t BeVerbose = FALSE;
boolean_t UseMsgRPC = TRUE;
boolean_t GenSymTab = FALSE;
boolean_t IsKernelUser = FALSE;
boolean_t IsKernelServer = FALSE;
const_string_t RCSId = strNULL;
const_string_t SubsystemName = strNULL;
u_int SubsystemBase = 0;
const_string_t MsgOption = strNULL;
const_string_t WaitTime = strNULL;
const_string_t ErrorProc = "MsgError";
const_string_t ServerPrefix = "";
const_string_t UserPrefix = "";
const_string_t ServerDemux = strNULL;
const_string_t SubrPrefix = "";
const_string_t RoutinePrefix = "";
string_t yyinname;
const char LintLib[] = "defined(LINTLIBRARY)";
void
init_global(void)
{
yyinname = strmake("<no name yet>");
}
string_t UserFilePrefix = strNULL;
string_t UserHeaderFileName = strNULL;
string_t ServerHeaderFileName = strNULL;
string_t InternalHeaderFileName = strNULL;
string_t UserFileName = strNULL;
string_t ServerFileName = strNULL;
void
more_global(void)
{
if (SubsystemName == strNULL)
fatal("no SubSystem declaration");
if (DefaultFiles)
{
if (UserHeaderFileName == strNULL)
UserHeaderFileName = strconcat(SubsystemName, ".h");
else if (streql(UserHeaderFileName, "/dev/null"))
UserHeaderFileName = strNULL;
if (UserFileName == strNULL)
UserFileName = strconcat(SubsystemName, "User.c");
else if (streql(UserFileName, "/dev/null"))
UserFileName = strNULL;
if (ServerFileName == strNULL)
ServerFileName = strconcat(SubsystemName, "Server.c");
else if (streql(ServerFileName, "/dev/null"))
ServerFileName = strNULL;
}
if (ServerDemux == strNULL)
ServerDemux = strconcat(SubsystemName, "_server");
if (RoutinePrefix != NULL)
ServerDemux = strconcat (RoutinePrefix, ServerDemux);
}
------------------------------------------------------------------------
/*
* Mach Operating System
* Copyright (c) 1991,1990 Carnegie Mellon University
* All Rights Reserved.
*
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
*
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* Carnegie Mellon requests users of this software to return to
*
* Software Distribution Coordinator or [EMAIL PROTECTED]
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
*
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*/
#ifndef _GLOBAL_H
#define _GLOBAL_H
#include <sys/types.h>
#include "boolean.h"
#include "mig_string.h"
extern boolean_t HelpMsg;
extern boolean_t PrintVersion;
extern boolean_t DefaultFiles; /* default output file names if no arguments */
extern boolean_t BeQuiet; /* no warning messages */
extern boolean_t BeVerbose; /* summarize types, routines */
extern boolean_t UseMsgRPC;
extern boolean_t GenSymTab;
extern boolean_t IsKernelUser;
extern boolean_t IsKernelServer;
extern const_string_t RCSId;
extern const_string_t SubsystemName;
extern u_int SubsystemBase;
extern const_string_t MsgOption;
extern const_string_t WaitTime;
extern const_string_t ErrorProc;
extern const_string_t ServerPrefix;
extern const_string_t UserPrefix;
extern const_string_t ServerDemux;
extern const_string_t SubrPrefix;
extern const_string_t RoutinePrefix;
extern int yylineno;
extern string_t yyinname;
extern void init_global(void);
extern string_t UserFilePrefix;
extern string_t UserHeaderFileName;
extern string_t ServerHeaderFileName;
extern string_t InternalHeaderFileName;
extern string_t UserFileName;
extern string_t ServerFileName;
extern void more_global(void);
extern const char LintLib[];
#ifndef NULL
#define NULL 0
#endif
#endif /* _GLOBAL_H */
------------------------------------------------------------------------
/*
* Mach Operating System
* Copyright (c) 1993,1991,1990 Carnegie Mellon University
* All Rights Reserved.
*
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
*
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* Carnegie Mellon requests users of this software to return to
*
* Software Distribution Coordinator or [EMAIL PROTECTED]
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
*
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*/
/*
* Switches are;
* --help Print the below switches
* --version Print MIG version
*
* -[v,Q] verbose or not quiet: prints out type
* and routine information as mig runs.
* -[V,q] not verbose or quiet : don't print
* information during compilation
* (this is the default)
* -[r,R] do or don't use rpc calls instead of
* send/receive pairs. Default is -r.
* -[s,S] generate symbol table or not: generate a
* table of rpc-name, number, routine triplets
* as an external data structure -- main use is
* for protection system's specification of rights
* and for protection dispatch code. Default is -s.
* -i <prefix>
* Put each user routine in its own file. The
* file is named <prefix><routine-name>.c.
* -user <name>
* Name the user-side file <name>
* -server <name>
* Name the server-side file <name>
* -header <name>
* Name the user-side header file <name>
* -iheader <name>
* Name the user-side internal header file <name>
* -sheader <name>
* NAme the server-side header file <name>
*
* DESIGN:
* Mig uses a lexxer module created by lex from lexxer.l and
* a parser module created by yacc from parser.y to parse an
* interface definitions module for a mach server.
* The parser module calls routines in statement.c
* and routines.c to build a list of statement structures.
* The most interesting statements are the routine definitions
* which contain information about the name, type, characteristics
* of the routine, an argument list containing information for
* each argument type, and a list of special arguments. The
* argument type structures are build by routines in type.c
* Once parsing is completed, the three code generation modules:
* header.c user.c and server.c are called sequentially. These
* do some code generation directly and also call the routines
* in utils.c for common (parameterized) code generation.
*
*/
#include <stdio.h>
#include "error.h"
#include "lexxer.h"
#include "global.h"
#include "write.h"
extern int yyparse();
static FILE *myfopen(const char *name, const char *mode);
static void myfclose(FILE *file, const char *name);
static string_t RoutineListFileName;
static void
parseArgs(int argc, char **argv)
{
while (--argc > 0)
if ((++argv)[0][0] == '-')
{
switch (argv[0][1])
{
case '-':
if (!strcmp(argv[0], "--help"))
HelpMsg = TRUE;
else if (!strcmp(argv[0], "--version"))
PrintVersion = TRUE;
break;
case 'n':
DefaultFiles = FALSE;
break;
case 'q':
BeQuiet = TRUE;
break;
case 'Q':
BeQuiet = FALSE;
break;
case 'v':
BeVerbose = TRUE;
break;
case 'V':
BeVerbose = FALSE;
break;
case 'r':
UseMsgRPC = TRUE;
break;
case 'R':
UseMsgRPC = FALSE;
break;
case 'l':
if (streql(argv[0], "-list"))
{
--argc; ++argv;
if (argc == 0)
fatal("missing name for -list option");
RoutineListFileName = strmake(argv[0]);
}
break;
case 's':
if (streql(argv[0], "-server"))
{
--argc; ++argv;
if (argc == 0)
fatal("missing name for -server option");
ServerFileName = strmake(argv[0]);
}
else if (streql(argv[0], "-sheader"))
{
--argc; ++argv;
if (argc == 0)
fatal ("missing name for -sheader option");
ServerHeaderFileName = strmake(argv[0]);
}
else if (streql(argv[0], "-subrprefix"))
{
--argc; ++argv;
if (argc == 0)
fatal ("missing string for -subrprefix option");
SubrPrefix = strmake(argv[0]);
}
else
GenSymTab = TRUE;
break;
case 'S':
GenSymTab = FALSE;
break;
case 'i':
if (streql(argv[0], "-iheader"))
{
--argc; ++argv;
if (argc == 0)
fatal("missing name for -iheader option");
InternalHeaderFileName = strmake(argv[0]);
}
else
{
--argc; ++argv;
if (argc == 0)
fatal("missing prefix for -i option");
UserFilePrefix = strmake(argv[0]);
}
break;
case 'u':
if (streql(argv[0], "-user"))
{
--argc; ++argv;
if (argc == 0)
fatal("missing name for -user option");
UserFileName = strmake(argv[0]);
}
else
fatal("unknown flag: '%s'", argv[0]);
break;
case 'h':
if (streql(argv[0], "-header"))
{
--argc; ++argv;
if (argc == 0)
fatal("missing name for -header option");
UserHeaderFileName = strmake(argv[0]);
}
else
fatal("unknown flag: '%s'", argv[0]);
break;
case 'p':
if (streql(argv[0], "-prefix"))
{
if (--argc == 0)
fatal ("missing string for -prefix option");
RoutinePrefix = strmake(*++argv);
}
break;
default:
fatal("unknown flag: '%s'", argv[0]);
/*NOTREACHED*/
}
}
else
fatal("bad argument: '%s'", *argv);
}
int
main(int argc, char **argv)
{
FILE *uheader, *server, *user;
FILE *iheader, *sheader;
set_program_name("mig");
parseArgs(argc, argv);
if (HelpMsg)
{
printf("Mach Interface Generator (MIG) switches:\n");
printf("\t--version Print MIG version\n");
printf("\t-[v,Q] verbose or not quiet: prints out type\n");
printf("\t\tand routine information as mig runs.\n");
printf("\t-[V,q] not verbose or quiet : don't print\n");
printf("\t\tinformation during compilation\n");
printf("\t\t(this is the default)\n");
printf("\t-[r,R] do or don't use rpc calls instead of\n");
printf("\t\tsend/receive pairs. Default is -r.\n");
printf("\t-[s,S] generate symbol table or not: generate a\n");
printf("\t\ttable of rpc-name, number, routine triplets\n");
printf("\t\tas an external data structure -- main use is\n");
printf("\t\tfor protection system's specification of rights\n");
printf("\t\tand for protection dispatch code. Default is -s.\n");
printf("\t-i <prefix>\n");
printf("\t\tPut each user routine in its own file. The\n");
printf("\t\tfile is named <prefix><routine-name>.c.\n");
printf("\t-user <name>\n");
printf("\t\tName the user-side file <name>\n");
printf("\t-server <name>\n");
printf("\t\tName the server-side file <name>\n");
printf("\t-header <name>\n");
printf("\t\tName the user-side header file <name>\n");
printf("\t-iheader <name>");
printf("\t\tName the user-side internal header file <name>\n");
printf("\t-sheader <name>\n");
printf("\t\tNAme the server-side header file <name>\n");
printf("\nReport bugs to [EMAIL PROTECTED]");
exit(0);
}
if (PrintVersion)
{
printf("GNU MiG 1.3\n");
printf("Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n");
printf(" Everyone is permitted to copy and distribute verbatim copies of
this license document, but changing it is not allowed.\n");
exit(0);
}
init_global();
init_type();
LookNormal();
(void) yyparse();
if (errors > 0)
exit(1);
more_global();
uheader = myfopen(UserHeaderFileName, "w");
if (!UserFilePrefix)
user = myfopen(UserFileName, "w");
server = myfopen(ServerFileName, "w");
if (ServerHeaderFileName)
sheader = myfopen(ServerHeaderFileName, "w");
if (IsKernelServer)
{
iheader = myfopen(InternalHeaderFileName, "w");
}
if (BeVerbose)
{
printf("Writing %s ... ", UserHeaderFileName);
fflush(stdout);
}
WriteUserHeader(uheader, StatementList);
myfclose(uheader, UserHeaderFileName);
if (ServerHeaderFileName)
{
if (BeVerbose)
{
printf ("done.\nWriting %s ...", ServerHeaderFileName);
fflush (stdout);
}
WriteServerHeader(sheader, StatementList);
myfclose(sheader, ServerHeaderFileName);
}
if (IsKernelServer)
{
if (BeVerbose)
{
printf("done.\nWriting %s ... ", InternalHeaderFileName);
fflush(stdout);
}
WriteInternalHeader(iheader, StatementList);
myfclose(iheader, InternalHeaderFileName);
}
if (UserFilePrefix)
{
if (BeVerbose)
{
printf("done.\nWriting individual user files ... ");
fflush(stdout);
}
WriteUserIndividual(StatementList);
}
else
{
if (BeVerbose)
{
printf("done.\nWriting %s ... ", UserFileName);
fflush(stdout);
}
WriteUser(user, StatementList);
myfclose(user, UserFileName);
}
if (BeVerbose)
{
printf("done.\nWriting %s ... ", ServerFileName);
fflush(stdout);
}
WriteServer(server, StatementList);
myfclose(server, ServerFileName);
if (RoutineListFileName != strNULL)
{
FILE *listfile = myfopen (RoutineListFileName, "w");
WriteRoutineList (listfile, StatementList);
myfclose (listfile, RoutineListFileName);
}
if (BeVerbose)
printf("done.\n");
return 0;
}
static FILE *
myfopen(const char *name, const char *mode)
{
const char *realname;
FILE *file;
extern int errno;
if (name == strNULL)
realname = "/dev/null";
else
realname = name;
file = fopen(realname, mode);
if (file == NULL)
fatal("fopen(%s): %s", realname, unix_error_string(errno));
return file;
}
static void
myfclose(FILE *file, const char *name)
{
if (ferror(file) || fclose(file))
fatal("fclose(): ", name, unix_error_string(errno));
}
------------------------------------------------------------------------