aboutsummaryrefslogtreecommitdiff
path: root/pkg/xtools/inlfit/ingdefkey.x
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/xtools/inlfit/ingdefkey.x')
-rw-r--r--pkg/xtools/inlfit/ingdefkey.x182
1 files changed, 182 insertions, 0 deletions
diff --git a/pkg/xtools/inlfit/ingdefkey.x b/pkg/xtools/inlfit/ingdefkey.x
new file mode 100644
index 00000000..2154389d
--- /dev/null
+++ b/pkg/xtools/inlfit/ingdefkey.x
@@ -0,0 +1,182 @@
+include "inlfitdef.h"
+include <pkg/inlfit.h>
+
+# Abort label
+define abort 9999
+
+
+# ING_DEFKEY - Define graph keys
+
+procedure ing_defkey (in, nvars, newgraph)
+
+pointer in # INLFIT descriptor
+int nvars # number of variables
+int newgraph # update graph ?
+
+char ch
+int key # graph key
+int axis # axis number
+int type[2], num[2] # key types and numbers
+int n, ip
+pointer line, word, vlabels, str, sp
+
+int scan()
+int ctoi()
+int strdic(), strlen()
+int inlstrext(), inlstrwrd()
+int in_geti()
+
+begin
+ # Allocate string space.
+ call smark (sp)
+ call salloc (line, SZ_LINE + 1, TY_CHAR)
+ call salloc (word, SZ_LINE + 1, TY_CHAR)
+ call salloc (vlabels, SZ_LINE + 1, TY_CHAR)
+ call salloc (str, SZ_LINE + 1, TY_CHAR)
+
+ # Get graph key to define.
+ call printf ("Graph key to be defined: ")
+ call flush (STDOUT)
+ if (scan() == EOF)
+ goto abort
+ call gargc (ch)
+
+ # Convert key type into key number.
+ switch (ch) {
+ case '\n':
+ goto abort
+ case 'h', 'i', 'j', 'k', 'l':
+ switch (ch) {
+ case 'h':
+ key = 1
+ case 'i':
+ key = 2
+ case 'j':
+ key = 3
+ case 'k':
+ key = 4
+ case 'l':
+ key = 5
+ }
+ default:
+ call eprintf ("Not a graph key, choose: [h, i, j, k, l]\n")
+ goto abort
+ }
+
+ # Get variable label pointer.
+ call in_gstr (in, INLVLABELS, Memc[vlabels], SZ_LINE)
+
+ # Print current settings for the axis types.
+ call printf ("Set graph axis types (")
+ do axis = 1, 2 {
+ call in_gkey (in, key, axis, type[axis], num[axis])
+ switch (type[axis]) {
+ case KEY_FUNCTION:
+ call printf ("function")
+ case KEY_FIT:
+ call printf ("fit")
+ case KEY_RESIDUALS:
+ call printf ("residuals")
+ case KEY_RATIO:
+ call printf ("ratio")
+ case KEY_NONLINEAR:
+ call printf ("nonlinear")
+ case KEY_UAXIS:
+ call sprintf (Memc[str], SZ_LINE, "user%d")
+ call pargi (num[axis])
+ call printf (Memc[str])
+ case KEY_VARIABLE:
+ if (inlstrwrd (num[axis], Memc[str], SZ_LINE,
+ Memc[vlabels]) != 0)
+ call printf (Memc[str])
+ else {
+ call sprintf (Memc[str], SZ_LINE, "var%d")
+ call pargi (num[axis])
+ call printf (Memc[str])
+ }
+ default:
+ call error (0, "ing_defkey: Illegal key type")
+ }
+ if (axis == 1)
+ call printf (", ")
+ }
+ call printf (") : ")
+ call flush (STDOUT)
+
+ # Get line from the input stream.
+ if (scan() == EOF)
+ goto abort
+ call gargstr (Memc[line], SZ_LINE)
+
+ # Get new axis types from input line.
+ ip = 1
+ axis = 1
+ call sscan (Memc[line])
+ while (axis <= 2) {
+
+ # Get word from line.
+ if (inlstrext (Memc[line], ip, ", ", YES, Memc[word],
+ SZ_LINE) == 0) {
+ if (axis == 2)
+ call eprintf ("Incomplete definition, usage: X,Y\n")
+ goto abort
+ }
+
+ # Search for word in the type dictionary. Keywords can
+ # be abreviated up to three characters to avoid conflicts
+ # with user variables.
+ if (strlen (Memc[word]) >= 3)
+ type[axis] = strdic (Memc[word], Memc[str], SZ_LINE, KEY_TYPES)
+ else
+ type[axis] = 0
+
+ # Check type.
+ if (type[axis] == 0) {
+ type[axis] = KEY_VARIABLE
+ num[axis] = strdic (Memc[word], Memc[str], SZ_LINE,
+ Memc[vlabels])
+ if (num[axis] == 0) {
+ call eprintf ("Not a defined key type (%s), choose: [%s]\n")
+ call pargstr (Memc[word])
+ call pargstr (Memc[vlabels])
+ goto abort
+ }
+ } else if (type[axis] == KEY_VARIABLE || type[axis] ==
+ KEY_UAXIS) {
+ if (inlstrext (Memc[line], ip, ", ", YES, Memc[word],
+ SZ_LINE) == 0) {
+ call eprintf ("Incomplete definition, usage: X,Y\n")
+ goto abort
+ }
+ n = 1
+ if (ctoi (Memc[word], n, num[axis]) == 0) {
+ call eprintf ( "Not a valid var/user number (%s)\n")
+ call pargstr (Memc[word])
+ goto abort
+ }
+ if (type[axis] == KEY_VARIABLE && num[axis] > nvars) {
+ call eprintf ( "Variable number does not exist (%s)\n")
+ call pargstr (Memc[word])
+ goto abort
+ }
+ } else
+ num[axis] = INDEFI
+
+ # Count axis
+ axis = axis + 1
+ }
+
+ # Update axis types.
+ call in_pkey (in, key, 1, type[1], num[1])
+ call in_pkey (in, key, 2, type[2], num[2])
+
+ # Test if screen needs to be refreshed.
+ if (in_geti (in, INLGKEY) == key)
+ newgraph = YES
+ else
+ newgraph = NO
+
+abort
+ # Free memory.
+ call sfree (sp)
+end