home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-387-Vol-3of3.iso
/
m
/
m4v05as.zip
/
M4.H
< prev
next >
Wrap
C/C++ Source or Header
|
1992-02-22
|
9KB
|
350 lines
/*
* GNU m4 -- A simple macro processor
* Copyright (C) 1989, 1990 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 1, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
* MS-DOS port (c) 1990 by Thorsten Ohl, ohl@gnu.ai.mit.edu
* This port is also distributed under the terms of the
* GNU General Public License as published by the
* Free Software Foundation.
*
* Please note that this file is not identical to the
* original GNU release, you should have received this
* code as patch to the official release.
*
* $Header: e:/gnu/m4/RCS/m4.h 0.5.1.0 90/09/28 18:35:05 tho Exp $
*/
#include <stdio.h>
#include <ctype.h>
#ifdef MSDOS
#include <stdarg.h>
#else
#include <varargs.h>
#endif
#include "obstack.h"
#ifdef MSDOS
#include <stdlib.h>
#else /* not MSDOS */
extern char *malloc();
extern char *realloc();
extern void free();
extern char *mktemp();
extern int mkstemp();
#endif /* not MSDOS */
#ifdef USG
#include <string.h>
#define index(s, c) strchr((s), (c))
#define rindex(s, c) strrchr((s), (c))
#include <memory.h>
#define bcmp(s1, s2, n) memcmp ((s1), (s2), (n))
#define bzero(s, n) memset ((s), 0, (n))
#define bcopy(s, d, n) memcpy ((d), (s), (n))
#else /* not USG */
#include <strings.h>
extern int bcmp ();
extern void bzero (), bcopy ();
#endif /* USG */
#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free xfree
#define nil 0
typedef enum boolean { false = 0, true = 1 } boolean;
#ifndef MSDOS
extern int errno;
extern int sys_nerr;
extern char *sys_errlist[];
#endif /* not MSDOS */
#define syserr() ((errno > 0 && errno < sys_nerr) ? sys_errlist[errno] : "Unknown error")
/* miscellaneous, that must be first */
typedef void builtin_func();
/* File: m4.c --- global definitions*/
/* Option flags */
extern int interactive; /* -e */
extern int sync_output; /* -s */
extern int debug_level; /* -d */
extern int hash_table_size; /* -H */
extern int no_gnu_extensions; /* -g */
/* Error handling */
#ifdef MSDOS
extern void warning (char *fmt, ...);
extern void error (char *fmt, ...);
extern void fatal (char *fmt, ...);
extern void internal_error (char *fmt, ...);
#else /* not MSDOS */
extern void warning();
extern void error();
extern void fatal();
extern void internal_error();
#endif /* not MSDOS */
/* Memory allocation */
#ifdef MSDOS
extern char *xmalloc (unsigned int size);
extern void xfree (char *p);
extern char *xstrdup (char *s);
#else /* not MSDOS */
extern char *xmalloc();
extern char *xrealloc();
extern void xfree();
extern char *xstrdup();
#endif /* not MSDOS */
/* File: input.c --- lexical definitions */
/* Various different token types */
enum token_type {
TOKEN_EOF, /* end of file */
TOKEN_STRING, /* a quoted string */
TOKEN_WORD, /* an identifier */
TOKEN_SIMPLE, /* a single character */
TOKEN_MACDEF, /* a macros definition (see "defn") */
};
/* The amount of data for a token, a macro argument, and a macro definition */
enum token_data_type {
TOKEN_VOID,
TOKEN_TEXT,
TOKEN_FUNC,
};
struct token_data {
enum token_data_type type;
union {
char *text;
builtin_func *func;
} u;
};
#define TOKEN_DATA_TYPE(td) ((td)->type)
#define TOKEN_DATA_TEXT(td) ((td)->u.text)
#define TOKEN_DATA_FUNC(td) ((td)->u.func)
typedef enum token_type token_type;
typedef enum token_data_type token_data_type;
typedef struct token_data token_data;
#ifdef MSDOS
extern void input_init (void);
extern int peek_input (void);
extern enum token_type next_token (struct token_data *td);
extern void skip_line (void);
#else /* not MSDOS */
extern void input_init();
extern int peek_input();
extern token_type next_token();
extern void skip_line();
#endif /* not MSDOS */
/* push back input */
#ifdef MSDOS
extern void push_file (FILE *fp, char *title);
extern void push_macro (void (*func) ());
extern struct obstack *push_string_init (void);
extern char *push_string_finish (void);
extern void push_wrapup (char *s);
extern enum boolean pop_wrapup (void);
#else /* not MSDOS */
extern void push_file();
extern void push_macro();
extern void push_string();
extern struct obstack *push_string_init();
extern char *push_string_finish();
extern void push_wrapup();
extern boolean pop_wrapup();
#endif /* not MSDOS */
/* current input file, and line */
extern char *current_file;
extern int current_line;
/* left and right quote, begin and end comment */
extern char lquote, rquote, bcomm, ecomm;
#define DEF_LQUOTE '`'
#define DEF_RQUOTE '\''
#define DEF_BCOMM '#'
#define DEF_ECOMM '\n'
/* File: output.c --- output functions */
extern int output_lines;
extern int output_current_line;
#ifdef MSDOS
extern void output_init (void);
extern void sync_line (int line, char *file);
extern void shipout_text (struct obstack *obs, char *text);
extern void make_divertion (int divnum);
extern void insert_divertion (int divnum);
#else /* not MSDOS */
extern void output_init();
extern void sync_line();
extern void shipout_text();
extern void make_divertion();
extern void insert_divertion();
#endif /* not MSDOS */
/* File symtab.c --- symbol table definitions */
/* Operation modes for lookup_symbol() */
enum symbol_lookup {
SYMBOL_LOOKUP,
SYMBOL_INSERT,
SYMBOL_DELETE,
SYMBOL_PUSHDEF,
SYMBOL_POPDEF,
};
/* Symbol table entry */
struct symbol {
struct symbol *next;
boolean traced;
boolean shadowed;
boolean macro_args;
char *name;
token_data data;
};
#define SYMBOL_NEXT(s) ((s)->next)
#define SYMBOL_TRACED(s) ((s)->traced)
#define SYMBOL_SHADOWED(s) ((s)->shadowed)
#define SYMBOL_MACRO_ARGS(s) ((s)->macro_args)
#define SYMBOL_NAME(s) ((s)->name)
#define SYMBOL_TYPE(s) (TOKEN_DATA_TYPE(&(s)->data))
#define SYMBOL_TEXT(s) (TOKEN_DATA_TEXT(&(s)->data))
#define SYMBOL_FUNC(s) (TOKEN_DATA_FUNC(&(s)->data))
typedef enum symbol_lookup symbol_lookup;
typedef struct symbol symbol;
#ifdef MSDOS
typedef void hack_symbol(symbol *sym, char *data);
#else /* not MSDOS */
typedef void hack_symbol();
#endif /* not MSDOS */
#define HASHMAX 509 /* Default, overridden by -Hsize */
extern symbol **symtab;
#ifdef MSDOS
extern void symtab_init (void);
extern struct symbol *lookup_symbol (char *name, enum symbol_lookup mode);
extern void hack_all_symbols (hack_symbol *func, char *data);
#else /* not MSDOS */
extern void symtab_init();
extern symbol *lookup_symbol();
extern hack_symbol hack_all_symbols();
#endif /* not MSDOS */
/* File: macro.c --- macro expansion */
#ifdef MSDOS
extern void expand_input (void);
#else /* not MSDOS */
extern void expand_input();
#endif /* not MSDOS */
/* File: builtin.c --- builtins */
struct builtin {
char *name;
boolean gnu_extension;
boolean groks_macro_args;
builtin_func *func;
};
struct predefined {
char *name;
boolean gnu_extension;
char *func;
};
typedef struct builtin builtin;
typedef struct predefined predefined;
#ifdef MSDOS
extern void builtin_init (void);
extern void define_user_macro (char *name, char *text,\
enum symbol_lookup mode);
extern void undivert_all (void);
extern void expand_user_macro (struct obstack *obs, struct symbol *sym,\
int argc, struct token_data **argv);
#else /* not MSDOS */
extern void builtin_init();
extern void define_user_macro();
extern void undivert_all();
extern void expand_user_macro();
#endif /* not MSDOS */
/* File: eval.c --- expression evaluation */
#ifdef MSDOS
typedef long eval_t; /* use 32-bit arithmetic */
extern enum boolean evaluate (char *expr, eval_t *val); /* eval.c */
#else /* not MSDOS */
typedef int eval_t;
extern boolean evaluate();
#endif /* not MSDOS */
/* Debug stuff */
#ifdef DEBUG
#define DEBUG_INPUT
#define DEBUG_MACRO
#define DEBUG_SYM
#endif
/* Obstack stuff. */
#ifdef MSDOS
extern void _obstack_free (struct obstack *h, void *obj);
extern void _obstack_begin (struct obstack *h, int size, int alignment,\
void * (*chunkfun) (unsigned int size),\
void (*freefun) (char *p));
extern void _obstack_newchunk (struct obstack *h, int length);
extern int _obstack_allocated_p (struct obstack *h, void *obj);
#endif /* MSDOS */