[comp.os.vms] VMS Makefile part 1 of 8

awp8101@ritcv.UUCP (Andrew W. Potter) (02/09/88)

....................... Cut between dotted lines and save ......................
$!..............................................................................
$! VAX/VMS archive file created by VMS_SHAR V-5.01 01-Oct-1987
$! which was written by Michael Bednarek (U3369429@ucsvc.dn.mu.oz.au)
$! To unpack, simply save and execute (@) this file.
$!
$! This archive was created by AWPSYS
$! on Monday 8-FEB-1988 17:02:58.43
$!
$! ATTENTION: To keep each article below 30720 bytes, this program
$! has been transmitted in 8 parts.
$! You should concatenate ALL parts to ONE file and execute (@) that file.
$!
$! It contains the following 21 files:
$! AAAREADME.TXT BUILD_MAKE.COM C_OPTS.OPT DEFRULE.MAK MAKE.CLD MAKE.H MAKE.RNH
$! MAKE.RNO MAKEFILE.MAK MAKE_STARTUP.COM MKDATE.C MKERRS.MSG MKEXIT.C MKEXT.C
$! MKFILE.C MKMACRO.C MKMAIN.C MKSCAN.C MKSHOW.C MKSUB.C MKUTIL.C
$!==============================================================================
$ Set Symbol/Scope=(NoLocal,NoGlobal)
$ Version=F$GetSYI("VERSION") ! See what VMS version we have here:
$ If Version.ges."V4.4" then goto Version_OK
$ Write SYS$Output "Sorry, you are running VMS ",Version, -
                ", but this procedure requires V4.4 or higher."
$ Exit 44
$Version_OK: CR[0,8]=13
$ Pass_or_Failed="failed!,passed."
$ Goto Start
$Convert_File:
$ Read/Time_Out=0/Error=No_Error1/Prompt="creating ''File_is'" SYS$Command ddd
$No_Error1: Define/User_Mode SYS$Output NL:
$ Edit/TPU/NoSection/NoDisplay/Command=SYS$Input/Output='File_is' -
        VMS_SHAR_DUMMY.DUMMY
f:=Get_Info(Command_Line,"File_Name");b:=Create_Buffer("",f);
o:=Get_Info(Command_Line,"Output_File");Set(Output_File,b,o);
Position(Beginning_of(b));Loop x:=Erase_Character(1);Loop ExitIf x<>"V";
Move_Vertical(1);x:=Erase_Character(1);Append_Line;
Move_Horizontal(-Current_Offset);EndLoop;Move_Vertical(1);
ExitIf Mark(None)=End_of(b) EndLoop;Position(Beginning_of(b));Loop
x:=Search("`",Forward,Exact);ExitIf x=0;Position(x);Erase_Character(1);
If Current_Character='`' then Move_Horizontal(1);else
Copy_Text(ASCII(INT(Erase_Character(3))));EndIf;EndLoop;Exit;
$ Delete VMS_SHAR_DUMMY.DUMMY;*
$ Checksum 'File_is
$ Success=F$Element(Check_Sum_is.eq.CHECKSUM$CHECKSUM,",",Pass_or_Failed)+CR
$ Read/Time_Out=0/Error=No_Error2/Prompt=" CHECKSUM ''Success'" SYS$Command ddd
$No_Error2: Return
$Start:
$ File_is="AAAREADME.TXT"
$ Check_Sum_is=75187634
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
XUpdate: 8-FEB-1987- Fixed the bug that prevented users with usernames
X                    of more than 7 characters from using make. (The bug
X                    occured in the routine MKSUB.  Make concatinates
X                    the low order PID to the username to form the processname
X                    of the subprocess.  Make died then the SPAWN failed to
X                    create the subprocess name of more than 15 characters
X                    character) - AWP
X
X`0098-FEB-1987  Fixed CLD Comment /TOUCH option - AWP
X
X
X                   DIRECTIONS FOR INSTALLING MAKE
X
XUse BUILD_MAKE.COM to compile and link the MAKE sources, and to produce the
Xdocumentation files MAKE.HLP and MAKE.MEM.  The LINK command in
XBUILD_MAKE.COM uses an options file, C_OPTS.OPT, which specifies the name
Xof the VAXC Run-Time Library.  It assumes that the library
X"SYS$SHARE:VAXCRTL.EXE" exists. If this is not the case on your system,
Xmodify C_OPTS.OPT as appropriate.
X
XTo install on your system:
X
X1) Modify the file MAKE_STARTUP.COM to correctly point to proper
X   path to the MAKE directory.
X
X   MAKE_STARTUP.COM defines three system-wide logical names:
X    MAKE$DEFRULE -- this should be the full pathname of the default
X        rules file, DEFRULE.MAK
X    MAKE$DEFNAME -- this should be the default name for makefiles,
X    MAKE$DOCUMENT -- this should be the full pathname of the MAKE
X        tutorial document, MAKE.MEM .  The help entry MAKE.HLP refers
X        to this logical name.
X
X2) Modify your site specific startup command file to invoke the
X   procedure MAKE_STARTUP.COM
X
X3) Install the CLD in the system wide dcltables.  (If you do not
X   wish to do this, then tell your MAKE users to include the command
X   "SET COMMAND MAKE_HOMEDIR:MAKE" in their LOGIN.COM files)
X
X   To install the CLD system wide:
X
X   $ SET COMMAND /TABLES=SYS$COMMON:[SYSLIB]DCLTABLES.EXE -
X                 /OUTPUT=SYS$COMMON:[SYSLIB]DCLTABLES.EXE MAKE.CLD
X   $ INSTALL == "$INSTALL/COMMAND"
X   $ INSTALL REPLACE SYS$LIBRARY:DCLTABLES
X
X   You will need to logout and back in to get the new command definitions
X
X 4) Install the HELP entry in the system help file.
X
X`009$ LIBRARY/HELP SYS$HELP:HELPLIB.HLB MAKE.HLP
X
X  This help entry, MAKE.HLP, directs users to mail any questions or bug
X  reports to MAKE_MAINT.  Therefore, either create a MAKE_MAINT mail
X  alias (In mail: SET FORWARD/USER=MAKE_MAINT), or edit MAKE.RNH to 
X  remove the reference to this name.
X
X  MAKE should now be ready for use.
X
X
X
X             PURPOSE OF THIS MAKE IMPLEMENTATION
X
XThe major design goal of this MAKE is to provide VMS users with a
Xmake utility which is as similar as possible to the Unix [Unix is
Xa trademark of Bell Laboratories] utility of the same name.  To this
Xend, some of MAKE's features are a bit inconvenient in the VMS
Xenvironment.  In particular, the use of '$' for macro invocation
Xrequires that all other uses of '$' in a makefile (e.g., as part
Xof a file or device name) be preceded by '\'.  Similarly, the use
Xof '@' to suppress printing of a command line requires that a '\'
Xprecede '@' when it is used to run a command (.COM) file.  (See!
XThat's not a bug, it's a feature.)  Individual sites may choose to
Xuse other characters (by changing the #define constants INVOKE_MACRO
Xand MC_NO_ECHO in MAKE.H) to avoid this problem, depending on how
Xmuch they care whether their MAKE resembles the Unix version.
X
X
X
X                  DISCUSSION OF SOURCE CODE
X
XThe sources for MAKE are:
X
XMAKE.CLD    MAKE.H     MKERRS.MSG   MAKEFILE.MAK   BUILD_MAKE.COM
XMKDATE.C    MKEXIT.C   MKEXT.C      MKFILE.C
XMKMACRO.C   MKMAIN.C   MKSCAN.C     MKSHOW.C
XMKSUB.C     MKUTIL.C   MAKE.RNH     MAKE.RNO
X
XCompilation instructions are in the makefile, and in BUILD_MAKE.COM.
XA comment at the top of each source file describes the main purpose
Xof the routines in that file.
X
X
XThe C code follows a number of conventions:
X
X  o  All defined constants, macros, and typedef'd names are uppercase
X  o  Local variables and function names are all lowercase
X  o  Global variables start with a single capital letter, so they
X     don't look like either defined constants or local variables
X  o  Indentation is by eight column tabs
X  o  When a statement is broken across multiple lines, all lines
X     after the first are indented by half a tab
X  o  A blank line precedes and follows each comment block
X  o  Comments do not use pretty formatting, just the minimum open
X     and close comment pairs, in line with the comment text
X  o  Curly braces are always used, even when they enclose only
X     one statement
X
XTo answer possible complaints, especially about the last two items, let
Xme point out that the major goals of choosing a style are readability
Xand ease of modification.  It would be difficult to find a more flexible
Xcomment style than the one used here.  Certainly none of the more common
Xtypes of comments allow changes nearly so easily:
X
X/*
X * This is a
X * comment.
X */
X
X/* This is a *
X * comment.  */
X
X/*\
X * This is a
X * comment.
X\*/
X
XAs for using curly braces when they aren't required, the tiny inconvenience
Xof typing them in is more than made up for by the guaranteed avoidance of
X"dangling else" errors, and the ease of adding new statements later.
X
XThe remaining conventions are mainly for readability.  It seems six of one,
Xhalf a dozen of the other whether a space should separate a keyword from a
Xparenthesized expression, or whether a space should separate a function
Xname from its parenthesized argument list.  I like the first, but not the
Xsecond, however, there isn't any real difference.
X
XUsing all-caps for constants is fairly standard.  Using all-caps for
Xmacro names is not; macro names (following the lead of, for example,
Xputchar()/getchar() ) are usually all lowercase.  I find it very helpful
Xto be able to tell immediately whether something is a function or a macro,
Xso that I don't waste time searching all the C files for a function name
Xwhich doesn't exist, only to find (eventually) that it is a macro defined
Xin a .H file.  Similarly, capitalizing the first letter of every external
Xvariable is a great aid in spotting where non-local data is being used.
X
XMany people prefer four column tabs, rather than eight.  I have two
Xreasons for favoring eight space tabs.  First, a single tab is easier to
Xtype than four spaces.  If you're using a terminal with adjustable tab
Xstops, this doesn't matter, but many terminals support only eight column
Xtabs.  Second, to answer the idea that four space tabs allow deeper
Xnesting without going beyond eighty columns:  my own experience is that
Xwhen the nesting is deep enough with eight space tabs to push lines past
Xeighty columns, it's also getting a bit too deep to be easily understood.
XThe innermost few levels should probably be replaced by a new function.
X
X
XI hope you find MAKE as useful for your purposes as it is for mine.
XIf you find time hanging heavy on your hands and want something to do
Xto fill it, you might have a go at re-writing MKMACRO.C, especially to
Xmerge the code for special macros with the code for named macros.
XMKFILE.C could also use some work.  In particular it would be nice if
Xit did not scan a linked list of all the tokens in a makefile, but
Xrather called make_token() (in MKSCAN.C) each time it needed one.
X
XTo be ideologically correct, I suppose all of the code in MKSCAN.C and
XMKFILE.C should be replaced with table-driven code produced by a lexical
Xanalyser and parser generator such as the Unix utilities lex and yacc.
XHowever, table-driven parsers are notoriously slow.  Also, the syntax of
Xmakefiles is unlikely to change much or often, so ease of modification
Xis not a big concern.
X
X
XNaturally, if you fix bugs or add useful enhancements, I'd love to
Xhear about it.  I can be reached via BITNET at RITVAXD::JAP5769 .
X
X
X`009`009`009`009Regards,
X
X`009`009`009`009-Jesse Perry
$ GoSub Convert_File
$ File_is="BUILD_MAKE.COM"
$ Check_Sum_is=1399994023
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X$!
X$! MAKE version 1.1, April 1987
X$! Copyright (C) 1987 by Jesse Perry.
X$! MAKE is in the public domain and may be freely distributed,
X$! used, and modified, provided this notice is not removed.
X$!
X$! build_make.com
X$! This command file creates the MAKE program for the first time.
X$!
X$ set verify
X$ define/user vaxc$include 'f$env("DEFAULT")', sys$library
X$ cc mkdate, mkexit, mkext, mkfile, mkmacro, mkmain, mkscan, mkshow, -
X  mksub, mkutil
X$ message mkerrs
X$ link /notrace /nodebug /exe=make mkdate, mkexit, mkext, mkfile, mkmacro, -
X  mkmain, mkscan, mkshow, mksub, mkutil, mkerrs, sys$input:/opt
Xsys$share:vaxcrtl/share
X$!
X$ runoff make.rnh
X$ runoff make.rno
X$ set noverify
$ GoSub Convert_File
$ File_is="C_OPTS.OPT"
$ Check_Sum_is=2036470308
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X! Default system options file to link against the sharable C runtime library
X!
Xsys$share:vaxcrtl/share
$ GoSub Convert_File
$ File_is="DEFRULE.MAK"
$ Check_Sum_is=644948802
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X
X# Default rules for make.  Every default rule has a corresponding qualifier
X# macro, typically empty.  This is so that these macros can be set up on the
X# command line using /DEFINE .
X
XLINK_QUAL =
X.obj.exe:
X`009link $(LINK_QUAL) $*
X
XCC_QUAL =
X.c.obj:
X`009cc $(CC_QUAL) $*
X
XFOR_QUAL =
X.for.obj:
X`009fortran $(FOR_QUAL) $*
X
XPAS_QUAL =
X.pas.obj:
X`009pascal $(PAS_QUAL) $*
X.pas.pen:
X`009pascal $(PAS_QUAL) /noobj/envi $*
X
XMAR_QUAL =
X.mar.obj:
X`009macro $(MAR_QUAL) $*
X
XMESS_QUAL =
X.msg.obj:
X`009message $(MESS_QUAL) $*
X
XCOMM_QUAL =
X.cld.obj:
X`009set command /obj $(COMM_QUAL) $*
X
X.tpu.gbl:
X`009edit /tpu /nosection /nodisplay /command=$*
X
XRUNO_QUAL =
X.rno.mem:
X`009runoff $(RUNO_QUAL) $*
$ GoSub Convert_File
$ File_is="MAKE.CLD"
$ Check_Sum_is=538985529
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X!
X! MAKE version 1.1, April 1987
X! Copyright (C) 1987 by Jesse Perry.
X! MAKE is in the public domain and may be freely distributed,
X! used, and modified, provided this notice is not removed.
X!
X! make.cld
X! This file defines the parameters and qualifiers for the MAKE command.
X!
X
Xdefine verb make
X
X`009image make_homedir:make`009
X
X`009parameter p1, label=target, value(list)
X`009qualifier active, default, negatable
X`009qualifier build, nonnegatable, value(type=$file)
X`009qualifier define, nonnegatable, value(required, list)
X`009qualifier ignore
X`009qualifier makefile, default, value(type=$file)
X`009qualifier print
X`009qualifier revised, nonnegatable
X`009qualifier rule, default, value(type=$file)
X`009qualifier silent
X`009qualifier touch, nonnegatable`009`009! unimplemented
X`009qualifier verbose
$ GoSub Convert_File
$ File_is="MAKE.H"
$ Check_Sum_is=1714253365
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X/*
XMAKE version 1.1, April 1987
XCopyright (C) 1987 by Jesse Perry.
XMAKE is in the public domain and may be freely distributed,
Xused, and modified, provided this notice is not removed.
X
Xmake.h
XThis file contains all the global constant, macro, and special type
Xdefinitions.  It also declares all the external variables, and the
Xnames of the error message vectors.
X*/
X
X#include <stdio.h>
X
X#ifndef TRUE
X#define TRUE`0091
X#define FALSE`0090
X#endif
X
X/* Compilation control symbols. */
X
X#define VMS_ERROR`009/* use VMS style error messages */
X#define NO_CASE`009`009/* if NO_CASE defined, upper is equivalent to lower */
X#ifdef NO_CASE
X#define`009COMPARE(s1, s2)`009casecmp((s1), (s2))
X#else
X#define COMPARE(s1, s2)`009strcmp((s1), (s2))
X#endif
X#ifndef NO_CASE
V#define casecmp`009strcmp`009/* don't use special casecmp() unless NO_CASE defi
Xned */
X#endif
X
X/* Assorted constants. */
X
X#define ___`009`009`0090`009/* blank argument for system calls */
X#define ASCII_DATE_LEN`009`00924
X#define FILE_NAME_LEN`009`00964
X#define MACRO_NAME_LEN`009`00964
X#define MAX_CMD_LEN`009`009260
X#define MAX_ERR_DESC`009`0096`009/* max strings in one error message */
X#define MAX_EXP_INSTANCE`00980
X#define MAX_TOKEN_LEN`009`009FILE_NAME_LEN
X#define NORMAL_EXIT`009`0091`009/* exit value if no errors occurred */
X#define UPDATE_INDENT`009`0092
X
X/* Special characters in makefiles. */
X
X#define OPEN_COMMENT`009`009'#'
X#define CLOSE_COMMENT`009`009'\n'
X#define REPLACE_COMMENT`009`009(CLOSE_COMMENT == '\n' ? '\n' : ' ')
X#define CONTINUE_LINE`009`009'\\'
X#define NEXT_LITERAL`009`009'\\'
X#define FILE_TYPE_CHAR`009`009'.'
X#define DEPENDENCY`009`009':'
X#define DEFINE_MACRO`009`009'='
X#define INVOKE_MACRO`009`009'$'
X#define OPEN_DELIM`009`009'('
X#define CLOSE_DELIM`009`009')'
X#define BEGIN_CMD_LINE`009`009' '
X#define CURRENT_TARGET`009`009'@'
X#define CURR_TARG_NO_EXT`009'*'
X#define DEPENDENCY_LIST`009`009'?'
X#define OUT_OF_DATE_DEPS`009'<'
X#define UP_TO_DATE_DEPS`009`009'>'
X
X#define MC_IGN_ERROR`009`009'-'
X#define MC_NO_ECHO`009`009'@'
X#define MC_CONTINUE`009`009'-'`009/* DCL line continuation character */
X
X#define CLI_COMMENT`009`009'!'`009/* command line interpreter comment */
X
X/* Macro expansion errors. */
X
X#define EXP_SIMPLE`0090
X#define EXP_SPECIAL`0091
X#define EXP_ERROR`0092
X#define EXP_NONE`0093
X
X/* Parser states. */
X
X#define P_START_LINE`009`0090
X#define P_GET_TARGET_LIST`0091
X#define P_GET_DEPENDENCY_LIST`0092
X#define P_CHECK_MACRO`009`0093
X#define P_EXPAND_TARGET`009`0094
X#define P_GET_CMD`009`0095
X#define P_GET_CMD_FLAG`009`0096
X#define P_GET_MACRO_TEXT`0097
X
X/* Target types for show_target() */
X
X#define STMT_ERROR`009`009(-1)
X#define STMT_MACRO`009`0090
X#define STMT_RULE`009`0091
X#define STMT_TARGET`009`0092
X
X/* Macro expansion item types. */
X
X#define ITEM_EMPTY`009`0090
X#define ITEM_TEXT`009`0091
X#define ITEM_TOKEN`009`0092
X
X/* File update results. */
X
X#define UPDT_OKAY`009`0091`009/* file successfully updated */
X#define UPDT_ERROR`009`0090`009/* error occurred during update */
X#define UPDT_HOW`009`009-1`009/* don't know how to update file */
X
X/* Flag bit values for command lines. */
X
X#define CMD_SIMPLE`0090x01`009/* no macros (left) in command string */
X#define CMD_IGN_ERROR`0090x02`009/* no abort if command has execution error */
X#define CMD_NO_ECHO`0090x04`009/* command should not be printed */
X#define CMD_CONTINUE`0090x08`009/* this command is continued on next line */
X
X/* Flag bit values for special MAKE version of ctype. */
X
X#define D_`0090x01`009/* digit character */
X#define L_`0090x02`009/* lowercase letter */
X#define U_`0090x04`009/* uppercase letter */
X#define S_`0090x20`009/* special macro character */
X#define Q_`0090x40`009/* quoted string character */
X#define T_`0090x80`009/* MAKE token separator */
X
X#define A_`009(L_ | U_)`009/* alphabetic */
X#define I_`009(A_ | D_)`009/* valid character in identifier */
X
X/* General macro definitions. */
X
X#define E_ALLOC(type)`009((type *)err_alloc(sizeof(type)))
X
X/* MAKE ctype macro definitions. */
X
X#define IS_DIGIT(c)`009(Ctype[c] & D_)
X#define IS_LOWER(c)`009(Ctype[c] & L_)
X#define IS_UPPER(c)`009(Ctype[c] & U_)
X#define IS_ALPHA(c)`009(Ctype[c] & A_)
X#define IS_ID_CH(c)`009(Ctype[c] & I_)
X#define IS_SPECIAL(c)`009(Ctype[c] & S_)
X#define IS_QUOTE(c)`009(Ctype[c] & Q_)
X#define IS_TOK_SEP(c)`009(Ctype[c] & T_)
X
X/* Other macro definitions. */
X
X#define BAD_EXIT(val)`009(!((val) & 1))`009/* VMS specific */
X#define BOOLSTR(val)`009(val ? "TRUE" : "FALSE")
X#define ERRSTAT(stat)`009(~(stat) & 1)`009/* also VMS specific */
X#define FAO_AD(str)`009strlen(str), (str)
X#define PLURAL(n)`009(n == 1 ? "" : "s")
X#define ENDLIST(list)`009*(int *)&list[sizeof(list) / sizeof(list[0]) - 1] = 0
X
X/* Special type definitions. */
X
Xtypedef short LISTLEN;
X
Xtypedef struct {
X`009int sd_len;
X`009char *sd_str;
X} STR_DESC;
X
Xtypedef struct {`009/* SYSTEM SPECIFIC */
X`009unsigned long date_lo;
X`009unsigned long date_hi;
X} DATE;
X
Xtypedef struct make_token {
X`009struct make_token *mt_next;
X`009char *mt_text;`009`009/* text of token */
X`009short mt_simple;`009/* FALSE if string contains macros */
X`009short mt_line;`009`009/* line number which token is on in makefile */
X} MAKE_TOKEN;
X
Xtypedef struct make_command {
X`009struct make_command *cmd_next;
X`009MAKE_TOKEN *cmd_word;`009/* list of words in command string */
X`009short cmd_flag;`009`009/* flags describing command */
X`009LISTLEN cmd_length;`009/* number of tokens in command line */
X} MAKE_COMMAND;
X
Xtypedef struct make_target {
X`009struct make_target *tg_next;
X`009MAKE_TOKEN *tg_name;`009/* name(s) of target(s) */
X`009MAKE_TOKEN *tg_dep;`009/* dependency names */
X`009MAKE_COMMAND *tg_cmd;`009/* commands to update target */
X`009LISTLEN tg_ndep;`009/* number of dependencies */
X} MAKE_TARGET;
X
Xtypedef struct {
X`009char *it_text;
X`009MAKE_TOKEN *it_token;
X`009char it_type;
X} MACRO_ITEM;
X
X/* Function declarations. */
X
Xchar *err_alloc(), *find_file_type(), *make_tokstr(), *newstr();
Xchar *rm_file_type(), *set_file_type(), *strecpy();
XMAKE_TOKEN *free_first_token();
X
X/* External variable declarations. */
X
Xextern int Update_level;
Xextern int Num_cmd_sent;
Xextern char *Cmdlnmacdef;
Xextern char Ctype[128];
Xextern char Def_makefile_name[];
Xextern char Def_rule_name[];
Xextern char Def_file_type[];
Xextern char Def_targ_type[];
Xextern char Def_build_name[];
Xextern char Def_build_type[];
Xextern char Verbose_prefix[];
Xextern char Active;
Xextern char Created;
Xextern char Ignore;
Xextern char Silent;
Xextern char Touch;
Xextern char Verbose;
Xextern char Sub_ign_err;
Xextern char *Curr_targ;
Xextern FILE *Bldfile;
X
X#ifdef PARSE_DEBUG
Xextern char *P_state_name[];
X#endif
X
X#ifdef VMS_ERROR
X/* Informational message vectors. */
X
Xglobalref int Mak_nothing;
X
X/* Warning message vectors. */
X
X/* Error message vectors. */
X
Xglobalref int Mak_alloc,
X`009Mak_errcrebld,
X`009Mak_badinitch,
X`009Mak_chrequired,
X`009Mak_cmdspecexp,
X`009Mak_depeof,
X`009Mak_depneeded,
X`009Mak_errindef,
X`009Mak_errinmak,
X`009Mak_expandrule,
X`009Mak_how,
X`009Mak_invblank,
X`009Mak_invch,
X`009Mak_maclendiff,
X`009Mak_multmacdef,
X`009Mak_nocmd,
X`009Mak_nodelim,
X`009Mak_nodepch,
X`009Mak_notarg,
X`009Mak_notextmac,
X`009Mak_notgname,
X`009Mak_sepclash,
X`009Mak_specdef,
X`009Mak_spectarg,
X`009Mak_unexpeof,
X`009Mak_unrecmac,
X`009Mak_unrecspec,
X`009Mak_cmdlnerr,
X`009Mak_errcrembx,
X`009Mak_errcresub,
X`009Mak_errwrtsub,
X`009Mak_errmbxast;
X#endif
$ GoSub Convert_File
$ Goto Part2