-*~
*.fasl
*.pdf
*.out
*.log
*.dvi
*.aux
+Makefile.in
+/COPYING
+/COPYING.LIB
+/aclocal.m4
+/autom4te.cache/
+/config/
+/configure
--- /dev/null
+COPYING
+COPYING.LIB
+config/auto-version
--- /dev/null
+### -*-makefile-*-
+###
+### Build script for SOD
+###
+### (c) 2015 Straylight/Edgeware
+###
+
+###----- Licensing notice ---------------------------------------------------
+###
+### This file is part of the Sensble Object Design, an object system for C.
+###
+### SOD 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 2 of the License, or
+### (at your option) any later version.
+###
+### SOD 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 SOD; if not, write to the Free Software Foundation,
+### Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+SUBDIRS =
+
+###--------------------------------------------------------------------------
+### Subdirectories to build
+
+## The SOD translator.
+SUBDIRS += src
+
+## The runtime support library.
+SUBDIRS += lib
+
+###----- That's all, folks --------------------------------------------------
--- /dev/null
+dnl -*-autoconf-*-
+dnl
+dnl Configuration script for SOD
+dnl
+dnl (c) 2015 Straylight/Edgeware
+dnl
+
+dnl----- Licensing notice ---------------------------------------------------
+dnl
+dnl This file is part of the Sensble Object Design, an object system for C.
+dnl
+dnl SOD is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl SOD is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+dnl GNU General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with SOD; if not, write to the Free Software Foundation,
+dnl Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+dnl--------------------------------------------------------------------------
+dnl Initialization.
+
+mdw_AUTO_VERSION
+AC_INIT([sod], AUTO_VERSION, [mdw@distorted.org.uk])
+AC_CONFIG_SRCDIR([lib/sod.h])
+AC_CONFIG_AUX_DIR([config])
+AM_INIT_AUTOMAKE([foreign])
+mdw_SILENT_RULES
+
+AC_PROG_CC
+AM_PROG_LIBTOOL
+AX_CFLAGS_WARN_ALL
+mdw_LIBTOOL_VERSION_INFO
+
+dnl--------------------------------------------------------------------------
+dnl Common Lisp things.
+
+AC_ARG_WITH([lisp-system],
+ [AS_HELP_STRING([--with-lisp-system=SYSTEMS],
+ [preference order of cl-launch Lisp systems])],
+ [], [with_lisp_system="sbcl clisp"])
+
+AC_CHECK_PROGS([CL_LAUNCH], [cl-launch], [not-found])
+case "$CL_LAUNCH" in
+ not-found) AC_MSG_ERROR([\`cl-launch' not found]) ;;
+esac
+
+AC_MSG_CHECKING([for best choice of Lisp system])
+if ! LISPSYS=$($CL_LAUNCH -l "$with_lisp_system" \
+ -ip '(string-downcase (lisp-implementation-type))'); then
+ AC_MSG_ERROR([cl-launch didn't like any Lisp system])
+fi
+AC_SUBST([LISPSYS])
+AC_MSG_RESULT([$LISPSYS])
+
+AC_MSG_CHECKING([FASL file extension])
+FASL_TYPE=$($CL_LAUNCH -l $LISPSYS -ip \
+ '(pathname-type (compile-file-pathname "foo.lisp"))')
+AC_SUBST([FASL_TYPE])
+AC_MSG_RESULT([.$FASL_TYPE])
+
+AC_ARG_WITH([lisp-source-dir],
+ [AS_HELP_STRING([--with-lisp-source-dir=DIR],
+ [where to install Common Lisp source files])],
+ [], [with_lisp_source_dir='${datadir}/common-lisp/source'])
+AC_ARG_WITH([lisp-system-dir],
+ [AS_HELP_STRING([--with-lisp-system-dir=DIR],
+ [where to install ASDF system links])],
+ [], [with_lisp_system_dir='${datadir}/common-lisp/systems'])
+AC_SUBST([lispsrcdir], [$with_lisp_source_dir])
+AC_SUBST([lispsysdir], [$with_lisp_system_dir])
+
+dnl--------------------------------------------------------------------------
+dnl Output.
+
+AC_CONFIG_FILES([Makefile src/Makefile lib/Makefile])
+AC_OUTPUT
+
+dnl----- That's all, folks --------------------------------------------------
--- /dev/null
+### -*-makefile-*-
+###
+### Build script for SOD runtime library
+###
+### (c) 2015 Straylight/Edgeware
+###
+
+###----- Licensing notice ---------------------------------------------------
+###
+### This file is part of the Sensble Object Design, an object system for C.
+###
+### SOD 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 2 of the License, or
+### (at your option) any later version.
+###
+### SOD 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 SOD; if not, write to the Free Software Foundation,
+### Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+lib_LTLIBRARIES = libsod.la
+libsod_la_LDFLAGS = -version-info $(LIBTOOL_VERSION_INFO)
+
+libsod_la_SOURCES =
+include_HEADERS =
+
+nodist_libsod_la_SOURCES =
+nodist_include_HEADERS =
+
+SOD = $(top_builddir)/src/sod
+
+BUILT_SOURCES =
+
+###--------------------------------------------------------------------------
+### The source files.
+
+libsod_la_SOURCES += sod.c
+include_HEADERS += sod.h
+
+###--------------------------------------------------------------------------
+### Generated builtin module.
+
+BUILT_SOURCES += sod-base.c sod-base.h
+nodist_libsod_la_SOURCES+= sod-base.c
+nodist_include_HEADERS += sod-base.h
+
+sod-base.c: $(SOD)
+ $(SOD) -tc --builtin
+
+sod-base.h: $(SOD)
+ $(SOD) -th --builtin
+
+###----- That's all, folks --------------------------------------------------
--- /dev/null
+### -*-makefile-*-
+###
+### Build script for the SOD translator
+###
+### (c) 2015 Straylight/Edgeware
+###
+
+###----- Licensing notice ---------------------------------------------------
+###
+### This file is part of the Sensble Object Design, an object system for C.
+###
+### SOD 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 2 of the License, or
+### (at your option) any later version.
+###
+### SOD 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 SOD; if not, write to the Free Software Foundation,
+### Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+bin_PROGRAMS =
+
+CLEANFILES =
+
+pkglispsrcdir = $(lispsrcdir)/$(PACKAGE)
+
+dist_pkglispsrc_DATA =
+
+###--------------------------------------------------------------------------
+### The source files.
+
+## The system definition file.
+dist_pkglispsrc_DATA += sod.asd
+
+## The package definition file.
+dist_pkglispsrc_DATA += package.lisp
+
+## General utilities.
+dist_pkglispsrc_DATA += utilities.lisp
+
+## The parser library.
+dist_pkglispsrc_DATA += parser/floc-proto.lisp parser/floc-impl.lisp
+dist_pkglispsrc_DATA += parser/streams-proto.lisp parser/streams-impl.lisp
+dist_pkglispsrc_DATA += parser/scanner-proto.lisp parser/scanner-impl.lisp
+dist_pkglispsrc_DATA += parser/scanner-charbuf-impl.lisp
+dist_pkglispsrc_DATA += parser/scanner-token-impl.lisp
+dist_pkglispsrc_DATA += parser/parser-proto.lisp parser/parser-impl.lisp
+dist_pkglispsrc_DATA += parser/parser-expr-proto.lisp \
+ parser/parser-expr-impl.lisp
+dist_pkglispsrc_DATA += parser/scanner-context-impl.lisp
+
+## Lexical analysis and translator-specific parser utilities.
+dist_pkglispsrc_DATA += lexer-proto.lisp lexer-impl.lisp
+dist_pkglispsrc_DATA += fragment-parse.lisp
+
+## C type representation.
+dist_pkglispsrc_DATA += c-types-proto.lisp c-types-impl.lisp \
+ c-types-parse.lisp
+
+## Property sets.
+dist_pkglispsrc_DATA += pset-proto.lisp pset-impl.lisp pset-parse.lisp
+
+## Code generation.
+dist_pkglispsrc_DATA += codegen-proto.lisp codegen-impl.lisp
+
+## Output machinery.
+dist_pkglispsrc_DATA += output-proto.lisp output-impl.lisp
+
+## Modules.
+dist_pkglispsrc_DATA += module-proto.lisp module-impl.lisp
+dist_pkglispsrc_DATA += module-parse.lisp module-output.lisp
+dist_pkglispsrc_DATA += builtin.lisp
+
+## Class representation and layout.
+dist_pkglispsrc_DATA += classes.lisp c-types-class-impl.lisp
+dist_pkglispsrc_DATA += class-utilities.lisp
+dist_pkglispsrc_DATA += class-make-proto.lisp class-make-impl.lisp
+dist_pkglispsrc_DATA += class-layout-proto.lisp class-layout-impl.lisp
+dist_pkglispsrc_DATA += class-finalize-proto.lisp class-finalize-impl.lisp
+dist_pkglispsrc_DATA += class-output.lisp
+
+## Method generation.
+dist_pkglispsrc_DATA += method-proto.lisp method-impl.lisp
+
+## User interface.
+dist_pkglispsrc_DATA += sod-frontend.asd
+dist_pkglispsrc_DATA += frontend.lisp optparse.lisp
+
+###--------------------------------------------------------------------------
+### Constructing an output image.
+
+CLEANFILES += *.$(FASL_TYPE)
+
+bin_PROGRAMS += sod
+sod_SOURCES =
+sod: $(dist_pkglispsrc_DATA)
+ set -ex; true_srcdir=$$(cd $(srcdir); pwd); \
+ ASDF_OUTPUT_TRANSLATIONS=$$true_srcdir:$(abs_builddir): \
+ $(CL_LAUNCH) -o sod -d ! -l $(LISPSYS) +I -S $$true_srcdir/ \
+ -s sod-frontend -r sod-frontend:main
+
+###--------------------------------------------------------------------------
+### Installation.
+
+## We want a symlink $(lispsysdir)/sod.asd -> $(lispsrcdir)/sod/sod.asd. It
+## would be nice if this were a sane relative symlink, but that involves
+## calculating the proper relative path from $(lispsrcdir)/sod to
+## $(lispsysdir). Oh, well, here we go. This assumes that the path names
+## don't have spaces in them; but that's generally a bad idea in Makefiles
+## anyway.
+install-data-local:
+ $(MKDIR_P) $(DESTDIR)$(lispsysdir)
+ @set -e; \
+ from=$(lispsysdir) to=$(pkglispsrcdir)/sod.asd; \
+ set -- $$(echo $$from | tr "/" " "); fwd=$$*; \
+ set -- $$(echo $$to | tr "/" " "); twd=$$*; \
+ while :; do \
+ set -- $$fwd; fhd=$$1 fn=$$#; \
+ set -- $$twd; thd=$$1 tn=$$#; \
+ case :$$fn:$$tn: in *:0:*) break ;; esac; \
+ case "$$fhd" in "$$thd") ;; *) break ;; esac; \
+ set -- $$fwd; shift; fwd=$$*; \
+ set -- $$twd; shift; twd=$$*; \
+ done; \
+ dots=$$(echo $$fwd | sed 's/[^ ][^ ]*/../g'); \
+ rel=$$(echo $$dots $$twd | tr " " "/"); \
+ echo >&2 "ln -s $$rel $$to"; \
+ ln -s $$rel $(DESTDIR)$$from.new; \
+ mv $(DESTDIR)$$from.new $(DESTDIR)$$from
+
+###----- That's all, folks --------------------------------------------------
+++ /dev/null
-/* another example module */
-
-demo "bar, before import";
-import "foo";
-demo "bar, after import";
+++ /dev/null
-#! /bin/sh -ex
-cl-launch -o sod -d "$(pwd)/sod.img" -s sod +I -r sod:main "$@"
+++ /dev/null
-(cl:in-package #:sod)
-
-(defun list-tokens (scanner)
- (let ((toke (make-instance 'sod-token-scanner :char-scanner scanner)))
- (loop collect (list (token-type toke) (token-value toke))
- until (scanner-at-eof-p toke)
- do (scanner-step toke))))
+++ /dev/null
-/* foo */
-
-code c : includes {
-#include "foo.h"
-}
-
-code h : includes {
-#include "sod.h"
-}
-
-//[link = SodObject]
-class Test : SodObject {
- int x = 0;
-
- int cur() { return me->test.x; }
- void inc() { me->test.x++; }
- void dec() { me->test.x--; }
-}
-
-[nick = snd]
-class Second : Test {
- void test.dec() { Test *t = SECOND__CONV_TEST(me); t->test.x -= 3; }
-}
+++ /dev/null
-(in-package #:sod)
-
-(defun make-lexer (string)
- (make-instance 'sod-token-scanner
- :char-scanner (make-string-scanner string)
- :filename "<string>"))
+++ /dev/null
-#! /bin/sh
-":"; exec cl-launch -X -l "sbcl clisp cmucl ecl" -s asdf -- "$0" "$0" "$@" || exit 1 # -*-lisp-*-
-
-(handler-bind ((warning (lambda (cond)
- (declare (ignore cond))
- (invoke-restart 'muffle-warning))))
- (asdf:operate 'asdf:load-op "sod"))
-
-(funcall (intern "MAIN" (find-package "SOD")))
+++ /dev/null
-(in-package #:sod)
-
-(defun try-parse* (parser string)
- (call-with-module-environment
- (lambda ()
- (let* ((char-scanner (make-string-scanner string))
- (scanner (make-instance 'sod-token-scanner
- :char-scanner char-scanner)))
- (funcall parser scanner)))))
-
-(defmacro try-parse ((scanner string) &body parser)
- `(try-parse* (lambda (,scanner)
- (with-parser-context
- (token-scanner-context :scanner ,scanner)
- ,@parser))
- ,string))