diff --git a/Doxyfile b/Doxyfile index b94ec20..955cb32 100644 --- a/Doxyfile +++ b/Doxyfile @@ -32,13 +32,13 @@ DOXYFILE_ENCODING = UTF-8 # title of most generated pages and in a few other places. # The default value is: My Project. -PROJECT_NAME = "\"Post Scarcity\"" +PROJECT_NAME = "Post Scarcity" # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = +PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a @@ -51,14 +51,14 @@ PROJECT_BRIEF = "A prototype for a post scarcity programming environmen # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. -PROJECT_LOGO = +PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = /home/simon/workspace/post-scarcity/doc +OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and @@ -162,7 +162,7 @@ FULL_PATH_NAMES = YES # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. -STRIP_FROM_PATH = +STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which @@ -171,7 +171,7 @@ STRIP_FROM_PATH = # specify the list of include paths that are normally passed to the compiler # using the -I flag. -STRIP_FROM_INC_PATH = +STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't @@ -238,13 +238,13 @@ TAB_SIZE = 4 # "Side Effects:". You can put \n's in the value part of an alias to insert # newlines. -ALIASES = +ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding "class=itcl::class" # will allow you to use the command class in the itcl::class meaning. -TCL_SUBST = +TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For @@ -291,7 +291,7 @@ OPTIMIZE_OUTPUT_VHDL = NO # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. -EXTENSION_MAPPING = +EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable @@ -648,7 +648,7 @@ GENERATE_DEPRECATEDLIST= YES # sections, marked by \if <section_label> ... \endif and \cond <section_label> # ... \endcond blocks. -ENABLED_SECTIONS = +ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the @@ -690,7 +690,7 @@ SHOW_NAMESPACES = YES # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. -FILE_VERSION_FILTER = +FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated @@ -703,7 +703,7 @@ FILE_VERSION_FILTER = # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. -LAYOUT_FILE = +LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib @@ -713,7 +713,7 @@ LAYOUT_FILE = # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. See also \cite for info how to create references. -CITE_BIB_FILES = +CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages @@ -778,7 +778,7 @@ WARN_FORMAT = "$file:$line: $text" # messages should be written. If left blank the output is written to standard # error (stderr). -WARN_LOGFILE = +WARN_LOGFILE = doxy.log #--------------------------------------------------------------------------- # Configuration options related to the input files @@ -790,7 +790,7 @@ WARN_LOGFILE = # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. -INPUT = /home/simon/workspace/post-scarcity/src +INPUT = src src/arith src/memory src/ops # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses @@ -873,7 +873,7 @@ RECURSIVE = NO # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = +EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded @@ -889,7 +889,7 @@ EXCLUDE_SYMLINKS = NO # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* -EXCLUDE_PATTERNS = +EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the @@ -900,13 +900,13 @@ EXCLUDE_PATTERNS = # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* -EXCLUDE_SYMBOLS = +EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). -EXAMPLE_PATH = +EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and @@ -926,7 +926,7 @@ EXAMPLE_RECURSIVE = NO # that contain images that are to be included in the documentation (see the # \image command). -IMAGE_PATH = +IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program @@ -947,7 +947,7 @@ IMAGE_PATH = # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. -INPUT_FILTER = +INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the @@ -960,7 +960,7 @@ INPUT_FILTER = # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. -FILTER_PATTERNS = +FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will also be used to filter the input files that are used for @@ -975,14 +975,14 @@ FILTER_SOURCE_FILES = NO # *.ext= (so without naming a filter). # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. -FILTER_SOURCE_PATTERNS = +FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. -USE_MDFILE_AS_MAINPAGE = +USE_MDFILE_AS_MAINPAGE = #--------------------------------------------------------------------------- # Configuration options related to source browsing @@ -1087,7 +1087,7 @@ CLANG_ASSISTED_PARSING = NO # specified with INPUT and INCLUDE_PATH. # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. -CLANG_OPTIONS = +CLANG_OPTIONS = #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index @@ -1113,7 +1113,7 @@ COLS_IN_ALPHA_INDEX = 5 # while generating the index headers. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. -IGNORE_PREFIX = +IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output @@ -1157,7 +1157,7 @@ HTML_FILE_EXTENSION = .html # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_HEADER = +HTML_HEADER = # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard @@ -1167,7 +1167,7 @@ HTML_HEADER = # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_FOOTER = +HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of @@ -1179,7 +1179,7 @@ HTML_FOOTER = # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_STYLESHEET = +HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets @@ -1192,7 +1192,7 @@ HTML_STYLESHEET = # list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_STYLESHEET = +HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note @@ -1202,7 +1202,7 @@ HTML_EXTRA_STYLESHEET = # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_FILES = +HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to @@ -1331,7 +1331,7 @@ GENERATE_HTMLHELP = NO # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -CHM_FILE = +CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, @@ -1339,7 +1339,7 @@ CHM_FILE = # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -HHC_LOCATION = +HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated # (YES) or that it should be included in the master .chm file (NO). @@ -1352,7 +1352,7 @@ GENERATE_CHI = NO # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -CHM_INDEX_ENCODING = +CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated # (YES) or a normal table of contents (NO) in the .chm file. Furthermore it @@ -1383,7 +1383,7 @@ GENERATE_QHP = NO # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. -QCH_FILE = +QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace @@ -1408,7 +1408,7 @@ QHP_VIRTUAL_FOLDER = doc # filters). # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_CUST_FILTER_NAME = +QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom @@ -1416,21 +1416,21 @@ QHP_CUST_FILTER_NAME = # filters). # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_CUST_FILTER_ATTRS = +QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: # http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_SECT_FILTER_ATTRS = +QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location of Qt's # qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the # generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. -QHG_LOCATION = +QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To @@ -1563,7 +1563,7 @@ MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_EXTENSIONS = +MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site @@ -1571,7 +1571,7 @@ MATHJAX_EXTENSIONS = # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_CODEFILE = +MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and @@ -1631,7 +1631,7 @@ EXTERNAL_SEARCH = NO # Searching" for details. # This tag requires that the tag SEARCHENGINE is set to YES. -SEARCHENGINE_URL = +SEARCHENGINE_URL = # When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed # search data is written to a file for indexing by an external tool. With the @@ -1647,7 +1647,7 @@ SEARCHDATA_FILE = searchdata.xml # projects and redirect the results back to the right project. # This tag requires that the tag SEARCHENGINE is set to YES. -EXTERNAL_SEARCH_ID = +EXTERNAL_SEARCH_ID = # The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen # projects other than the one defined by this configuration file, but that are @@ -1657,7 +1657,7 @@ EXTERNAL_SEARCH_ID = # EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... # This tag requires that the tag SEARCHENGINE is set to YES. -EXTRA_SEARCH_MAPPINGS = +EXTRA_SEARCH_MAPPINGS = #--------------------------------------------------------------------------- # Configuration options related to the LaTeX output @@ -1721,7 +1721,7 @@ PAPER_TYPE = a4 # If left blank no extra packages will be included. # This tag requires that the tag GENERATE_LATEX is set to YES. -EXTRA_PACKAGES = +EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for the # generated LaTeX document. The header should contain everything until the first @@ -1737,7 +1737,7 @@ EXTRA_PACKAGES = # to HTML_HEADER. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_HEADER = +LATEX_HEADER = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the # generated LaTeX document. The footer should contain everything after the last @@ -1748,7 +1748,7 @@ LATEX_HEADER = # Note: Only use a user-defined footer if you know what you are doing! # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_FOOTER = +LATEX_FOOTER = # The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined # LaTeX style sheets that are included after the standard style sheets created @@ -1759,7 +1759,7 @@ LATEX_FOOTER = # list). # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_EXTRA_STYLESHEET = +LATEX_EXTRA_STYLESHEET = # The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the LATEX_OUTPUT output @@ -1767,7 +1767,7 @@ LATEX_EXTRA_STYLESHEET = # markers available. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_EXTRA_FILES = +LATEX_EXTRA_FILES = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is # prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will @@ -1875,14 +1875,14 @@ RTF_HYPERLINKS = NO # default style sheet that doxygen normally uses. # This tag requires that the tag GENERATE_RTF is set to YES. -RTF_STYLESHEET_FILE = +RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an RTF document. Syntax is # similar to doxygen's config file. A template extensions file can be generated # using doxygen -e rtf extensionFile. # This tag requires that the tag GENERATE_RTF is set to YES. -RTF_EXTENSIONS_FILE = +RTF_EXTENSIONS_FILE = # If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code # with syntax highlighting in the RTF output. @@ -1927,7 +1927,7 @@ MAN_EXTENSION = .3 # MAN_EXTENSION with the initial . removed. # This tag requires that the tag GENERATE_MAN is set to YES. -MAN_SUBDIR = +MAN_SUBDIR = # If the MAN_LINKS tag is set to YES and doxygen generates man output, then it # will generate one additional man file for each entity documented in the real @@ -2040,7 +2040,7 @@ PERLMOD_PRETTY = YES # overwrite each other's variables. # This tag requires that the tag GENERATE_PERLMOD is set to YES. -PERLMOD_MAKEVAR_PREFIX = +PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor @@ -2081,7 +2081,7 @@ SEARCH_INCLUDES = YES # preprocessor. # This tag requires that the tag SEARCH_INCLUDES is set to YES. -INCLUDE_PATH = +INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the @@ -2089,7 +2089,7 @@ INCLUDE_PATH = # used. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -INCLUDE_FILE_PATTERNS = +INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that are # defined before the preprocessor is started (similar to the -D option of e.g. @@ -2099,7 +2099,7 @@ INCLUDE_FILE_PATTERNS = # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = +PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The @@ -2108,7 +2108,7 @@ PREDEFINED = # definition found in the source code. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -EXPAND_AS_DEFINED = +EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will # remove all references to function-like macros that are alone on a line, have @@ -2137,13 +2137,13 @@ SKIP_FUNCTION_MACROS = YES # the path). If a tag file is not located in the directory in which doxygen is # run, you must also specify the path to the tagfile here. -TAGFILES = +TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create a # tag file that is based on the input files it reads. See section "Linking to # external documentation" for more information about the usage of tag files. -GENERATE_TAGFILE = +GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES, all external class will be listed in # the class index. If set to NO, only the inherited external classes will be @@ -2192,14 +2192,14 @@ CLASS_DIAGRAMS = YES # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. -MSCGEN_PATH = +MSCGEN_PATH = # You can include diagrams made with dia in doxygen documentation. Doxygen will # then run dia to produce the diagram and insert it in the documentation. The # DIA_PATH tag allows you to specify the directory where the dia binary resides. # If left empty dia is assumed to be found in the default search path. -DIA_PATH = +DIA_PATH = # If set to YES the inheritance and collaboration graphs will hide inheritance # and usage relations if the target is undocumented or is not a class. @@ -2248,7 +2248,7 @@ DOT_FONTSIZE = 10 # the path where dot can find it using this tag. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTPATH = +DOT_FONTPATH = # If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for # each documented class showing the direct and indirect inheritance relations. @@ -2394,26 +2394,26 @@ INTERACTIVE_SVG = YES # found. If left blank, it is assumed the dot tool can be found in the path. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_PATH = +DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the \dotfile # command). # This tag requires that the tag HAVE_DOT is set to YES. -DOTFILE_DIRS = +DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the \mscfile # command). -MSCFILE_DIRS = +MSCFILE_DIRS = # The DIAFILE_DIRS tag can be used to specify one or more directories that # contain dia files that are included in the documentation (see the \diafile # command). -DIAFILE_DIRS = +DIAFILE_DIRS = # When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the # path where java can find the plantuml.jar file. If left blank, it is assumed @@ -2421,17 +2421,17 @@ DIAFILE_DIRS = # generate a warning when it encounters a \startuml command in this case and # will not generate output for the diagram. -PLANTUML_JAR_PATH = +PLANTUML_JAR_PATH = # When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a # configuration file for plantuml. -PLANTUML_CFG_FILE = +PLANTUML_CFG_FILE = # When using plantuml, the specified paths are searched for files specified by # the !include statement in a plantuml block. -PLANTUML_INCLUDE_PATH = +PLANTUML_INCLUDE_PATH = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes # that will be shown in the graph. If the number of nodes in a graph becomes diff --git a/Makefile b/Makefile index 3fc8148..c368d50 100644 --- a/Makefile +++ b/Makefile @@ -23,7 +23,7 @@ LDFLAGS := -lm $(TARGET): $(OBJS) Makefile $(CC) $(LDFLAGS) $(OBJS) -DVERSION=$(VERSION) -o $@ $(LDFLAGS) $(LOADLIBES) $(LDLIBS) -doc: $(SRCS) Makefile +doc: $(SRCS) Makefile Doxyfile doxygen format: $(SRCS) $(HDRS) Makefile diff --git a/src/arith/integer.c b/src/arith/integer.c index 60ce8c3..5239746 100644 --- a/src/arith/integer.c +++ b/src/arith/integer.c @@ -13,6 +13,7 @@ #include "conspage.h" #include "consspaceobject.h" +#include "debug.h" /** * return the numeric value of this cell, as a C primitive double, not @@ -40,9 +41,7 @@ struct cons_pointer make_integer( int64_t value ) { struct cons_space_object *cell = &pointer2cell( result ); cell->payload.integer.value = value; -#ifdef DEBUG - dump_object( stderr, result ); -#endif + debug_dump_object( result, DEBUG_ARITH ); return result; } diff --git a/src/arith/peano.c b/src/arith/peano.c index 763414e..4cb8abd 100644 --- a/src/arith/peano.c +++ b/src/arith/peano.c @@ -16,6 +16,7 @@ #include "consspaceobject.h" #include "conspage.h" +#include "debug.h" #include "equal.h" #include "integer.h" #include "intern.h" @@ -86,8 +87,8 @@ long double to_long_double( struct cons_pointer arg ) { break; } - fputws( L"to_long_double( ", stderr ); - print( stderr, arg ); + debug_print( L"to_long_double( ", DEBUG_ARITH ); + debug_print_object( arg, DEBUG_ARITH ); fwprintf( stderr, L") => %lf\n", result ); return result; @@ -129,13 +130,11 @@ struct cons_pointer add_2( struct stack_frame *frame, struct cons_space_object cell1 = pointer2cell( arg1 ); struct cons_space_object cell2 = pointer2cell( arg2 ); -#ifdef DEBUG - fputws( L"add_2( arg1 = ", stderr ); - print( stderr, arg1 ); - fputws( L"; arg2 = ", stderr ); - print( stderr, arg2 ); - fputws( L")\n", stderr ); -#endif + debug_print( L"add_2( arg1 = ", DEBUG_ARITH ); + debug_print_object( arg1, DEBUG_ARITH ); + debug_print( L"; arg2 = ", DEBUG_ARITH ); + debug_print_object( arg2, DEBUG_ARITH ); + debug_print( L"\n", DEBUG_ARITH ); if ( zerop( arg1 ) ) { result = arg2; @@ -209,11 +208,9 @@ struct cons_pointer add_2( struct stack_frame *frame, } } -#ifdef DEBUG - fputws( L"}; => ", stderr ); - print( stderr, arg2 ); - fputws( L"\n", stderr ); -#endif + debug_print( L"}; => ", DEBUG_ARITH ); + debug_print_object( arg2, DEBUG_ARITH ); + debug_print( L"\n", DEBUG_ARITH ); return result; } @@ -267,13 +264,11 @@ struct cons_pointer multiply_2( struct stack_frame *frame, struct cons_space_object cell1 = pointer2cell( arg1 ); struct cons_space_object cell2 = pointer2cell( arg2 ); -#ifdef DEBUG - fputws( L"multiply_2( arg1 = ", stderr ); - print( stderr, arg1 ); - fputws( L"; arg2 = ", stderr ); - print( stderr, arg2 ); - fputws( L")\n", stderr ); -#endif + debug_print( L"multiply_2( arg1 = ", DEBUG_ARITH ); + debug_print_object( arg1, DEBUG_ARITH ); + debug_print( L"; arg2 = ", DEBUG_ARITH ); + debug_print_object( arg2, DEBUG_ARITH ); + debug_print( L")", DEBUG_ARITH ); if ( zerop( arg1 ) ) { result = arg2; @@ -348,11 +343,9 @@ struct cons_pointer multiply_2( struct stack_frame *frame, } } -#ifdef DEBUG - fputws( L" => ", stderr ); - print( stderr, arg2 ); - fputws( L"\n", stderr ); -#endif + debug_print( L" => ", DEBUG_ARITH ); + debug_print_object( arg2, DEBUG_ARITH ); + debug_print( L"\n", DEBUG_ARITH ); return result; } diff --git a/src/arith/ratio.c b/src/arith/ratio.c index afea5b0..f12acbb 100644 --- a/src/arith/ratio.c +++ b/src/arith/ratio.c @@ -13,7 +13,7 @@ #include "conspage.h" #include "consspaceobject.h" -#include "dump.h" +#include "debug.h" #include "equal.h" #include "integer.h" #include "lispops.h" @@ -332,9 +332,8 @@ struct cons_pointer make_ratio( struct cons_pointer frame_pointer, ( "Dividend and divisor of a ratio must be integers" ), frame_pointer ); } -#ifdef DEBUG - dump_object( stderr, result ); -#endif + debug_dump_object( result, DEBUG_ARITH ); + return result; } diff --git a/src/arith/real.c b/src/arith/real.c index d3786dd..84ba899 100644 --- a/src/arith/real.c +++ b/src/arith/real.c @@ -9,7 +9,7 @@ #include "conspage.h" #include "consspaceobject.h" -#include "dump.h" +#include "debug.h" #include "read.h" /** @@ -23,9 +23,7 @@ struct cons_pointer make_real( long double value ) { struct cons_space_object *cell = &pointer2cell( result ); cell->payload.real.value = value; -#ifdef DEBUG - dump_object( stderr, result ); -#endif + debug_dump_object( result, DEBUG_ARITH ); return result; } diff --git a/src/debug.c b/src/debug.c new file mode 100644 index 0000000..27f7634 --- /dev/null +++ b/src/debug.c @@ -0,0 +1,65 @@ +/** + * debug.c + * + * Better debug log messages. + * + * (c) 2017 Simon Brooke <simon@journeyman.cc> + * Licensed under GPL version 2.0, or, at your option, any later version. + */ + +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +/* + * wide characters + */ +#include <wchar.h> +#include <wctype.h> + +#include "consspaceobject.h" +#include "debug.h" +#include "dump.h" +#include "print.h" + +/** + * the controlling flags for `debug_print`; set in `init.c`, q.v. + */ +int verbosity = 0; + +/** + * print this debug `message` to stderr, if `verbosity` matches `level`. + * `verbosity is a set of flags, see debug_print.h; so you can + * turn debugging on for only one part of the system. + */ +void debug_print( wchar_t *message, int level ) { +#ifdef DEBUG + if ( level & verbosity ) { + fputws( message, stderr ); + } +#endif +} + +/** + * print the object indicated by this `pointer` to stderr, if `verbosity` + * matches `level`.`verbosity is a set of flags, see debug_print.h; so you can + * turn debugging on for only one part of the system. + */ +void debug_print_object( struct cons_pointer pointer, int level ) { +#ifdef DEBUG + if ( level & verbosity ) { + print( stderr, pointer ); + } +#endif +} + +/** + * Like `dump_object`, q.v., but protected by the verbosity mechanism. + */ +void debug_dump_object( struct cons_pointer pointer, int level ) { +#ifdef DEBUG + if ( level & verbosity ) { + dump_object( stderr, pointer ); + } +#endif +} diff --git a/src/debug.h b/src/debug.h new file mode 100644 index 0000000..9c0448b --- /dev/null +++ b/src/debug.h @@ -0,0 +1,28 @@ +/** + * debug.h + * + * Better debug log messages. + * + * (c) 2017 Simon Brooke <simon@journeyman.cc> + * Licensed under GPL version 2.0, or, at your option, any later version. + */ + +#include <ctype.h> +#include <stdio.h> + +#ifndef __debug_print_h +#define __debug_print_h + +#define DEBUG_ALLOC 1 +#define DEBUG_STACK 2 +#define DEBUG_ARITH 4 +#define DEBUG_EVAL 8 +#define DEBUG_LAMBDA 16 +#define DEBUG_BOOTSTRAP 32 +#define DEBUG_IO 64 + +extern int verbosity; +void debug_print( wchar_t *message, int level ); +void debug_print_object( struct cons_pointer pointer, int level ); +void debug_dump_object( struct cons_pointer pointer, int level ); +#endif diff --git a/src/init.c b/src/init.c index 48516f6..bb722ae 100644 --- a/src/init.c +++ b/src/init.c @@ -11,26 +11,32 @@ #include <stdbool.h> #include <stdio.h> +#include <stdlib.h> #include <unistd.h> #include <wchar.h> #include "version.h" #include "conspage.h" #include "consspaceobject.h" +#include "debug.h" #include "intern.h" #include "lispops.h" #include "peano.h" #include "print.h" #include "repl.h" +// extern char *optarg; /* defined in unistd.h */ + void bind_function( char *name, struct cons_pointer ( *executable ) - ( struct stack_frame *, struct cons_pointer ) ) { + ( struct stack_frame *, + struct cons_pointer, struct cons_pointer ) ) { deep_bind( c_string_to_lisp_symbol( name ), make_function( NIL, executable ) ); } void bind_special( char *name, struct cons_pointer ( *executable ) - ( struct stack_frame * frame, struct cons_pointer env ) ) { + ( struct stack_frame *, + struct cons_pointer, struct cons_pointer ) ) { deep_bind( c_string_to_lisp_symbol( name ), make_special( NIL, executable ) ); } @@ -46,7 +52,7 @@ int main( int argc, char *argv[] ) { bool dump_at_end = false; bool show_prompt = false; - while ( ( option = getopt( argc, argv, "pdc" ) ) != -1 ) { + while ( ( option = getopt( argc, argv, "pdcv:" ) ) != -1 ) { switch ( option ) { case 'c': print_use_colours = true; @@ -57,6 +63,8 @@ int main( int argc, char *argv[] ) { case 'p': show_prompt = true; break; + case 'v': + verbosity = atoi( optarg ); default: fwprintf( stderr, L"Unexpected option %c\n", option ); break; @@ -68,9 +76,15 @@ int main( int argc, char *argv[] ) { L"Post scarcity software environment version %s\n\n", VERSION ); } - +#ifdef DEBUG + fputws( L"About to initialise cons pages\n", stderr ); +#endif initialise_cons_pages( ); +#ifdef DEBUG + fputws( L"Initialised cons pages, about to bind\n", stderr ); +#endif + /* * privileged variables (keywords) */ diff --git a/src/memory/conspage.c b/src/memory/conspage.c index 13d8373..75bcdc8 100644 --- a/src/memory/conspage.c +++ b/src/memory/conspage.c @@ -18,6 +18,7 @@ #include "consspaceobject.h" #include "conspage.h" +#include "dump.h" /** * Flag indicating whether conspage initialisation has been done. @@ -168,7 +169,7 @@ void free_cell( struct cons_pointer pointer ) { fwprintf( stderr, L"About to free vector-space object at %ld\n", cell->payload.vectorp.address ); #endif - free( ( void * ) cell->payload.vectorp.address ); + //free( ( void * ) cell->payload.vectorp.address ); break; } diff --git a/src/memory/conspage.h b/src/memory/conspage.h index 7b8b930..bc1361e 100644 --- a/src/memory/conspage.h +++ b/src/memory/conspage.h @@ -19,7 +19,7 @@ * 4294967296. * * Note that this means the total number of addressable cons cells is - * 1.8e19, each of 20 bytes; or 3e20 bytes in total; and there are + * 1.8e19, each of 20 bytes; or 3e20 bytes in total; and there are * up to a maximum of 4e9 of heap space objects, each of potentially * 4e9 bytes. So we're talking about a potential total of 8e100 bytes * of addressable memory, which is only slightly more than the @@ -38,7 +38,7 @@ struct cons_page { }; /** - * The (global) pointer to the (global) freelist. Not sure whether this ultimately + * The (global) pointer to the (global) freelist. Not sure whether this ultimately * belongs in this file. */ extern struct cons_pointer freelist; diff --git a/src/memory/consspaceobject.h b/src/memory/consspaceobject.h index 44b6a79..47bbed0 100644 --- a/src/memory/consspaceobject.h +++ b/src/memory/consspaceobject.h @@ -133,7 +133,7 @@ * A pointer to an object in vector space. */ #define VECTORPOINTTAG "VECP" -#define VECTORPOINTTV 0 +#define VECTORPOINTTV 1346585942 /** * An open write stream. */ @@ -263,9 +263,10 @@ * An indirect pointer to a cons cell */ struct cons_pointer { - uint32_t page; /* the index of the page on which this cell - * resides */ - uint32_t offset; /* the index of the cell within the page */ + /** the index of the page on which this cell resides */ + uint32_t page; + /** the index of the cell within the page */ + uint32_t offset; }; /* @@ -421,7 +422,7 @@ struct vectorp_payload { * tag. */ uint32_t value; /* the tag considered as a number */ } tag; - struct vector_space_object *address; + void *address; /* the address of the actual vector space * object (TODO: will change when I actually * implement vector space) */ diff --git a/src/memory/cursor.c b/src/memory/cursor.c new file mode 100644 index 0000000..31a38b2 --- /dev/null +++ b/src/memory/cursor.c @@ -0,0 +1,9 @@ +/* + * a cursor is a cons-space object which holds: + * 1. a pointer to a vector (i.e. a vector-space object which holds an + * array of `cons_pointer`); + * 2. an integer offset into that array. + * + * this provides a mechanism for iterating through vectors (actually, in + * either direction) + */ diff --git a/src/memory/cursor.h b/src/memory/cursor.h new file mode 100644 index 0000000..a50aff6 Binary files /dev/null and b/src/memory/cursor.h differ diff --git a/src/memory/dump.c b/src/memory/dump.c index 5aaedfb..e0c2bbc 100644 --- a/src/memory/dump.c +++ b/src/memory/dump.c @@ -20,6 +20,7 @@ #include "conspage.h" #include "consspaceobject.h" +#include "debug.h" #include "print.h" #include "stack.h" #include "vectorspace.h" @@ -111,11 +112,25 @@ void dump_object( FILE * output, struct cons_pointer pointer ) { dump_string_cell( output, L"Symbol", pointer ); break; case VECTORPOINTTV:{ + fwprintf( output, + L"\t\tPointer to vector-space object at %p\n", + cell.payload.vectorp.address ); struct vector_space_object *vso = cell.payload.vectorp.address; fwprintf( output, L"\t\tVector space object of type %4.4s, payload size %d bytes\n", - vso->header.tag, vso->header.size ); + &vso->header.tag.bytes, vso->header.size ); + switch ( vso->header.tag.value ) { + case STACKFRAMETV: + dump_frame( output, pointer ); + break; + default: + fputws( L"(Unknown vector type)\n", output ); + break; + } } break; + default: + fputws( L"(Unknown cons space type)\n", output ); + break; } } diff --git a/src/memory/stack.c b/src/memory/stack.c index 9f0f6f8..069b1ed 100644 --- a/src/memory/stack.c +++ b/src/memory/stack.c @@ -19,6 +19,8 @@ #include "consspaceobject.h" #include "conspage.h" +#include "debug.h" +#include "dump.h" #include "lispops.h" #include "print.h" #include "stack.h" @@ -30,21 +32,24 @@ */ struct stack_frame *get_stack_frame( struct cons_pointer pointer ) { struct stack_frame *result = NULL; - fputws + debug_print ( L"get_stack_frame: about to get a pointer to the vector space object\n", - stderr ); + DEBUG_ALLOC ); struct vector_space_object *vso = pointer2cell( pointer ).payload.vectorp.address; - fputws( L"get_stack_frame: got a pointer, about to test it\n", stderr ); + debug_print( L"get_stack_frame: got a pointer, about to test it\n", + DEBUG_ALLOC ); - if ( vectorpointp( pointer ) ) { // && stackframep(vso)){ - fputws( L"get_stack_frame: pointer is good, about to set the result\n", - stderr ); + if ( vectorpointp( pointer ) && stackframep( vso ) ) { + debug_print + ( L"get_stack_frame: pointer is good, about to set the result\n", + DEBUG_ALLOC ); result = ( struct stack_frame * ) &( vso->payload ); - fputws( L"get_stack_frame: all good, returning\n", stderr ); + fwprintf( stderr, L"get_stack_frame: all good, returning %p\n", + result ); } else { - fputws( L"get_stack_frame: fail, returning NULL\n", stderr ); + debug_print( L"get_stack_frame: fail, returning NULL\n", DEBUG_ALLOC ); } return result; @@ -57,11 +62,20 @@ struct stack_frame *get_stack_frame( struct cons_pointer pointer ) { * @return the new frame, or NULL if memory is exhausted. */ struct cons_pointer make_empty_frame( struct cons_pointer previous ) { - fputws( L"Entering make_empty_frame\n", stderr ); + debug_print( L"Entering make_empty_frame\n", DEBUG_ALLOC ); struct cons_pointer result = make_vso( STACKFRAMETAG, sizeof( struct stack_frame ) ); + + debug_dump_object( result, DEBUG_ALLOC ); + + fwprintf( stderr, + L"make_empty_frame: got vector_space_object with size %lu, tag %4.4s\n", + pointer_to_vso( result )->header.size, + &pointer_to_vso( result )->header.tag.bytes ); + if ( !nilp( result ) ) { - fputws( L"make_empty_frame: about to call get_stack_frame\n", stderr ); + debug_print( L"make_empty_frame: about to call get_stack_frame\n", + DEBUG_ALLOC ); struct stack_frame *frame = get_stack_frame( result ); /* * TODO: later, pop a frame off a free-list of stack frames @@ -69,9 +83,10 @@ struct cons_pointer make_empty_frame( struct cons_pointer previous ) { fwprintf( stderr, L"make_empty_frame: about to set previous to %4.4s\n", - pointer2cell( previous ).tag ); + &pointer2cell( previous ).tag.bytes ); frame->previous = previous; - fputws( L"make_empty_frame: about to call inc_ref\n", stderr ); + debug_print( L"make_empty_frame: about to call inc_ref\n", + DEBUG_ALLOC ); inc_ref( previous ); /* @@ -82,13 +97,13 @@ struct cons_pointer make_empty_frame( struct cons_pointer previous ) { frame->function = NIL; frame->args = 0; - fputws( L"make_empty_frame: about to initialise arg registers\n", - stderr ); + debug_print( L"make_empty_frame: about to initialise arg registers\n", + DEBUG_ALLOC ); for ( int i = 0; i < args_in_frame; i++ ) { set_reg( frame, i, NIL ); } } - fputws( L"Leaving make_empty_frame\n", stderr ); + debug_print( L"Leaving make_empty_frame\n", DEBUG_ALLOC ); return result; } @@ -104,7 +119,7 @@ struct cons_pointer make_empty_frame( struct cons_pointer previous ) { struct cons_pointer make_stack_frame( struct cons_pointer previous, struct cons_pointer args, struct cons_pointer env ) { - fputws( L"Entering make_stack_frame\n", stderr ); + debug_print( L"Entering make_stack_frame\n", DEBUG_ALLOC ); struct cons_pointer result = make_empty_frame( previous ); if ( nilp( result ) ) { @@ -164,12 +179,11 @@ struct cons_pointer make_stack_frame( struct cons_pointer previous, frame->more = more; inc_ref( more ); } -#ifdef DEBUG - dump_frame( stderr, result ); -#endif + + debug_dump_object( result, DEBUG_ALLOC ); } } - fputws( L"Leaving make_stack_frame\n", stderr ); + debug_print( L"Leaving make_stack_frame\n", DEBUG_ALLOC ); return result; } @@ -185,7 +199,7 @@ struct cons_pointer make_stack_frame( struct cons_pointer previous, struct cons_pointer make_special_frame( struct cons_pointer previous, struct cons_pointer args, struct cons_pointer env ) { - fputws( L"Entering make_special_frame\n", stderr ); + debug_print( L"Entering make_special_frame\n", DEBUG_ALLOC ); struct cons_pointer result = make_empty_frame( previous ); @@ -213,12 +227,11 @@ struct cons_pointer make_special_frame( struct cons_pointer previous, frame->more = args; inc_ref( args ); } -#ifdef DEBUG - dump_frame( stderr, result ); -#endif + + debug_dump_object( result, DEBUG_ALLOC ); } } - fputws( L"Leaving make_special_frame\n", stderr ); + debug_print( L"Leaving make_special_frame\n", DEBUG_ALLOC ); return result; } diff --git a/src/memory/stack.h b/src/memory/stack.h index 20acd73..b56f432 100644 --- a/src/memory/stack.h +++ b/src/memory/stack.h @@ -33,13 +33,13 @@ /** * is this vector-space object a stack frame? */ -#define stackframep(vso)(vso->header.tag.value == STACKFRAMETV) +#define stackframep(vso)(((struct vector_space_object *)vso)->header.tag.value == STACKFRAMETV) /** * set a register in a stack frame. Alwaye use this macro to do so, • because that way we can be sure the inc_ref happens! */ -#define set_reg(frame,register,value)frame->arg[register]=value; inc_ref(value) +#define set_reg(frame,register,value){frame->arg[register]=value; inc_ref(value);} struct stack_frame *get_stack_frame( struct cons_pointer pointer ); diff --git a/src/memory/vectorspace.c b/src/memory/vectorspace.c index db39b48..7dbe682 100644 --- a/src/memory/vectorspace.c +++ b/src/memory/vectorspace.c @@ -21,6 +21,7 @@ #include "conspage.h" #include "consspaceobject.h" +#include "dump.h" #include "vectorspace.h" @@ -30,19 +31,18 @@ * NOTE that `tag` should be the vector-space tag of the particular type of * vector-space object, NOT `VECTORPOINTTAG`. */ -struct cons_pointer make_vec_pointer( char *tag, - struct vector_space_object *address ) { +struct cons_pointer make_vec_pointer( struct vector_space_object *address ) { fputws( L"Entered make_vec_pointer\n", stderr ); struct cons_pointer pointer = allocate_cell( VECTORPOINTTAG ); - struct cons_space_object cell = pointer2cell( pointer ); + struct cons_space_object *cell = &pointer2cell( pointer ); fwprintf( stderr, - L"make_vec_pointer: allocated cell, about to write tag '%s'\n", - tag ); - strncpy( &cell.payload.vectorp.tag.bytes[0], tag, 4 ); - fputws( L"make_vec_pointer: tag written, about to set pointer address\n", - stderr ); - cell.payload.vectorp.address = address; - fputws( L"make_vec_pointer: all good, returning\n", stderr ); + L"make_vec_pointer: tag written, about to set pointer address to %p\n", + address ); + cell->payload.vectorp.address = address; + fwprintf( stderr, L"make_vec_pointer: all good, returning pointer to %p\n", + cell->payload.vectorp.address ); + + dump_object( stderr, pointer ); return pointer; } @@ -66,24 +66,32 @@ struct cons_pointer make_vso( char *tag, uint64_t payload_size ) { struct vector_space_object *vso = malloc( padded ); if ( vso != NULL ) { - fwprintf( stderr, L"make_vso: about to write tag '%s'\n", tag ); + fwprintf( stderr, + L"make_vso: about to write tag '%s' into vso at %p\n", tag, + vso ); strncpy( &vso->header.tag.bytes[0], tag, TAGLENGTH ); - vso->header.vecp = make_vec_pointer( tag, vso ); + result = make_vec_pointer( vso ); + dump_object( stderr, result ); + vso->header.vecp = result; + // memcpy(vso->header.vecp, result, sizeof(struct cons_pointer)); + vso->header.size = payload_size; #ifdef DEBUG fwprintf( stderr, - L"Allocated vector-space object of type %4.4s, total size %ld, payload size %ld\n", - tag, total_size, payload_size ); + L"Allocated vector-space object of type %4.4s, total size %ld, payload size %ld, at address %p, payload address %p\n", + &vso->header.tag.bytes, total_size, vso->header.size, vso, + &vso->payload ); if ( padded != total_size ) { fwprintf( stderr, L"\t\tPadded from %d to %d\n", total_size, padded ); } #endif - - result = vso->header.vecp; } - fputws( L"make_vso: all good, returning\n", stderr ); +#ifdef DEBUG + fwprintf( stderr, L"make_vso: all good, returning pointer to %p\n", + pointer2cell( result ).payload.vectorp.address ); +#endif return result; } diff --git a/src/memory/vectorspace.h b/src/memory/vectorspace.h index caec968..1438d37 100644 --- a/src/memory/vectorspace.h +++ b/src/memory/vectorspace.h @@ -40,7 +40,7 @@ #define VECTORTAG "VECT" #define VECTORTV 0 -#define pointer_to_vso(pointer)((vectorpointp(pointer)? pointer2cell(pointer).payload.vectorp.address : NULL)) +#define pointer_to_vso(pointer)((vectorpointp(pointer)? (struct vector_space_object *) pointer2cell(pointer).payload.vectorp.address : (struct vector_space_object *) NULL)) #define vso_get_vecp(vso)((vso->header.vecp)) struct cons_pointer make_vso( char *tag, uint64_t payload_size ); diff --git a/src/ops/intern.c b/src/ops/intern.c index 100589a..8dea7c8 100644 --- a/src/ops/intern.c +++ b/src/ops/intern.c @@ -21,6 +21,7 @@ #include "conspage.h" #include "consspaceobject.h" +#include "debug.h" #include "equal.h" #include "lispops.h" #include "print.h" @@ -56,22 +57,22 @@ internedp( struct cons_pointer key, struct cons_pointer store ) { struct cons_space_object entry = pointer2cell( pointer2cell( next ).payload.cons.car ); - fputws( L"Internedp: checking whether `", stderr ); - print( stderr, key ); - fputws( L"` equals `", stderr ); - print( stderr, entry.payload.cons.car ); - fputws( L"`\n", stderr ); + debug_print( L"Internedp: checking whether `", DEBUG_ALLOC ); + debug_print_object( key, DEBUG_ALLOC ); + debug_print( L"` equals `", DEBUG_ALLOC ); + debug_print_object( entry.payload.cons.car, DEBUG_ALLOC ); + debug_print( L"`\n", DEBUG_ALLOC ); if ( equal( key, entry.payload.cons.car ) ) { result = entry.payload.cons.car; } } } else { - fputws( L"`", stderr ); - print( stderr, key ); - fputws( L"` is a ", stderr ); - print( stderr, c_type( key ) ); - fputws( L", not a SYMB", stderr ); + debug_print( L"`", DEBUG_ALLOC ); + debug_print_object( key, DEBUG_ALLOC ); + debug_print( L"` is a ", DEBUG_ALLOC ); + debug_print_object( c_type( key ), DEBUG_ALLOC ); + debug_print( L", not a SYMB", DEBUG_ALLOC ); } return result; @@ -120,7 +121,17 @@ bind( struct cons_pointer key, struct cons_pointer value, */ struct cons_pointer deep_bind( struct cons_pointer key, struct cons_pointer value ) { + debug_print( L"Entering deep_bind\n", DEBUG_ALLOC ); + debug_print( L"\tSetting ", DEBUG_ALLOC ); + debug_print_object( key, DEBUG_ALLOC ); + debug_print( L" to ", DEBUG_ALLOC ); + debug_print_object( value, DEBUG_ALLOC ); + debug_print( L"\n", DEBUG_ALLOC ); + oblist = bind( key, value, oblist ); + + debug_print( L"Leaving deep_bind\n", DEBUG_ALLOC ); + return oblist; } diff --git a/src/ops/lispops.c b/src/ops/lispops.c index 1e6712d..da3bc82 100644 --- a/src/ops/lispops.c +++ b/src/ops/lispops.c @@ -26,6 +26,8 @@ #include "consspaceobject.h" #include "conspage.h" +#include "debug.h" +#include "dump.h" #include "equal.h" #include "integer.h" #include "intern.h" @@ -83,9 +85,8 @@ struct cons_pointer eval_form( struct stack_frame *parent, struct cons_pointer parent_pointer, struct cons_pointer form, struct cons_pointer env ) { - fputws( L"eval_form: ", stderr ); - print( stderr, form ); - fputws( L"\n", stderr ); + debug_print( L"eval_form: ", DEBUG_EVAL ); + debug_dump_object( form, DEBUG_EVAL ); struct cons_pointer result = NIL; struct cons_pointer next_pointer = make_empty_frame( parent_pointer ); @@ -148,9 +149,8 @@ struct cons_pointer compose_body( struct stack_frame *frame ) { } } - fputws( L"compose_body returning ", stderr ); - print( stderr, body ); - fputws( L"\n", stderr ); + debug_print( L"compose_body returning ", DEBUG_LAMBDA ); + debug_dump_object( body, DEBUG_LAMBDA ); return body; } @@ -180,13 +180,10 @@ lisp_nlambda( struct stack_frame *frame, struct cons_pointer frame_pointer, } void log_binding( struct cons_pointer name, struct cons_pointer val ) { -#ifdef DEBUG - fputws( L"\n\tBinding ", stderr ); - print( stderr, name ); - fputws( L" to ", stderr ); - print( stderr, val ); - fputws( L"\"\n", stderr ); -#endif + debug_print( L"\n\tBinding ", DEBUG_ALLOC ); + debug_dump_object( name, DEBUG_ALLOC ); + debug_print( L" to ", DEBUG_ALLOC ); + debug_dump_object( val, DEBUG_ALLOC ); } /** @@ -236,9 +233,9 @@ eval_lambda( struct cons_space_object cell, struct stack_frame *frame, while ( !nilp( body ) ) { struct cons_pointer sexpr = c_car( body ); body = c_cdr( body ); -#ifdef DEBUG - fputws( L"In lambda: ", stderr ); -#endif + + debug_print( L"In lambda: ", DEBUG_LAMBDA ); + result = eval_form( frame, frame_pointer, sexpr, new_env ); } @@ -414,8 +411,8 @@ lisp_eval( struct stack_frame *frame, struct cons_pointer frame_pointer, struct cons_pointer result = frame->arg[0]; struct cons_space_object cell = pointer2cell( frame->arg[0] ); + debug_print( L"Eval: ", DEBUG_EVAL ); #ifdef DEBUG - fputws( L"Eval: ", stderr ); dump_frame( stderr, frame_pointer ); #endif @@ -455,11 +452,8 @@ lisp_eval( struct stack_frame *frame, struct cons_pointer frame_pointer, break; } -#ifdef DEBUG - fputws( L"Eval returning ", stderr ); - print( stderr, result ); - fputws( L"\n", stderr ); -#endif + debug_print( L"Eval returning ", DEBUG_EVAL ); + debug_dump_object( result, DEBUG_EVAL ); return result; } @@ -476,7 +470,7 @@ struct cons_pointer lisp_apply( struct stack_frame *frame, struct cons_pointer frame_pointer, struct cons_pointer env ) { #ifdef DEBUG - fputws( L"Apply: ", stderr ); + debug_print( L"Apply: ", DEBUG_EVAL ); dump_frame( stderr, frame_pointer ); #endif set_reg( frame, 0, make_cons( frame->arg[0], frame->arg[1] ) ); @@ -484,11 +478,8 @@ lisp_apply( struct stack_frame *frame, struct cons_pointer frame_pointer, struct cons_pointer result = c_apply( frame, frame_pointer, env ); -#ifdef DEBUG - fputws( L"Apply returning ", stderr ); - print( stderr, result ); - fputws( L"\n", stderr ); -#endif + debug_print( L"Apply returning ", DEBUG_EVAL ); + debug_dump_object( result, DEBUG_EVAL ); return result; } @@ -690,13 +681,20 @@ lisp_equal( struct stack_frame *frame, struct cons_pointer frame_pointer, struct cons_pointer lisp_read( struct stack_frame *frame, struct cons_pointer frame_pointer, struct cons_pointer env ) { +#ifdef DEBUG + debug_print( L"entering lisp_read\n", DEBUG_IO ); +#endif FILE *input = stdin; if ( readp( frame->arg[0] ) ) { input = pointer2cell( frame->arg[0] ).payload.stream.stream; } - return read( frame, frame_pointer, input ); + struct cons_pointer result = read( frame, frame_pointer, input ); + debug_print( L"lisp_read returning\n", DEBUG_IO ); + debug_dump_object( result, DEBUG_IO ); + + return result; } @@ -745,23 +743,22 @@ struct cons_pointer lisp_reverse( struct stack_frame *frame, struct cons_pointer lisp_print( struct stack_frame *frame, struct cons_pointer frame_pointer, struct cons_pointer env ) { -#ifdef DEBUG - fputws( L"Entering print\n", stderr ); -#endif + debug_print( L"Entering print\n", DEBUG_IO ); struct cons_pointer result = NIL; FILE *output = stdout; if ( writep( frame->arg[1] ) ) { + debug_print( L"lisp_print: setting output stream\n", DEBUG_IO ); + debug_dump_object( frame->arg[1], DEBUG_IO ); output = pointer2cell( frame->arg[1] ).payload.stream.stream; } + debug_print( L"lisp_print: about to print\n", DEBUG_IO ); + debug_dump_object( frame->arg[0], DEBUG_IO ); result = print( output, frame->arg[0] ); -#ifdef DEBUG - fputws( L"Print returning ", stderr ); - // print( stderr, result ); - fputws( L"\n", stderr ); -#endif + debug_print( L"lisp_print returning\n", DEBUG_IO ); + debug_dump_object( result, DEBUG_IO ); return result; } @@ -828,8 +825,8 @@ lisp_cond( struct stack_frame *frame, struct cons_pointer frame_pointer, for ( int i = 0; i < args_in_frame && !done; i++ ) { struct cons_pointer clause_pointer = frame->arg[i]; - fputws( L"Cond clause: ", stderr ); - print( stderr, clause_pointer ); + debug_print( L"Cond clause: ", DEBUG_EVAL ); + debug_dump_object( clause_pointer, DEBUG_EVAL ); if ( consp( clause_pointer ) ) { struct cons_space_object cell = pointer2cell( clause_pointer ); @@ -876,8 +873,8 @@ lisp_cond( struct stack_frame *frame, struct cons_pointer frame_pointer, struct cons_pointer throw_exception( struct cons_pointer message, struct cons_pointer frame_pointer ) { - fwprintf( stderr, L"\nERROR: " ); - print( stderr, message ); + debug_print( L"\nERROR: ", DEBUG_EVAL ); + debug_dump_object( message, DEBUG_EVAL ); struct cons_pointer result = NIL; struct cons_space_object cell = pointer2cell( message ); diff --git a/src/ops/read.c b/src/ops/read.c index 7d21dbe..e3cb480 100644 --- a/src/ops/read.c +++ b/src/ops/read.c @@ -18,6 +18,8 @@ #include <wctype.h> #include "consspaceobject.h" +#include "debug.h" +#include "dump.h" #include "integer.h" #include "intern.h" #include "lispops.h" @@ -59,6 +61,7 @@ struct cons_pointer c_quote( struct cons_pointer arg ) { struct cons_pointer read_continuation( struct stack_frame *frame, struct cons_pointer frame_pointer, FILE * input, wint_t initial ) { + debug_print( L"entering read_continuation\n", DEBUG_IO ); struct cons_pointer result = NIL; wint_t c; @@ -141,6 +144,8 @@ struct cons_pointer read_continuation( struct stack_frame *frame, break; } } + debug_print( L"read_continuation returning\n", DEBUG_IO ); + debug_dump_object( result, DEBUG_IO ); return result; } @@ -154,6 +159,7 @@ struct cons_pointer read_number( struct stack_frame *frame, struct cons_pointer frame_pointer, FILE * input, wint_t initial, bool seen_period ) { + debug_print( L"entering read_number\n", DEBUG_IO ); struct cons_pointer result = NIL; int64_t accumulator = 0; int64_t dividend = 0; @@ -210,9 +216,6 @@ struct cons_pointer read_number( struct stack_frame *frame, if ( negative ) { rv = 0 - rv; } -#ifdef DEBUG - fwprintf( stderr, L"read_numer returning %Lf\n", rv ); -#endif result = make_real( rv ); } else if ( dividend != 0 ) { result = @@ -225,6 +228,9 @@ struct cons_pointer read_number( struct stack_frame *frame, result = make_integer( accumulator ); } + debug_print( L"read_number returning\n", DEBUG_IO ); + debug_dump_object( result, DEBUG_IO ); + return result; } @@ -248,12 +254,9 @@ struct cons_pointer read_list( struct stack_frame *frame, make_cons( car, read_list( frame, frame_pointer, input, fgetwc( input ) ) ); + } else { + debug_print( L"End of list detected\n", DEBUG_IO ); } -#ifdef DEBUG - else { - fwprintf( stderr, L"End of list detected\n" ); - } -#endif return result; } @@ -324,11 +327,8 @@ struct cons_pointer read_symbol( FILE * input, wint_t initial ) { break; } -#ifdef DEBUG - fputws( L"Read symbol '", stderr ); - print( stderr, result ); - fputws( L"'\n", stderr ); -#endif + debug_print( L"read_symbol returning\n", DEBUG_IO ); + debug_dump_object( result, DEBUG_IO ); return result; } diff --git a/src/repl.c b/src/repl.c index d077ba8..f0dcbfa 100644 --- a/src/repl.c +++ b/src/repl.c @@ -13,6 +13,7 @@ #include "conspage.h" #include "consspaceobject.h" +#include "dump.h" #include "intern.h" #include "lispops.h" #include "read.h" @@ -32,19 +33,25 @@ */ struct cons_pointer repl_read( struct cons_pointer stream_pointer ) { struct cons_pointer result = NIL; + fputws( L"Entered repl_read\n", stderr ); struct cons_pointer frame_pointer = make_empty_frame( NIL ); + fputws( L"repl_read: got stack_frame pointer\n", stderr ); + dump_object( stderr, frame_pointer ); if ( !nilp( frame_pointer ) ) { inc_ref( frame_pointer ); struct stack_frame *frame = get_stack_frame( frame_pointer ); if ( frame != NULL ) { - + fputws( L"repl_read: about to set register\n", stderr ); set_reg( frame, 0, stream_pointer ); + fputws( L"repl_read: about to read\n", stderr ); struct cons_pointer result = lisp_read( frame, frame_pointer, oblist ); } dec_ref( frame_pointer ); } + fputws( L"repl_read: returning\n", stderr ); + dump_object( stderr, result ); return result; } @@ -53,6 +60,7 @@ struct cons_pointer repl_read( struct cons_pointer stream_pointer ) { * Dummy up a Lisp eval call with its own stack frame. */ struct cons_pointer repl_eval( struct cons_pointer input ) { + fputws( L"Entered repl_eval\n", stderr ); struct cons_pointer result = NIL; struct cons_pointer frame_pointer = make_empty_frame( NIL ); if ( !nilp( frame_pointer ) ) { @@ -66,6 +74,8 @@ struct cons_pointer repl_eval( struct cons_pointer input ) { dec_ref( frame_pointer ); } + fputws( L"repl_eval: returning\n", stderr ); + dump_object( stderr, result ); return result; } @@ -75,6 +85,7 @@ struct cons_pointer repl_eval( struct cons_pointer input ) { */ struct cons_pointer repl_print( struct cons_pointer stream_pointer, struct cons_pointer value ) { + struct cons_pointer result = NIL; struct cons_pointer frame_pointer = make_empty_frame( NIL ); if ( !nilp( frame_pointer ) ) { @@ -102,12 +113,12 @@ struct cons_pointer repl_print( struct cons_pointer stream_pointer, void repl( FILE * in_stream, FILE * out_stream, FILE * error_stream, bool show_prompt ) { + fputws( L"Entered repl\n", stderr ); struct cons_pointer input_stream = make_read_stream( in_stream ); - pointer2cell( input_stream ).count = MAXREFERENCE; + inc_ref( input_stream ); struct cons_pointer output_stream = make_write_stream( out_stream ); - pointer2cell( output_stream ).count = MAXREFERENCE; - + inc_ref( output_stream ); while ( !feof( pointer2cell( input_stream ).payload.stream.stream ) ) { if ( show_prompt ) { fwprintf( out_stream, L"\n:: " );