/* Copyright (c) 1979 Regents of the University of California */
static char sccsid
[] = "@(#)pmerge.c 1.4 %G%";
#define TMPNAME "/usr/tmp/MGXXXXXX"
FILE *curfile
; /* current output file */
char labelopen
= FALSE
, constopen
= FALSE
, typeopen
= FALSE
, varopen
= FALSE
;
* Remove temporary files if interrupted
for (i
= 0; i
< NUMFILES
; i
++)
* Program to merge separately compiled pascal modules into a
* single standard Pascal program.
FILE *incl
[MAXINCL
]; /* include stack */
long inclcnt
= 0; /* incl index */
char *name
[MAXNAM
]; /* include names seen so far */
long namcnt
= 0; /* next name ptr slot available */
char *nambuf
; /* string table for names */
char line
[BUFSIZ
]; /* input line buffer */
char *next
; /* next name space available */
FILE *input
= stdin
; /* current input file */
long ac
= 0; /* argv index */
char **cpp
, *cp
, *fp
;/* char ptrs */
char quote
; /* include quote character */
for (i
= 0; i
< MAXNAM
; i
++)
curfile
= files
[PRGFILE
] = fopen(names
[PRGFILE
] = mktemp(TMPNAME
), "w");
files
[LABELFILE
] = fopen(names
[LABELFILE
] = mktemp(TMPNAME
), "w");
files
[CONSTFILE
] = fopen(names
[CONSTFILE
] = mktemp(TMPNAME
), "w");
files
[TYPEFILE
] = fopen(names
[TYPEFILE
] = mktemp(TMPNAME
), "w");
files
[VARFILE
] = fopen(names
[VARFILE
] = mktemp(TMPNAME
), "w");
files
[RTNFILE
] = fopen(names
[RTNFILE
] = mktemp(TMPNAME
), "w");
files
[BODYFILE
] = fopen(names
[BODYFILE
] = mktemp(TMPNAME
), "w");
for (i
= 0; i
< NUMFILES
; i
++)
if ((nambuf
= malloc(BUFSIZ
)) == NULL
) {
fputs("no space for string table\n", stderr
);
} else if (++ac
< argc
) {
input
= freopen(argv
[ac
], "r", input
);
fgets(line
, BUFSIZ
, input
);
fgets(line
, BUFSIZ
, input
);
for (cp
= &line
[1]; isspace(*cp
); cp
++)
if (strncmp("include", cp
, 7))
for (cp
+= 7; isspace(*cp
); cp
++)
if (*cp
!= '\'' && *cp
!= '"')
if (&nambuf
[BUFSIZ
] < next
+ strlen(cp
)) {
if ((nambuf
= malloc(BUFSIZ
)) == NULL
) {
fputs("no space for string table\n",
for (fp
= next
, quote
= *cp
++;
*cp
!= '\0' && *cp
!= quote
; )
(fp
[-1] != 'i' || fp
[-1] != 'h') &&
for (cpp
= name
; *cpp
< next
&& strcmp(*cpp
, next
); )
if (inclcnt
== MAXINCL
) {
fputs("include table overflow\n",
if (++namcnt
== MAXNAM
) {
fputs("include name table overflow\n",
input
= fopen(next
, "r");
fgets(line
, BUFSIZ
, input
);
fputs("bad include format:", stderr
);
* Split up output into the approprite files
char incom
= FALSE
; /* TRUE => in comment */
char incur
= FALSE
; /* TRUE => in (* *) style comment */
char inbrac
= FALSE
; /* TRUE => in { } style comment */
char instr
= FALSE
; /* TRUE => in quoted string */
char inprog
= FALSE
; /* TRUE => program statement has been found */
int beginnest
= 0; /* routine nesting level */
int nest
= 0; /* begin block nesting level */
int paren_level
= 0; /* nesting level of parentheses */
char ch1
, *cp
; /* input window */
char *word
; /* ptr to current word */
int len
; /* length of current word */
char prt
= TRUE
; /* TRUE => print current word */
if (incur
&& ch1
== '*') {
if (incom
|| !isalpha(*cp
)) {
if (len
== 5 && !strncmp(word
, "begin", 5)) {
if (nest
== 0 && beginnest
== 0) {
"improper program body");
curfile
= files
[BODYFILE
];
if (len
== 4 && !strncmp(word
, "case", 4)) {
if (len
== 5 && !strncmp(word
, "const", 5)) {
curfile
= files
[CONSTFILE
];
if (len
== 3 && !strncmp(word
, "end", 3)) {
fprintf(stderr
, "too many end statements");
if (len
== 8 && !strncmp(word
, "external", 8)) {
fputs("forward", curfile
);
if (len
== 8 && !strncmp(word
, "function", 8)) {
curfile
= files
[RTNFILE
];
if (len
== 7 && !strncmp(word
, "forward", 7)) {
if (len
== 5 && !strncmp(word
, "label", 5)) {
curfile
= files
[LABELFILE
];
if (len
== 9 && !strncmp(word
, "procedure", 9)) {
curfile
= files
[RTNFILE
];
if (len
== 7 && !strncmp(word
, "program", 7)) {
fprintf(stderr
, "improper program nesting");
curfile
= files
[PRGFILE
];
if (len
== 4 && !strncmp(word
, "type", 4)) {
curfile
= files
[TYPEFILE
];
if (len
== 3 && !strncmp(word
, "var", 3)) {
curfile
= files
[VARFILE
];
fprintf(curfile
, "%.*s", len
, word
);
* Print out the merged result
for(i
= 0; i
< NUMFILES
; i
++) {
fp
= freopen(names
[i
], "r", files
[i
]);