VX/Cpp
VX/Cpp (VX C language pre-processor) is Sector7's automated tool for identifying flagging and correcting VAX/C source code to produce portable POSIX-compliant source code. VX/Cpp will also detect processor-specific problems and correct them ( Argument Endian issues ). This documents the operation of VX/Cpp and the functions that it performs.
VX/Cpp is intended to be run in much the same manner as a C compiler. A command line that may contain switch settings and a C source file name invokes the program. VX/Cpp accepts most of the usual C compiler switches so that a Makefile constructed for compiling a system of source code may be easily transformed into a VX/Cpp processing file. In addition to the C compiler-like switches, VX/Cpp accepts its own switche s for directing which features and functions are to be performed. A configuration file is provided to permit specification of standard options to be used.
The output produced by VX/Cpp is a printed report (on stderr) of what was found in the source file under the direction of the configuration file and switch settings. A cross-reference database file is also updated with the same information in tab-separated format that is useful for automatic processing. When a feature action code indicates that the code be changed, VX/Cpp produces a sed script (automatic edit script) of the changes to be applied.
Revision History
Related Documents
VX/Cpp Operation
Command Line
Table 1 VX/Cpp switch function codes
Table 2 VX/Cpp feature codes
Table 2 VX/Cpp feature codes used with f, d, i
Configuration File
Output
Printed Report
Database File
sed Script(s)
Appendix A - Feature Code Documentation01.01 Address of constantsAppendix B - Sample Configuration File Specification
01.02 Address of strings
02.01 Initializing structure members to run-time values
03.01 Variant struct/variant union usage
04.01 Assigning unions to union
05.02 #includes from a text library without quotes or angles
05.02 #includes using a logical name
05.03 #includes using VMS directory specification
05.04 #includes of files in multiple case/all caps
05.05 #include missing .h extension
05.06 #includes VMS-specific libraries for items available under Windows® NT and Linux/UNIX
05.07 use of .hxx instead of .h for systems includes C++ should be #ifdef (_DECCXX) around
05.08 missing .h files (one that might automatically be included on VMS, but not under Windows® NT and Linux/UNIX)
06.01 missing arguments in function calls
07.01 #dictionary
07.02 #module
07.03 #pragma (esp, standard, nonstandard)
07.04 using external modifiers (noshare, etc.) on variable declarations
08.01 size of arguments (Endian Issues)
08.02 type mismatches
08.03 using a long as a 32-bit integer
08.04 using longs when an address expression should be used
09.01 inconsistent case in function name or other identifiers (external variables, etc.)
10.01 function calls not supported by standard C (va_count)
10.02 use of vendor-specific compiler calls
10.03 use of additional fopen parameters
10.04 incompatible use of POSIX-defined types (stderr, etc.)
10.05 inconsistent declarations
10.06 hard-wired VMS file specifications
11.01 use of globalref
11.02 use of globaldef
11.03 use of globalvalue
11.04 use of symbolref
11.05 use of symboldef
12.01 #define using non-all uppercase characters
12.02 /*within comments blocks (style issue only)
13.01 use of _align storage class
13.02 structure packing
14.01 Pthread implementations
15.01 variable being used before set___-ambiguous return types
16.01 undefined return type (depending on compiler default)
16.02 mismatched return types
17.01 external routines not being declared or prototyped
18.01 Use of system service features that cannot be supported on Windows® NT and Linux/UNIX
19.01 Typecasting the left side of a statement
Revision History
1.0 Original Release
1.1 Q/A changes 11/19/96
Related Documents
POSIX v1.1 Sector7 C Code compliance recommendation manual
S7 VX/C v2.0 In-House Software Development Plan for VX/C, version 2.0.
VX/Cpp Operation
VX/Cpp is a utility for converting VAX/VMS C source code to ANSI C source code. Its function is to parse a C program source module in much the same manner as a C compiler. To wit, VX/Cpp accepts a command line and an environment that is very similar to the standard "cc" C compiler command for Linux/UNIX systems. #include statements within the C source code are processed in the same manner as the C preprocessor-compiler combination.
The following sections describe the operation of VX/Cpp and the output it produces.
Command Line
A command line for VX/Cpp has the format:
vxcpp [ switch_list ] file_name [ , file_name_list ]
switch_list is a list of switch names , separated by spaces and preceded by a "-" (minus sign). switch_list may be null. Valid switch names may be either C compiler switches or VX/Cpp switches. The switches control various optional functions of the program. Switch settings supersede settings in the configuration file.
VX/Cpp switches have the following format:
-X function switch_name
where function is one of:
| function | Meaning |
| f | Invoke the feature code given by switch_name at the fix level. |
| d | Invoke the feature code given by switch_name at the display level. |
| i | ignore the feature code given by switch_name . |
| o | Set the option code given by switch_name . |
Table 1 VX/Cpp switch function codes
Some examples of VX/Cpp command lines using VX/Cpp switches:
| vxcpp | -Xf 01.01 atest_file.c | {sets feature 01.01 to "fix"} |
| vxcpp | -Xo include_case upper btest.c | {if feature 05.04 is "fix", change name to all upper case} |
Table 2 VX/Cpp feature codes
| Feature | Meaning |
| 01.01 | Address of constant (a number) |
| 01.02 | Address of string |
| 02.01 | Initializing structure members to run-time values |
| 03.01 | Variant struct/variant union usage |
| 04.01 | Assigning unions to unions |
| 05.01 | #includes from a text library without quotes or angles |
| 05.02 | #includes using a logical name |
| 05.03 | #includes using VMS directory specification |
| 05.04 | #includes of files in multiple case/all caps |
| 05.05 | #includes missing .h extension |
| 05.06 | #includes of VMS-specific libraries for items available under Linux/UNIX. (i.e., UNIXlib.h) should be #ifdef (VMS) around |
| 05.07 | use of .hxx instead of .h for system includes for C should be #ifdef (VMS) around |
| 05.08 | missing .h files (ones that might "automatically" be included on VMS might not be under a flavor of UNIX) |
| 06.01 | missing arguments in function calls |
| 07.01 | #dictionary |
| 07.02 | #module |
| 07.03 | #pragma (esp, standard, nonstandard) |
| 07.04 | using extern modifiers (noshare, etc.) variable declarations |
| 08.01 | size of arguments - Endian Issues |
| 08.02 | type mismatches |
| 08.03 | using a long as a 32-bit integer |
| 08.04 | using longs when an address expression should be used |
| 08.05 | Storage class mismatches |
| 09.01 | inconsistent case in function names or other identifiers (external variables, etc.) |
| 10.01 | function calls not supported by standard "C" - va_count |
| 10.02 | use of vendor-specific compiler calls (vax$*, decc$*, etc.) vaxc$errno |
| 10.03 | use of additional fopen parameters |
| 10.04 | incompatible use of POSIX-defined types (stderr, etc.) |
| 10.05 | Inconsistent declarations |
| 10.06 | Hard-wired VMS file specifications |
| 11.01 | use of globalref |
| 11.02 | use of globaldef |
| 11.03 | use of globalvalue |
| 11.04 | use of symbolref |
| 11.05 | use of symboldef |
| 12.01 | #define using non-all uppercase characters |
| 12.02 | /* within comment block (style issue only) |
| 12.03 | #define names containing "$" |
| 12.04 | function names containing "$" |
| 13.01 | use of _align storage class |
| 13.02 | structure packing |
| 14.01 | pthreads - default attributes aren't the same |
| 15.01 | variable being used before set |
| 16.01 | undefined return type (depending on compiler default) |
| 16.02 | mismatched return types |
| 17.01 | external routines not being declared or prototyped |
| 18.01 | $crempsc specifying destination address and not using the supplied return address (i.e., requiring that return address = asking address) |
| 19.01 | Typecasting on left of assignment |
Table 2 (continued) Feature Codes used with f, d and i.
| Feature code applied | option code | option code value | |
| 05.04 | include_case | upper | make name upper case |
| include_case | lower | make name lower case | |
| include_case | ignore | ignore case of name | |
| 05.02 | include_logicals | normal | log_nam:xyz.h -> log_nam/xyz.h |
| include_logicals | remove | log_nam:xyz.h -> xyz.h | |
| 05.01 | include_ends | quote | name -> "name.h" |
| include_ends | angle | name -> <name.h> | |
| 05.06 | ignore_header | file name | Enclose header with #ifdef VMS |
| 07.03 | ignore_pragma | pragma string | Enclose pragma with #ifdef VMS |
| VX/Cpp Controls | change_file | file name | produce formatted list of changes |
| option_letter | single letter | change command line option letter (default is X) |
Table 3 Option code values
The following are the standard C compiler switches that are accepted by VX/Cpp. Most of the switches are simply accepted without affecting the program at all. The significant exception to this is the "-I" switch that specifies #include search path names and most of the warning (W) flags. Since VX/Cpp must parse the #include files, all pathnames must be specified.
- -I
- -include
- -imacros
- -iprefix
- -ifoutput
- -isystem
- -iwithprefix
- -o
- -pedantic
- -pedantic-errors
- -pcp
- -traditional
- -trigraphs
- -W[no-]trigraphs
- -W[no-]comment
- -W[no-]traditional
- -W[no-]import
- -W[no-]error
- -Wall
- -W[no-]implicit
- -W[no-]write-strings
- -W[no-]cast-qual
- -W[no-]bad-function-cast
- -W[no-]pointer-arith
- -W[no-]strict-prototypes
- -W[no-]missing-prototypes
- -W[no-]missing-declarations
- -W[no-]redundant-declarations
- -W[no-]nested-externs
- -W[no-]format
- -W[no-]char-subscripts
- -W[no-]conversion
- -W[no-]parentheses
- -W[no-]return-type
- -W[no-]missing-braces
- -M
- -MM
- -MD
- -MMD
- -d
- -g
- -v
- -H
- -D
- -A
- -U
- -C
- -E
- -P
- -$
- -nostdinc
- -u
- -f<whole_series>
Configuration File
The configuration file is a method for setting installation-wide or project-wide features and options. The configuration file is named ".vxcpp" and is looked for in, first the current directory , and then the $HOME directory. The configuration file is a plain text file. Each line on the file has the format:
action_code <white space> tag <white space> [ params .] # comment or | comment
action_codes would be one or more of the following (separated by commas).
- f fix this if you find it
- i ignore, do not change this
- d display only, no changes at all.
tag is either a feature code or an option code (see Table 1 and Table 2).
params are additional parameter information required for some option codes.
comments may be preceded with either a "#" or a "|". Parsing of the configuration file line terminates with either comment symbol.
A typical configuration file is included in Appendix B.
Output
There are three forms of output from VX/Cpp: a report printed on stderr , a database file of all features "fixed" or "displayed" and one or more sed scripts for installing the changes found by VX/Cpp.
Printed Report
The printed report shows all actions taken by VX/Cpp and all non-POSIX language constructs found. The format of an output line is a typical compiler error report. A sample of a report follows. The file name begins a line, followed by the line number being reported. What follows is a comment on what was changed or what was detected. The comments are self-explanatory.
testx1.c:7: display 08.04 integer used as pointer
testx1.c:17: display 08.02 Multiple character constant
testx1.c:26: fix 16.02 Mismatched return type
testx1.c:1: replace void with int
testx1.c:1: fix 16.02 Mismatched return type
testx1.c:32: display 02.01 Initialize to run-time values
testx1.c:45: display 19.01 Typecasting on left side of assignment
testx1.c:48: display 19.01 Typecasting on left side of assignment
testx1.c:51: display 04.01 Assign union to union
testx1.c:58: fix 16.01 Undefined return type
testx1.c:57: fix 16.01 Undefined return type
testx1.c:57: replace atest with int atest
testx1.c:58: warning: no previous prototype for `atest'
testx1.c:59: display 17.01 External function undeclared/unprototyped
testx1.c: In function `atest':
testx1.c:60: warning: `return' with no value, in function returning non-void
Database File
The database file is selected with the change_file option in the configuration file. Each record in the file is a tab-separated list of the data items file name, feature code and action code. Since it is a tab-separated file, several UNIX utilities may be used to manipulate the file.
sed Script(s)
For the feature codes that are set to fix ( f ), the changes to the source file are captured in a sed script file. The name of the sed script file is the same as the corresponding source file with ".sed" appended. In other words, if VX/Cpp is run against a source file named "sc_special_source.c" and that source #includes a file named "data_pattern.h", then two sed script files may be produced (depending on whether or not changes were detected). One file would be named "sc_special_source.c.sed" and the other would be named "data_pattern.h.sed". Those files will appear in the same directory as the corresponding original file.
To apply the changes produced in the sed script , the sed utility must be run with the following command line:
sed -f < sed_script_file> <source_file>
For the examples used above, the command lines are:
sed -f sc_special_source.c.sed sc_special_source.c > new_sc_special_source.c and
sed -f data_pattern.h.sed data_pattern.h > new_data_pattern.h.
Note that the output of sed must be re-directed in order to keep the changed source. The original input files are not changed. Since the sed script is an ordinary text file, it can be examined and modified using a conventional text editor.
Appendix A
This appendix documents the feature codes in more detail and indicates the nature of the changes that may be applied.
Problem
my_routine(&5);Solution
static int five=5; /* or other appropriate data type */
my_routine(&five);Problem
#DEFINE MY_CONST 5
my_routine(&MY_CONST);Solution
#DEFINE MY_CONST 5
static int Lit_MYCONST=MY_CONST; my_routine(&Lit_MYCONST);Problem
my_routine(&"MY string);Solution
my_routine("MY string");Problem
#DEFINE MY_STRING "My string" my_routine(&MY_STRING);Solution
#DEFINE MY_STRING "My string" my_routine(MY_STRING);02.01 Initializing structure members to run-time values
Problem
foo()
{
int a;
struct { int *b, int *c} d={&a,(int*)0}; }Solution
(detect only)Problem
#define DSC_DECL(Name,String)
struct {
char type;
char class;
short len;
char *ptr;} Name = { 14,1, strlen(String), String }
foo()
{
char *str = "my string"; DSC_DECL(str_dsc,str);
}Solution
(detect only)03.01 Variant struct/variant union usage
Problem
struct outer {
variant_struct inner1 {
long var1;
float var2;
};
variant_union inner2 {
long var3;
char var4[4];
};
};
long abc, def;
struct outer myvar;
abc = myvar.var1;
def = myvar.var3;Solution
struct outer {
struct inner1 {
long var1;
float var2;
};
union inner2 {
long var3;
char var4[4];
};
};
long abc, def;
struct outer myvar;
abc = myvar.inner1.var1;
def = myvar.inner2.var3;04.01 Assigning unions to union
Problem
union { char yrchar[4], long yr} year , lastyr; memcpy(year.yrchar, "1995 " ,4 ); lastyr = year;Solution
(detect only)05.02 #includes from a text library without quotes or angles
Problem
#include ssdefSolutions
#include <ssdef.h>
or#include "ssdef.h"05.02 #includes using a logical name
Problem
#include "app_includes:foo.h"Solutions
#include "app_includes/foo.h"
or better#include "foo.h"05.03 #includes using VMS directory specification
Problem
#include mydev:"[my.dir.incs]foo.h"Solutions
#include "my_includes/foo.h"
or
#include "foo.h"05.04 #includes of files in multiple case/all caps
Problems
#include "FOO.BAR"
or#include "Foo.Bar"Solution
#include "foo.bar" /* use of lower case characters only, no caps */05.05 #include missing .h extension
Problem
#include "foo"Solution
#include "foo.h"05.06 #includes of VMS specific libraries for items available under Windows® NT and Linux/UNIX
Problem
#include <UNIXlib.h>
#include <UNIXio.h>Solution
#if defined (vms)
#include <UNIXlib.h>
#include <UNIXio.h>
#endif05.07 use of .hxx instead of .h for systems includes for C++ should be #ifdef (__DECCXX) around
Problem
#include <iostream.hxx>Solution
#if defined (vms)
#include <iostream.hxx>
#else
#include <iostream.h>
#endif05.08 missing .h files (one's that might automatically be included on VMS, but not under Windows NT and Linux/UNIX
Problem
abc = getenv("SYS$LOGIN"); /* stdlib.h
*not* included */Solution:(note that we don't modify their comments)
#include <stdlib.h> /* S7 05.08 */ abc = getenv("SYS$LOGIN"); /* stdlib.h
*not* included */06.01 missing arguments in function calls
Problem
myroutine(a, b)
int a;
int b;
{
stuff .
}
more stuff .
myroutine( c );Solutions
that both arguments appear in the call myroutine( c, d );
or
myroutine( c, (void *)0); /* this assumes that the second
arguments is not required */
/* use (void *)0 for arguments by ref that are optionally
not present */
(detect only)
07.02 #moduleProblem
#module foo_routinesSolutions
#if defined(vms)
#module foo_routines
#endif
07.03 #pragma (esp, standard, nonstandard)
Problem
#pragma nonstandardSolution
#if defined (vms)
#pragma nonstandard
#endif07.04 using extern modifiers (noshare, etc) on variable declarations
Problem
int readonly extern w;
int extern readonly x;
int noshare extern y;
int extern noshare z;Solution
#ifdef (__vms)
int readonly extern w;
int extern readonly x;
int noshare extern y;
int extern noshare z;
#else
int extern w;
int extern x;
int extern y;
int extern z;
#endif08.01 size of arguments(Endian issues)
VX/Cpp will automatically detect and fix all endian argument errors where a prototype of the called bunction has been supplied.
Case: (short *) given (&long) S7L2C(long)
Case: (char *) given (&long) S7L2B(long)
Case: (char *) given (&short) S7S2C(char)Problem
myroutine( a, b )
int *a;
short *b; /* long ints are not allowed . May be altered by
Sector7 preprocessor to int */
{
stuff .
}
more stuff .
another(c, d)
int c;
long d;
{ myroutine(&c, &d);
}Solution
the following between the last set of curly brackets
{ myroutine(&c,S7L2S(d));
/* the offending address is enclosed in a macro
call that the user supplies. */
VX/Cpp will automatically detect and fix all endian argument errors where a prototype of the called bunction has been supplied.
Case: (short *) given (&long) S7L2C(long)
Case: (char *) given (&long) S7L2B(long)
Case: (char *) given (&short) S7S2C(char)
Problem
myroutine( short int tag )
switch (tag) {
case 'XX':
}Solution
(detect only)08.03 using a long as a 32-bit integer
Problem
struct {int val; int cnt; } b;
long c; /* longs are not allowed */
c = b.val;Solution
(detect only)08.04 using longs when an address expression should be used
Problem
char *a = "abcd";
long FourthCharOf_a = a + 4 ;Solution
(detect only)09.01 inconsistent case in function name or other identifiers (external variables, etc.)
Problem
defined
Myroutine(a , b )
call
myroutine(c ,d );Solution
that each definition, prototype and call be consistent10.01 function calls not supported by standard C (va_count)
Problem
va_countSolution
(detect only)10.02 use of vendor specific compiler calls
10.03 use of additional fopen parameters
10.04 incompatible use of POSIX-defined types(stderr, etc.)
10.05 Inconsistent declarations
10.06 hard-wired VMS file specifications
Problem
mod1.c:
globalvalue FAILURE = 0,EOF =1;
globaldef{"psect_name"} int x = 2;
mod2.c:
globalvalue FAILURE, EOF;
globaldef int x;Solutions
mod1.c:
int FAILURE = 0;
int EOF = 1; int x =2 ;
mod2.c:
extern int FAILURE ;
extern int EOF;
extern int x ;
12.01 #define using non-all uppercase characters
all upper case characters be used12.02 /*within comments blocks (style issue only)
13.01 use of _align storage class
Problem
struct str {
char value 1;
int value2;
}; str _align(QUADWORD) data1;
str _align(3) data2;Solutions
that _align not be usedPthread implementations provide default initialization macros. The default values are not the same between different POSIX implementations (they are based on different draft releases ). All values should be explicitly set rather than using the macros.Problem
pthread_cond_init(cond,pthread_condattr_default); /*
default initializer */Solution
(detect only)15.01 variable being used before set - Ambiguous return types
Problem
myroutine( int c )
int a, b;
b = c + a;Solution
DON'T DO THIS! (Will need to be fixed by hand)16.01 undefined return type (depending on compiler default)
Problem
myroutine(int param1, int param2)Solution
int myroutine(int param1, int param2)Problem
void myroutine( int a, int b); /* Prototype */
int myroutine( int a, int b) /* Instantiation */Solution
int myroutine( int a, int b); /* Prototype */
int myroutine( int a, int b) /* Instantiation */
17.01 external routines not being declared or prototyped
Problem
int abc, foo;
abc = ext_routine( foo ); /* External routine not declared */Solution:
(detect only)18.01 Use of system service features that cannot be supported under Linux/UNIX
19.01 Typecasting the left side of a statement
Problem
void *a;
char *b;
int **c;
a = b; /* OK */
a = (void *)b; /* OK */
(char *)a = b; /* NOT OK, USE ABOVE*/
*(char *)a = 'b' /* OK, not Modifying a only what it points to */
Solution
(detect only)
Appendix B
# VX/Cpp Configuration File
# =========================
#
# This file is divided into two sections. Section 1
# features implemented by VX/Cpp. Section 2
# or values for certain features.
# The format of a configuration line is:
# <action_code> <tag> [<value>]
# where <action_code> is one of the following:
# d[isplay] - display occurrences of this condition
# o[ption] - apply this option iff its feature if fix'd
# <tag> is one of the feature codes or one of
# <value> is a value to use for this option.
# not required on all configuration lines.
# the spaces between the configuration line tokens
# ANSII character(s), except for new-line (\n).
# first non-white-space character on the line.
# Comments may appear at any position in a line. The
# "|" function identically; the remainder
# commentary and is skipped by the parser. A blank
# comment.
# The "Lvl" column indicates the "highest" level of <action_code> permitted
# for this feature. The hierarchy is f > d > i, thus a level of "f"
# permits "f", "d", or "i" while a level of "i" permits only
#---------------------------------------------------------------------------------
#================================================================================
# Section 1 Section 1 Section 1 Section 1 Section 1 Section 1
# Section 1 Section 1 Section 1 Section 1 Section 1 Section 1
# Section 1 Section 1 Section 1 Section 1 Section 1 Section 1
# Section 1 Section 1 Section 1 Section 1 Section 1 Section 1
#================================================================================
#---- ------- --- ---------------------------------------------------------
f 01.01 |f Address of constant (a number)
d 02.01 |d Initializing structure members to run-time values
d 03.01 |f Variant struct/variant union usage
d 04.01 |d Assigning unions to unions
# Header file issues
f 05.01 |f #includes from a text library w/o quotes or angles
f 05.02 |f #includes using a logical name
f 05.03 |f #includes using VMS directory spec
f 05.04 |f #includes of files in multiple case/all caps
f 05.05 |f #includes missing .h extension
f 05.06 |f #includes of VMS-specific libraries for items available
# under UNIX (i.e., UNIXlib.h) should be #ifdef (VMS) around
f 05.07 |f use of .hxx instead of .h for system includes for C++
# should be #ifdef (VMS) around
f 05.08 |f missing .h files (ones that might 'automatically' be
# included on VMS might not be under a flavor of UNIX)
f 06.01 |f missing arguments in function calls
# Compiler-specific built-ins not supported on all platforms
d 07.01 |d #dictionary
f 07.02 |f #module
f 07.03 |f #pragma (esp, standard, nonstandard)
f 07.04 |f using extern modifiers (noshare, etc.) on
# variable declarations
# Inconsistent usage of element types
f 08.01 |f size of arguments
d 08.02 |d type mismatches
d 08.03 |d using a long as a 32-bit integer
d 08.04 |d using longs when an address expression should be used
d 08.05 |d Storage class mismatches
i 09.01 |i inconsistent case in function names or other identifiers
# (external variables, etc.)
# Making use of operating system extensions to standard parts
f 10.01 |f function calls not supported by standard "C" - va_count
i 10.02 |i use of vendor-specific compiler calls
# (vax$*, decc$*, etc.) vaxc$errno
i 10.03 |i use of additional fopen parameters
i 10.04 |i incompatible use of POSIX-defined types (stderr, etc.)
i 10.05 |i Inconsistent declarations
i 10.06 |i Hard-wired VMS file specifications
# Compiler-specific memory management tools
f 11.01 |f use of globalref
f 11.02 |f use of globaldef
f 11.03 |f use of globalvalue
d 11.04 |d use of symbolref
d 11.05 |d use of symboldef
# Style issues
f 12.01 |f #define using non-all uppercase characters
i 12.02 |i /* within comment block (style issue only)
d 12.03 |f #define names containing "$"
d 12.04 |f function names containing "$"
# Data alignment and packing issues
f 13.01 |f use of _align storage class
d 13.02 |d structure packing
d 14.01 |d pthreads - default attributes aren't the same
# Bugs
i 15.01 |i variable being used before set
# Ambiguous return types
f 16.01 |f undefined return type (depending on compiler default)
f 16.02 |f mismatched return types
d 17.01 |d external routines not being declared or prototyped
i 18.01 |i $crempsc specifying destination address and not using
# the supplied return address (i.e., requiring that return
# address = asking address)
d 19.01 |d Typecasting on left of assignment
#================================================================================
# Section 2 Section 2 Section 2 Section 2 Section 2 Section 2
# Section 2 Section 2 Section 2 Section 2 Section 2 Section 2
# Section 2 Section 2 Section 2 Section 2 Section 2 Section 2
# Section 2 Section 2 Section 2 Section 2 Section 2 Section 2
#================================================================================
#Code Option Name Value Description
#---- --------------------- ------ -----------------------------------------
# Feature 05.04
#o include_case upper | make name upper case
o include_case lower | make name lower case
#o include_case ignore | ignore case of name
# Feature 05.02
#o include_logicals normal | log_nam:xyz.h -> log_nam/xyz.h
o include_logicals remove | log_nam:xyz.h -> xyz.h
# Feature 05.01
o include_ends quote | name -> "name.h"
#o include_ends angle | name -> <name.h>
# Feature 05.06 (may be none, one, or more ignore_header options)
o ignore_header file.h | Enclose header with #ifdef VMS
o ignore_header sysvms.h
# Feature 07.03 (may be none, one, or more ignore_pragma options)
o ignore_pragma pragma_string | Enclose pragma with #ifdef VMS
o ignore_pragma removex
# Controls for VX/Cpp
o input *.bak | input.c ->input.c.bak; input.c
o output *.new | input.c ->input.c; input.c.new
o prototype /dev/nul | do not create prototype file
o prototype /home/me/my_proto.h | put prototype file here
o replace fopen s7open | replace function fopen with s7open
o ifdef_orig S7VXC | bracket original with #ifndef S7VXC
o ifdef_orig | do not save original code
o change_file change | produce formatted list of changes
o option_letter H | change command line option letter (default is X)

