aboutsummaryrefslogtreecommitdiff
path: root/src/hyper/parse-paste.pamphlet
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2007-08-14 05:14:52 +0000
committerdos-reis <gdr@axiomatics.org>2007-08-14 05:14:52 +0000
commitab8cc85adde879fb963c94d15675783f2cf4b183 (patch)
treec202482327f474583b750b2c45dedfc4e4312b1d /src/hyper/parse-paste.pamphlet
downloadopen-axiom-ab8cc85adde879fb963c94d15675783f2cf4b183.tar.gz
Initial population.
Diffstat (limited to 'src/hyper/parse-paste.pamphlet')
-rw-r--r--src/hyper/parse-paste.pamphlet428
1 files changed, 428 insertions, 0 deletions
diff --git a/src/hyper/parse-paste.pamphlet b/src/hyper/parse-paste.pamphlet
new file mode 100644
index 00000000..af851bd7
--- /dev/null
+++ b/src/hyper/parse-paste.pamphlet
@@ -0,0 +1,428 @@
+\documentclass{article}
+\usepackage{axiom}
+\begin{document}
+\title{\$SPAD/src/parse-paste}
+\author{The Axiom Team}
+\maketitle
+\begin{abstract}
+\end{abstract}
+\eject
+\tableofcontents
+\eject
+\section{parse-paste.h}
+<<parse-paste.h>>=
+<<license>>
+#ifndef _PARSE_PASTE_H_
+#define _PARSE_PASTE_H_ 1
+
+#include "axiom-c-macros.h"
+#include "hyper.h"
+
+extern short int gInPaste;
+
+#endif
+@
+\section{parse-paste.c}
+<<parse-paste.c>>=
+/******************************************************************************
+ *
+ * parse-paste.c: HyperDoc routines for paste-in areas.
+ *
+ * Copyright The Numerical Algorithms Group Limited 1991, 1992, 1993.
+ *
+ ****************************************************************************/
+#define _PARSE_PASTE_C
+#include "axiom-c-macros.h"
+#include "useproto.h"
+#include "debug.h"
+
+
+#include "parse.h"
+#include "parse-aux.h"
+#include "mem.h"
+#include "display.h"
+#include "group.h"
+
+#include "all_hyper_proto.H1"
+
+
+extern FILE *cfile;
+short int gInPaste;
+
+
+void
+parse_paste(void)
+{
+ TextNode *pn = curr_node;
+ PasteNode *paste;
+ int where;
+
+ if (gParserRegion != Scrolling) {
+ fprintf(stderr, "(HyperDoc) Paste areas are only allowed in the scrolling area:");
+ print_page_and_filename();
+ jump();
+ }
+ gInPaste++;
+
+ /* now I need to get the name */
+ get_token();
+ if (token.type != Lbrace) {
+ fprintf(stderr, "(HyperDoc) A paste area needs a name:\n");
+ print_next_ten_tokens();
+ print_page_and_filename();
+ jump();
+ }
+ pn->data.text = alloc_string(get_input_string());
+ pn->type = Paste;
+
+ /*
+ * now see if there is already an entry in the hash_table for this thing,
+ * if not create it and put it there.
+ */
+ paste = (PasteNode *) hash_find(gWindow->fPasteHashTable, pn->data.text);
+ if (paste == 0) {
+ paste = alloc_paste_node(pn->data.text);
+ hash_insert(gWindow->fPasteHashTable, (char *)paste, paste->name);
+ }
+ else if (paste->haspaste) {
+ fprintf(stderr, "(HyperDoc) Tried to redefine paste area %s\n", paste->name);
+ print_page_and_filename();
+ /* jump(); */
+ }
+ paste->haspaste = 1;
+ paste->paste_item = current_item();
+ get_token();
+ if (token.type == Lsquarebrace) {
+ /* user wishes to specify a where to send the command */
+ where = get_where();
+ if (where == -1) {
+ paste->where = -1;
+ fprintf(stderr, "(HyperDoc) \\begin{paste} was expecting [lisp|unix|ht]\n");
+ print_next_ten_tokens();
+ print_page_and_filename();
+ jump();
+ }
+ else
+ paste->where = where;
+ get_token();
+ }
+ else
+ paste->where = FromFile;
+
+ /* now try to get the command argument or page name */
+ if (token.type != Lbrace) {
+ paste->where = 0;
+ fprintf(stderr, "(HyperDoc) \\begin{paste} was expecting an argument\n");
+ print_next_ten_tokens();
+ print_page_and_filename();
+ jump();
+ }
+ paste->arg_node = alloc_node();
+ curr_node = paste->arg_node;
+ parse_HyperDoc();
+ curr_node->type = Endarg;
+
+ gWindow->fDisplayedWindow = gWindow->fScrollWindow;
+
+ /* Now try to find the displaying text */
+ pn->next = alloc_node();
+ curr_node = pn->next;
+ parse_HyperDoc();
+ curr_node->type = Endpaste;
+ paste->end_node = curr_node;
+
+ paste->begin_node = pn;
+ gInPaste--;
+}
+
+void
+parse_pastebutton(void)
+{
+ PasteNode *paste;
+ TextNode *pb;
+
+ /*
+ * this routine parse a \pastebutton expression. The syntax is
+ * \pastebutton{name}
+ */
+ pb = curr_node;
+ pb->type = Pastebutton;
+
+ /* first thing I should do is get the name */
+ get_token();
+ if (token.type != Lbrace) {
+ fprintf(stderr, "(HyperDoc) \\pastebutton needs a name\n");
+ print_page_and_filename();
+ print_next_ten_tokens();
+ jump();
+ }
+ pb->data.text = alloc_string(get_input_string());
+
+ /*
+ * now I should see if the paste area has already been parsed, and if not
+ * I should create a spot in the hash table for it
+ */
+ paste = (PasteNode *) hash_find(gWindow->fPasteHashTable, pb->data.text);
+ if (paste == 0) {
+ paste = alloc_paste_node(pb->data.text);
+ hash_insert(gWindow->fPasteHashTable,(char *) paste, paste->name);
+ }
+ else if (paste->hasbutton) {
+ fprintf(stderr, "(HyperDoc) Tried to redefine paste area %s\n", paste->name);
+ print_page_and_filename();
+ /* jump(); */
+ }
+ paste->hasbutton = 1;
+
+ /* Now we need to parse the HyperDoc and for the displayed text */
+
+ get_token();
+ if (token.type != Lbrace) {
+ fprintf(stderr, "(HyperDoc) \\pastebutton was expecting a { \n");
+ print_page_and_filename();
+ print_next_ten_tokens();
+ jump();
+ }
+ pb->next = alloc_node();
+ curr_node = pb->next;
+ parse_HyperDoc();
+ curr_node->type = Endpastebutton;
+
+ /* once that is done I need only make the window for this link */
+ pb->link = make_paste_window(paste);
+}
+
+
+/*
+ * this routine is responsible for parsing a patch from a file. To do this I
+ * guess er will init_scanner, then parse, the parsed piece of text
+ * will replace the current PasteNode which will be squashed down to
+ * nothing, and then discarded.
+ */
+
+HyperDocPage *
+parse_patch(PasteNode *paste)
+{
+ TextNode *new;
+ TextNode *end_node;
+ TextNode *begin_node;
+ TextNode *arg_node;
+ TextNode *throw;
+ TextNode *next_node;
+ InputItem *paste_item = paste->paste_item;
+ int where = paste->where;
+ GroupItem *g = paste->group;
+ ItemStack *is = paste->item_stack;
+ PatchStore *patch;
+ char *patch_name;
+ int ret_value = 1;
+
+ /* prepare to throw away the current paste node */
+ end_node = paste->end_node;
+ next_node = end_node->next;
+ begin_node = paste->begin_node;
+ arg_node = paste->arg_node;
+ throw = begin_node->next;
+
+ /* now read the new stuff and add it in between all this stuff */
+
+ switch (where) {
+ case FromFile:
+ patch_name = print_to_string(arg_node);
+ patch = (PatchStore *) hash_find(gWindow->fPatchHashTable, patch_name);
+ if (!patch) {
+ fprintf(stderr, "(HyperDoc) Unknown patch name %s\n", patch_name);
+ BeepAtTheUser();
+ return 0;
+ }
+ if (!patch->loaded)
+ load_patch(patch);
+ input_type = FromString;
+ input_string = patch->string;
+ break;
+ case FromSpadSocket:
+ input_type = FromSpadSocket;
+ ret_value = issue_serverpaste(arg_node);
+ if (ret_value < 0) {
+ paste->where = where;
+ paste->end_node = end_node;
+ paste->arg_node = arg_node;
+ paste->group = g;
+ paste->item_stack = is;
+ paste->haspaste = 1;
+ return 0;
+ }
+ break;
+ case FromUnixFD:
+ input_type = FromUnixFD;
+ issue_unixpaste(arg_node);
+ break;
+ default:
+ fprintf(stderr, "(HyperDoc) \\parsebutton error: Unknown where\n");
+ exit(-1);
+ break;
+ }
+
+ paste->where = 0;
+ paste->end_node = paste->arg_node = paste->begin_node = 0;
+ paste->group = 0;
+ paste->item_stack = 0;
+ paste->haspaste = 0;
+ paste->paste_item = 0;
+
+
+ /* set the jump buffer in case it is needed */
+ if (setjmp(jmpbuf)) {
+ /*** OOOPS, an error occurred ****/
+ fprintf(stderr, "(HyperDoc) Had an error parsing a patch: Goodbye!\n");
+ exit(-1);
+ }
+
+
+ end_node->next = 0;
+ free_node(throw, 1);
+
+ init_parse_patch(gWindow->page);
+ init_paste_item(paste_item);
+ get_token();
+ if (token.type != Patch) {
+ fprintf(stderr, "(HyperDoc) Pastebutton %s was expecting a patch\n",
+ paste->name);
+ jump();
+ }
+ if (input_type == FromString) {
+ get_token();
+ if (token.type != Lbrace) {
+ token_name(token.type);
+ fprintf(stderr, "(HyperDoc) Unexpected %s \n", ebuffer);
+ print_page_and_filename();
+ jump();
+ }
+
+ get_token();
+ if (token.type != Word) {
+ token_name(token.type);
+ fprintf(stderr, "(HyperDoc) Unexpected %s \n", ebuffer);
+ print_page_and_filename();
+ jump();
+ }
+
+ get_token();
+ if (token.type != Rbrace) {
+ token_name(token.type);
+ fprintf(stderr, "(HyperDoc) Unexpected %s \n", ebuffer);
+ print_page_and_filename();
+ jump();
+ }
+ }
+ new = alloc_node();
+ curr_node = new;
+ parse_HyperDoc();
+
+ /* Once I am back, I need only reallign all the text structures */
+ curr_node->type = Noop;
+ curr_node->next = next_node;
+ begin_node->next = new;
+ begin_node->type = Noop;
+ free(begin_node->data.text);
+ begin_node->data.text = 0;
+
+ gWindow->fDisplayedWindow = gWindow->fScrollWindow;
+
+ repaste_item();
+
+ paste_page(begin_node);
+
+ /* so now I should just be able to disappear */
+ return gWindow->page;
+}
+
+static void
+load_patch(PatchStore *patch)
+{
+ long start_fpos;
+ int size = 0;
+ int limsize;
+ char *trace;
+
+
+ save_scanner_state();
+ cfile = find_fp(patch->fpos);
+
+ init_scanner();
+
+ /** First thing I should do is make sure that the name is correct ***/
+ start_fpos = fpos;
+ get_expected_token(Patch);
+ get_expected_token(Lbrace);
+ get_expected_token(Word);
+ if (strcmp(token.id, patch->name)) {
+ /** WOW, Somehow I had the location of the wrong macro **/
+ fprintf(stderr, "(HyperDoc) Expected patch name %s: got instead %s in load_patch\n",
+ patch->name, token.id);
+ jump();
+ }
+ get_expected_token(Rbrace);
+
+ scan_HyperDoc();
+ fseek(cfile, patch->fpos.pos + start_fpos, 0);
+ limsize = fpos - start_fpos + 1;
+ patch->string = (char *) halloc((limsize + 1) * sizeof(char), "Patch String");
+ for (size = 1, trace = patch->string; size < limsize; size++)
+ *trace++ = getc(cfile);
+ *trace = '\0';
+ patch->loaded = 1;
+ restore_scanner_state();
+}
+
+
+@
+\section{License}
+<<license>>=
+/*
+Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - 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.
+
+ - Neither the name of The Numerical ALgorithms Group Ltd. 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.
+*/
+
+@
+<<*>>=
+<<license>>
+<<parse-paste.c>>
+@
+\eject
+\begin{thebibliography}{99}
+\bibitem{1} nothing
+\end{thebibliography}
+\end{document}
+
+
+
+