home: hub: 9ficl

ref: 0a10ee45dab0f0730216621719bb61a99e6ecae8
dir: /softwords/softcore.py/

View raw version
#! python
# Convert forth source files to a giant C string

import re;
import sys;
import time;


print """/*******************************************************************
** s o f t c o r e . c
** Forth Inspired Command Language - 
** Words from CORE set written in FICL
** Author: John Sadler (john_sadler@alum.mit.edu)
** Created: 27 December 1997
** Last update: """ + time.ctime(time.time()) + """
*******************************************************************/
/*
** DO NOT EDIT THIS FILE -- it is generated by softwords/softcore.pl
** Make changes to the .fr files in ficl/softwords instead.
** This file contains definitions that are compiled into the
** system dictionary by the first virtual machine to be created.
** Created automagically by ficl/softwords/softcore.pl 
*/
/*
** Copyright (c) 1997-2001 John Sadler (john_sadler@alum.mit.edu)
** All rights reserved.
**
** Get the latest Ficl release at http://ficl.sourceforge.net
**
** I am interested in hearing from anyone who uses ficl. If you have
** a problem, a success story, a defect, an enhancement request, or
** if you would like to contribute to the ficl release, please send
** contact me by email at the address above.
**
** L I C E N S E  and  D I S C L A I M E R
** 
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions
** are met:
** 1. Redistributions of source code must retain the above copyright
**    notice, this list of conditions and the following disclaimer.
** 2. Redistributions in binary form must reproduce the above copyright
**    notice, this list of conditions and the following disclaimer in the
**    documentation and/or other materials provided with the distribution.
**
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
** ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
** SUCH DAMAGE.
*/


#include "ficl.h"

static char softWords[] = 
#if FICL_WANT_SOFTWORDS"""

escapedQuotes = re.compile( r'^"(.*)"$' )
backslash = re.compile( r'^(.*[^\s])\s+\\(\s+[^\s].*)$' )
parentheses = re.compile( r'^(.*[^\s])\s+\(\s[^)]+\)(\s+[^\s].*)?$' )


commenting = 0;

for a in (sys.argv[1:]):
	f = open(a)
	for line in f.readlines():

		# trim all whitespace
		line = line.strip();

		# remove quotes around quoted lines
		quoted = escapedQuotes.match(line)
		if (quoted != None):
			line = quoted.group(1).strip()

		#
		# emit lines beginnning with "\ **" as C comments
		#
		if (line[0:4] == "\\ **"):
			if (commenting == 0):
				print("/*")
			commenting = 1
			print(line[2:])
			continue

		if (commenting == 1):
			print "*/"

		commenting = 0

		# ignore empty lines
		if (len(line) == 0):
			continue

		# pass commented preprocessor directives
		# == lines starting with "\ #"
		# (supports single line directives only)
		if (line[0:3] == "\\ #"):
			print(line[2:]) # include the leading #!
			continue

		# ignore remaining lines starting with comments
		if (line[0] == "\\"):
			continue

		# remove trailing comments
		trailingComment = backslash.match(line)
		if (trailingComment != None):
			line = trailingComment.group(1)

		# remove ( comments ) in the middle
		embeddedComment = parentheses.match(line)
		if (embeddedComment != None):
			line = embeddedComment.group(1)
			if (embeddedComment.lastindex >= 2):
				line = line + " " + embeddedComment.group(2).strip()

		# quote double-quote characters
		line = line.replace("\"", "\\\"")

		# emit whatever's left as quoted string fragments
		print("    \"" + line + " \"");


print """#endif /* WANT_SOFTWORDS */
    "quit ";


void ficlCompileSoftCore(FICL_SYSTEM *pSys)
{
    FICL_VM *pVM = pSys->vmList;
    CELL id = pVM->sourceID;
    int ret = sizeof (softWords);
    assert(pVM);
    pVM->sourceID.i = -1;
    ret = ficlExec(pVM, softWords);
    pVM->sourceID = id;
    if (ret == VM_ERREXIT)
        assert(FALSE);
    return;
}


"""