|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T a ┃
Length: 7080 (0x1ba8) Types: TextFile Names: »addfuncs.n«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/basic/docs/addfuncs.n«
Notes for updateing and maintaining Basic. (c) P. (Rabbit) Cockcroft 1982. 1) Variables and their uses. char *point - This points to the next character that will be interpreted. typedef struct lin *lpoint lpoint stocurlin - Points to the start of the line structure of the current line. Is null in direct mode. unsigned curline - Linenumber of current line being executed. Zero in direct mode. lpoint errortrap - Pointer to start of line where error trapping will go to. Null if no error trapping. char inserted - Flag set if program has been changed. Used to clear data space if program text changed. char trapped - Set if cntrl-c has been hit. Will cause program to exit next time through the execute routine. char elsecount - Set if elses are legal terminators. (After an if statement only). char runmode - Set if in runmode. Zero in direct mode. char vartype - Type of variable. Set by getname() - get a variable, getop() - get a number and several of the other functions. Values:- 0) Floating point variable 1) Integer variable 2) String variable. char *filestart - Pointer to start of file buffers. If you want to add more dynamic buffers for other purposes. Put them in before filestart is initialised. For semi permanent buffers. Or place them after estarr and change data space by using xpand (Fairly unstable). char *fendcore - End of file buffers start of basic text. char *ecore - End of basic program. char *vvend - Very end of allocated data. Changes very quickly ( by for-next - gosub stack ). typedef value union { double f; int i; }; value res - General purpose register for maths. Result always in here. (else return value from evalint() ). long overfl - Used when integer maths overflows. Value is converted from long to double with vartype set accordingly by over(). int cursor - Current cursor location across screen. char line[] - Input line. Place where edit and readfi() put the input line. Where the editor works. Input to compile function. char nline[] - Compiled line is here. What is executed in direct mode. Sqirelled away by insert(). int (*functb[]), (*functs[]), (*commandf[]), (*strngcommand[]) - Maths , Command, and string function jump tables. char *ermsg[] - Table of error messages. To add other error messages put them at the end of this table and increment MAXERR. Other pointers and variables are used for various purposes probarbly not needed for adding functions. Don't change them if you don't know what they do. 2) Useful functions.etc. object *getname() - If point points to a valid name then returns a pointer to it. If variable does not exist create it. (Will not create arrays). Only ever returns with a valid pointer. int getch() - Get the next character on the line. Ignores spaces. ( Care must be used at end of line so don't run off). int check() - calls error if not at the end of a statement. Use when got all arguments and want to see if and garbage is at end of command. int error() - Call error routines. Will always tidy up. Sets error code to parameter. (NO checking of parameter is done). THIS ROUTINE NEVER RETURNS. WILL ALWAYS GET YOU OUT FROM WHERE YOU ARE BACK TO COMMAND MODE. (Useful). int eval() - Will evaluate any mathematical expression. The result will be in res with vartype set accordingly. int evalint() - Will call eval() and then returns an integer if possible. Otherwise returns -1. (Negative values are usually thought of as an error). int stringeval(f) - Will evaluate string expressions. f is the destination it must be a pointer to a character array of at least 256 characters. (Usually gblock or on stack or allocated by grow() -actually on the stack). gcursiz will contain the length of the string. N.B. gblock (can) will be corrupted by stringeval and the input routine ( edit() ). int edit(f1,f2) - Input routine from the terminal. (Full editor). f1 is number of characters to be used as a prompt. (in line[] ), f2 is the number of characters to be printed out at the start. (so can be used to edit the given string. The string must already be in line[]. f2 must never be less than f1. object *grow(v) - Will allocate v bytes on the stack. V must be even. Should be used for maths functions which need a lot of stack space for their local variables. It will call error if it runs out of stack space. (Will only use one segmentation register for the stack. Rest is for program and data). Returns a pointer to the space. (This means that 75 or so brackets can be used). int istermin(c), isletter(c), isdigit(c) - Macros that return true if c is a terminator, a letter or a digit. 3) Adding More functions, commands. etc. The basic idea is to put an entry in the corresponding table and to add the function name and token value into the tokenising table at the correct spot. Commands need to return a value all others do not. Commands that need to change the direction of the program return -1 otherwise use 'normret'. - Most commands will return by using 'normret'. Maths and string functions that require brackets fit perfectly into this scheme but the exceptions are as follows:- commands:- These require a zero to be deleted and the function to be added in it's place this is so that mid$ can be used on the left hand side of a statement. Nothing else need be done. Maths functions without brackets or optional brackets:- These are nasty because the value of rnd is used for various uses. So :- Decrement the defined constant RND and then decrement the entry in the tokenising table. Place the new entry where RND used to be. ( Maybe you might like to make brackets not as tightly bound to functions - currently must be tight against the keyword (No particular reason but thats how I like functions to be)).