bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Moving `migcom' out of `[exec_prefix]/libexec/'


From: Barry deFreese
Subject: Re: Moving `migcom' out of `[exec_prefix]/libexec/'
Date: Wed, 29 Nov 2006 17:06:16 -0500
User-agent: Thunderbird 1.5.0.8 (Windows/20061025)

Constantine Kousoulos wrote:
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 bug-hurd@gnu.org\n");
+    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  Software.Distribution@CS.CMU.EDU
 *  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  Software.Distribution@CS.CMU.EDU
 *  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  Software.Distribution@CS.CMU.EDU
 *  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 bug-hurd@gnu.org\n");
        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));
}
------------------------------------------------------------------------

Constantine,

I'm speaking out of my ass as usual but I assume he suggested Ben because we would prefer using argp and Ben is the argp master. But what you have looks reasonable.

Thanks,

Barry deFreese (aka bddebian)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]