ctarbide / qm4

Quasar M4 (fork)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

C. Tarbide <ctarbide@tuta.io> - February 2022

This fork starts from [1], I intend to incorporate improvements from

To clean, build and install, all in one go, issue:

    make PREFIX="${HOME}/local" CC=gcc CFLAGS=-Wall clean qm4 install

Append "-DDEBUG -g" to CFLAGS to debug.

Quasar M4 is available under the same BSD license as the BSD M4 from
which it is derived. And so is any of the changes incoporated by this

- [1]: http://haddonthethird.net/m4/m4-2.tar.bz2
- [2]: http://haddonthethird.net/m4/


William Haddon <william@haddonthethird.net> - January 2015

This is a port of FreeBSD's implementation of m4. The code is much simpler and
more lightweight than GNU m4, however I have re-implemented nearly all GNU m4
features. Unlike the FreeBSD implementation, this implementation's GNU
compatibility features are on by default and can not be turned off. The code
has been tested on several C library implementations for Linux. I have no
interest in porting to proprietary or non Unix-like systems. It is BSD licensed
-- see the manual or the individual source code files for details.

This m4 can be compiled by the sequence make; make install . There is no
configure script. Options that are usually passed to the configure script can
be passed to either the make command or the make install command. The make
command accepts the arguments CC, CFLAGS, and LDFLAGS, specifying the C
compiler to use, the flags to pass to the C compiler when compiling, and the
flags to pass to the C compiler when linking, respectively, for example
make CC=pcc CFLAGS=-O4 LDFLAGS=-I/usr/local/share/musl/include . The make
install command accepts the arguments DESTDIR and PREFIX, both specifying the
directory into which the binary will be installed; for example,
make DESTDIR=/home/user/staging_directory PREFIX=/usr install
will install the binary into the /home/user/staging_directory/usr/bin directory
with the expectation that the contents of the /home/user/staging_directory
directory will be copied to the root directory of the target system, so that
the binary will be found in the /usr/bin directory of the target system.

Below are the contents of the NOTES file that came with the BSD m4 from which
this m4 is derived.


m4 - macro processor

PD m4 is based on the macro tool distributed with the software 
tools (VOS) package, and described in the "SOFTWARE TOOLS" and 
"SOFTWARE TOOLS IN PASCAL" books. It has been expanded to include 
most of the command set of SysV m4, the standard UN*X macro processor.

Since both PD m4 and UN*X m4 are based on SOFTWARE TOOLS macro,
there may be certain implementation similarities between
the two. The PD m4 was produced without ANY references to m4

written by: Ozan S. Yigit


	Software Tools distribution: macro

	Kernighan, Brian W. and P. J. Plauger, SOFTWARE
	TOOLS IN PASCAL, Addison-Wesley, Mass. 1981

	Kernighan, Brian W. and P. J. Plauger, SOFTWARE
	TOOLS, Addison-Wesley, Mass. 1976

	Kernighan, Brian W. and Dennis M. Ritchie,
	THE M4 MACRO PROCESSOR, Unix Programmer's Manual,
	Seventh Edition, Vol. 2, Bell Telephone Labs, 1979

	System V man page for M4

Implementation Notes:

[1]	PD m4 uses a different (and simpler) stack mechanism than the one 
	described in Software Tools and Software Tools in Pascal books. 
	The triple stack thing is replaced with a single stack containing 
	the call frames and the arguments. Each frame is back-linked to a 
	previous stack frame, which enables us to rewind the stack after 
	each nested call is completed. Each argument is a character pointer 
	to the beginning of the argument string within the string space.
	The only exceptions to this are (*) arg 0 and arg 1, which are
	the macro definition and macro name strings, stored dynamically
	for the hash table.

	    .					   .
	|   .	|  <-- sp			|  .  |
	+-------+				+-----+
	| arg 3 ------------------------------->| str |
	+-------+				|  .  |
	| arg 2 --------------+ 		   .
	+-------+	      |
	    *		      |			|     |
	+-------+	      | 		+-----+
	| plev	|  <-- fp     +---------------->| str |
	+-------+				|  .  |
	| type	|				   .
	| prcf	-----------+		plev: paren level
	+-------+  	   |		type: call type
	|   .	| 	   |		prcf: prev. call frame
	    .	   	   |
	+-------+	   |
	|	<----------+


Quasar M4 (fork)


Language:C 71.7%Language:M4 18.5%Language:Roff 9.5%Language:Makefile 0.3%