Ported Ficl to NuttX apps/

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3584 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2011-05-10 18:18:19 +00:00
parent 1141cc4cc6
commit 704fd479f8
7 changed files with 295 additions and 3 deletions

View File

@ -33,6 +33,7 @@
6.3 2011-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr>
* apps/interpreter: Add a directory to hold interpreters. The Pascal add-
* apps/interpreter: Add a directory to hold interpreters. The Pascal add-
on module now installs and builds under this directory.
* apps/interpreter/ficl: Added logic to build Ficl (the "Forth Inspired
Command Language"). See http://ficl.sourceforge.net/.

View File

@ -37,7 +37,7 @@
# Sub-directories containing interpreter runtime
SUBDIRS = pcode
SUBDIRS = pcode ficl
# Create the list of installed runtime modules (INSTALLED_DIRS)

118
interpreters/ficl/Makefile Normal file
View File

@ -0,0 +1,118 @@
############################################################################
# apps/interpreters/ficl/Makefile
#
# Copyright (C) 2011 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
#
# 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.
# 3. Neither the name NuttX nor the names of its contributors may be
# used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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
# COPYRIGHT OWNER 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.
#
############################################################################
BUILDDIR := ${shell pwd | sed -e 's/ /\\ /g'}
-include $(TOPDIR)/.config
-include $(TOPDIR)/Make.defs
include $(APPDIR)/Make.defs
# Tools
INCDIR = $(TOPDIR)/tools/incdir.sh
ifeq ($(WINTOOL),y)
INCDIROPT = -w
endif
# Include paths
CFLAGS += ${shell $(INCDIR) $(INCDIROPT) "$(CC)" $(BUILDDIR)/$(FICL_SUBDIR) $(BUILDDIR)/src}
# Source Files
ASRCS =
CXXSRCS =
CSRCS = nuttx.c
include Make.srcs
ASRCS += $(FICL_ASRCS)
CXXSRCS += $(FICL_CXXSRCS)
CSRCS += $(FICL_CSRCS)
AOBJS = $(ASRCS:.S=$(OBJEXT))
COBJS = $(CSRCS:.c=$(OBJEXT))
SRCS = $(ASRCS) $(CSRCS)
OBJS = $(AOBJS) $(COBJS)
ifeq ($(WINTOOL),y)
BIN = "${shell cygpath -w $(APPDIR)/libapps$(LIBEXT)}"
else
BIN = "$(APPDIR)/libapps$(LIBEXT)"
endif
ROOT_DEPPATH = --dep-path .
SRC_DEPPATH = --dep-path src
VPATH = src:$(FICL_SUBDIR)
all: .built
.PHONY: debug context depend clean distclean
$(AOBJS): %$(OBJEXT): %.S
$(call ASSEMBLE, $<, $@)
$(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
debug:
@#echo "FICL: $(FICL_SUBDIR)"
@#echo "VPATH: $(VPATH)"
@#echo "CFLAGS: $(CFLAGS)"
.built: debug $(OBJS)
@( for obj in $(OBJS) ; do \
$(call ARCHIVE, $(BIN), $${obj}); \
done ; )
@touch .built
context:
.depend: debug Makefile $(SRCS)
@$(MKDEP) $(ROOT_DEPPATH) $(SRC_DEPPATH) $(FICL_DEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
@touch $@
depend: .depend
clean:
@rm -f *.o *~ .*.swp .built
$(call CLEAN)
distclean: clean
@rm -f Make.dep .depend
-include Make.dep

42
interpreters/ficl/README.txt Executable file
View File

@ -0,0 +1,42 @@
apps/interpreter/README.txt
===========================
Ficl is a programming language interpreter designed to be embedded into
other systems as a command, macro, and development prototyping language.
Ficl is an acronym for "Forth Inspired Command Language". See
http://ficl.sourceforge.net/
Build Instructions
------------------
Disclaimer: This installation steps have only been exercised using Ficl
4.1.0. With new versions you will likely have to make some adjustments
to this instructtions or to the files within this directory. This of this
information as "recommendations" -- not necessarily proven instructions.
1. CD to apps/interpreters/ficl
2. Download Ficl: http://sourceforge.net/projects/ficl/files/
3. Uznip the Ficl compressed file.
For example, 'unzip ficl-4.1.0.zip' will leave the file
apps/interpreters/ficl/ficl-4.1.0
4. Configure to build Ficl in the apps/interpreters/ficl directory using
the configure.sh script.
For example, './configure.sh ficl-4.1.0' will leave the Makefile
fragment 'Make.srcs' in the ficl build directory.
5. Create your NuttX configuration. The appconfig file should include
(1) the path to your application code, and (2) the path to the Ficl
build directory. That latter would appear as the following line in
your appconfig file:
CONFIGURED_APPS += interpreters/ficl
6. Configure and build NuttX. On successful completion, the Ficl objects
will be available in apps/libapps.a and that NuttX binary will be
linked against that file. Of course, Ficl will do nothing unless
you have written some application code that uses it!

47
interpreters/ficl/configure.sh Executable file
View File

@ -0,0 +1,47 @@
#!/bin/bash
USAGE="$0 <Ficl-dir>"
FICLDIR=$1
if [ -z "${FICLDIR}" ]; then
echo "Missing command line argument"
echo $USAGE
exit 1
fi
if [ ! -d "${FICLDIR}" ]; then
echo "Sub-directory ${FICLDIR} does not exist"
echo $USAGE
exit 1
fi
if [ ! -r "${FICLDIR}/Makefile" ]; then
echo "Readable ${FICLDIR}/Makefile does not exist"
echo $USAGE
exit 1
fi
OBJECTS=`grep "^OBJECTS" ${FICLDIR}/Makefile`
if [ -z "${OBJECTS}" ]; then
echo "No OBJECTS found in ${FICLDIR}/Makefile"
echo $USAGE
exit 1
fi
OBJLIST=`echo ${OBJECTS} | cut -d'=' -f2 | sed -e "s/unix\.o//g"`
rm -f Make.srcs
echo "# apps/interpreters/ficl/Make.obs" >> Make.srcs
echo "# Auto-generated file.. Do not edit" >> Make.srcs
echo "" >> Make.srcs
echo "FICL_SUBDIR = ${1}" >> Make.srcs
echo "FICL_DEPPATH = --dep-path ${1}" >> Make.srcs
unset CSRCS
for OBJ in ${OBJLIST}; do
SRC=`echo ${OBJ} | sed -e "s/\.o/\.c/g"`
CSRCS=${CSRCS}" ${SRC}"
done
echo "FICL_ASRCS = " >> Make.srcs
echo "FICL_CXXSRCS = " >> Make.srcs
echo "FICL_CSRCS = ${CSRCS}" >> Make.srcs

View File

@ -0,0 +1,65 @@
#include <sys/stat.h>
#include <sys/statfs.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include "ficl.h"
void *ficlMalloc(size_t size)
{
return malloc(size);
}
void *ficlRealloc(void *p, size_t size)
{
return realloc(p, size);
}
void ficlFree(void *p)
{
free(p);
}
void ficlCallbackDefaultTextOut(ficlCallback *callback, char *message)
{
FICL_IGNORE(callback);
if (message != NULL)
fputs(message, stdout);
else
fflush(stdout);
return;
}
int ficlFileStatus(char *filename, int *status)
{
struct stat statbuf;
if (stat(filename, &statbuf) == 0)
{
*status = statbuf.st_mode;
return 0;
}
*status = ENOENT;
return -1;
}
long ficlFileSize(ficlFile *ff)
{
struct stat statbuf;
if (ff == NULL)
return -1;
statbuf.st_size = -1;
if (fstat(fileno(ff->f), &statbuf) != 0)
return -1;
return statbuf.st_size;
}
void ficlSystemCompilePlatform(ficlSystem *system)
{
return;
}

View File

@ -0,0 +1,19 @@
#include <stdint.h>
typedef int8_t ficlInteger8;
typedef uint8_t ficlUnsigned8;
typedef int16_t ficlInteger16;
typedef uint16_t ficlUnsigned16;
typedef int32_t ficlInteger32;
typedef uint32_t ficlUnsigned32;
typedef intptr_t ficlInteger;
typedef uintptr_t ficlUnsigned;
typedef float ficlFloat;
#define FICL_PLATFORM_BASIC_TYPES (1)
#define FICL_PLATFORM_HAS_2INTEGER (0)
#define FICL_PLATFORM_HAS_FTRUNCATE (0)
#define FICL_PLATFORM_OS "ansi"
#define FICL_PLATFORM_ARCHITECTURE "unknown"