diff options
Diffstat (limited to 'noao/digiphot/photcal/mkconfig/t_config.x')
-rw-r--r-- | noao/digiphot/photcal/mkconfig/t_config.x | 1013 |
1 files changed, 1013 insertions, 0 deletions
diff --git a/noao/digiphot/photcal/mkconfig/t_config.x b/noao/digiphot/photcal/mkconfig/t_config.x new file mode 100644 index 00000000..a3a19767 --- /dev/null +++ b/noao/digiphot/photcal/mkconfig/t_config.x @@ -0,0 +1,1013 @@ +include <ctype.h> +include <fset.h> +include <lexnum.h> + +# define some of the working space parameters + +define CFG_MAXLENEQN SZ_LINE # maximum length of an expression +define CFG_MAXLENLINE 78 # maximum length of an output line +define CFG_MAXLENTRANS 16000 # maximum length of transformation area +define CFG_MAXLENPARAM 160 # maximum length of parameter area + +# define the internal help pages + +define CFG_CATHELP "photcal$mkconfig/catsection.key" +define CFG_OBSHELP "photcal$mkconfig/obsection.key" +define CFG_TRANSHELP "photcal$mkconfig/transection.key" + +# T_CONFIG -- Create the configuration file. + +procedure t_config() + +pointer output # pointer to the output configuration file +pointer template # pointer to template configuration file +pointer catalog # pointer to the template catalog section file +pointer observation # pointer to the template observation section file +pointer transform # pointer to the template transformation section file +pointer deriv # pointer to the derivative syntax string +int verify # verify each user entry + +int fd, cfd, ofd, tfd +pointer sp +bool clgetb() +int access(), open(), btoi() + +begin + # Set the standard output to flush on a newline. + call fseti (STDOUT, F_FLUSHNL, YES) + + # Allocate temporary space. + call smark (sp) + call salloc (output, SZ_FNAME, TY_CHAR) + call salloc (template, SZ_FNAME, TY_CHAR) + call salloc (catalog, SZ_FNAME, TY_CHAR) + call salloc (observation, SZ_FNAME, TY_CHAR) + call salloc (transform, SZ_FNAME, TY_CHAR) + call salloc (deriv, SZ_FNAME, TY_CHAR) + + # Get the parameters. + call clgstr ("config", Memc[output], SZ_FNAME) + verify = btoi (clgetb ("verify")) + + # Make the configuration file. If a template configuration file + # is supplied and exists then simply copy the template into the + # output configuration file. If no template is supplied begin + # prompting user for input. The user may supply a default + # catalog, observation or transformation section file in place of + # entering any given section by hand. + + call clgstr ("template", Memc[template], SZ_FNAME) + if (access (Memc[template], 0, 0) == YES) { + call fcopy (Memc[template], Memc[output]) + } else { + + fd = open (Memc[output], NEW_FILE, TEXT_FILE) + + call clgstr ("catalog", Memc[catalog], SZ_FNAME) + if (access (Memc[catalog], READ_ONLY, TEXT_FILE) == YES) + cfd = open (Memc[catalog], READ_ONLY, TEXT_FILE) + else + cfd = NULL + call clgstr ("observations", Memc[observation], SZ_FNAME) + if (access (Memc[observation], READ_ONLY, TEXT_FILE) == YES) + ofd = open (Memc[observation], READ_ONLY, TEXT_FILE) + else + ofd = NULL + call clgstr ("transform", Memc[transform], SZ_FNAME) + if (access (Memc[transform], READ_ONLY, TEXT_FILE) == YES) + tfd = open (Memc[transform], READ_ONLY, TEXT_FILE) + else + tfd = NULL + + call ph_wconfig (fd, cfd, ofd, tfd, verify) + + call close (fd) + if (cfd != NULL) + call close (cfd) + if (ofd != NULL) + call close (ofd) + if (tfd != NULL) + call close (tfd) + } + + call sfree (sp) +end + + +# PH_WCONFIG -- Write the catalog, observation and transfromation section +# of the configuration file by prompting the user. If the file descriptor +# to the transformation file is not NULL then copy the template +# transformation file into the tranformation section of the configuration +# file. + +procedure ph_wconfig (fd, cfd, ofd, tfd, verify) + +int fd # the output configuration file descriptor +int cfd # the input catalog file descriptor +int ofd # the input observation file descriptor +int tfd # the input transformation file descriptor +int verify # verify each user entry + +begin + # Enter the catalog section. + if ((cfd != NULL) && (cfd != STDIN)) + call fcopyo (cfd, fd) + else + call ph_rcsection (fd, "catalog", verify) + + # Enter the observation section. + if ((ofd != NULL) && (ofd != STDIN)) + call fcopyo (ofd, fd) + else + call ph_rosection (fd, "observation", verify) + + # Enter the transformation section. + if ((tfd != NULL) && (tfd != STDIN)) + call fcopyo (tfd, fd) + else + call ph_rtsection (fd, "transformation", verify) +end + + +# PH_RCSECTION -- Write the catalog section of the configuration file by +# prompting the user. + +procedure ph_rcsection (fd, keyword, verify) + +int fd # file descriptor for the output configuration file +char keyword[ARB] # keyword defining the configuration file section +int verify # verify each user entry + +int stat, number, newnumber +pointer sp, column, newcolumn +int ph_rcolnumber() + +begin + # Allocate working space. + call smark (sp) + call salloc (column, SZ_LINE, TY_CHAR) + call salloc (newcolumn, SZ_LINE, TY_CHAR) + + # Write the section title. + call fprintf (fd, "\n%s\n\n") + call pargstr (keyword) + + # Scan the standard input. + call printf ( + "\nENTER THE STANDARD STAR CATALOG FORMAT DESCRIPTION\n\n") + repeat { + + # Read the column name and number. + stat = ph_rcolnumber (CFG_CATHELP, Memc[column], SZ_LINE, number) + if (stat == EOF) + break + if (stat <= 0) + next + + # Verify and/or write the definition. + if (verify == NO) { + + # Write the definition. + call fprintf (fd, "%s %d\n") + call pargstr (Memc[column]) + call pargi (number) + next + + } else { + + call ph_vcolnumber (Memc[column], Memc[newcolumn], SZ_LINE, + number, newnumber) + call fprintf (fd, "%s %d\n") + call pargstr (Memc[newcolumn]) + call pargi (newnumber) + + } + } + call printf ("\n") + + call sfree (sp) +end + + +# PH_ROSECTION -- Write the observation section of the configuration file by +# prompting the user. + +procedure ph_rosection (fd, keyword, verify) + +int fd # file descriptor for the output configuration file +char keyword[ARB] # keyword defining the configuration file section +int verify # verify each user entry + +int stat, number, newnumber +pointer sp, column, newcolumn +int ph_rcolnumber() + +begin + call smark (sp) + call salloc (column, SZ_LINE, TY_CHAR) + call salloc (newcolumn, SZ_LINE, TY_CHAR) + + # Write the section title. + call fprintf (fd, "\n%s\n\n") + call pargstr (keyword) + + # Scan the standard input. + call printf ("\nENTER THE OBSERVATIONS FILE FORMAT DESCRIPTION\n\n") + repeat { + + # Read the column name and number. + stat = ph_rcolnumber (CFG_OBSHELP, Memc[column], SZ_LINE, number) + if (stat == EOF) + break + if (stat <= 0) + next + + # Verify and/or write the definition. + if (verify == NO) { + + call fprintf (fd, "%s %d\n") + call pargstr (Memc[column]) + call pargi (number) + next + + } else { + + call ph_vcolnumber (Memc[column], Memc[newcolumn], SZ_LINE, + number, newnumber) + call fprintf (fd, "%s %d\n") + call pargstr (Memc[newcolumn]) + call pargi (newnumber) + + } + } + call printf ("\n") + + call sfree (sp) +end + + +# PH_RTSECTION -- Write the observation section of the configuration file by +# prompting the user. + +procedure ph_rtsection (fd, keyword, verify) + +pointer fd # file descriptor for the output configuration file +char keyword[ARB] # keyword defining the section +int verify # verify each user entry + +int tfd, ffd, cfd, len_label, len_expr, len_dexpr +int neq, nparam, stat +pointer sp, label, param, str, expr, dexpr, trans, fit, const +int ph_rlabel(), ph_rexpr(), ph_rlist(), stropen() + +begin + # Allocate temporary working space. + call smark (sp) + call salloc (label, SZ_LINE, TY_CHAR) + call salloc (param, SZ_LINE, TY_CHAR) + call salloc (str, SZ_LINE, TY_CHAR) + call salloc (expr, CFG_MAXLENEQN, TY_CHAR) + call salloc (dexpr, CFG_MAXLENEQN, TY_CHAR) + + # Open the temporary string files. + call malloc (trans, CFG_MAXLENTRANS, TY_CHAR) + call malloc (fit, CFG_MAXLENPARAM, TY_CHAR) + call malloc (const, CFG_MAXLENTRANS, TY_CHAR) + tfd = stropen (Memc[trans], CFG_MAXLENTRANS, NEW_FILE) + ffd = stropen (Memc[fit], CFG_MAXLENPARAM, NEW_FILE) + cfd = stropen (Memc[const], CFG_MAXLENPARAM, NEW_FILE) + + # Write the section title. + call fprintf (fd, "\n%s\n\n") + call pargstr (keyword) + + call printf ("\nENTER THE TRANSFORMATION EQUATIONS\n") + + # Scan the standard input. + neq = 0 + repeat { + + # Get the parameters for each equation. + call printf ( + "\nEnter the label and functional form for EQUATION %d\n\n") + call pargi (neq + 1) + + # Fetch and verify the equation label. + len_label = ph_rlabel ("label (e.g. VFIT)", Memc[label], + SZ_LINE, verify) + if (len_label == EOF) + break + if (len_label <= 0) + next + + # Fetch and verify the transformation equation. + len_expr = ph_rexpr ("equation", Memc[expr], CFG_MAXLENEQN, neq + 1, + verify) + if (len_expr == EOF) + next + if (len_expr <= 0) { + call printf ("<Error> The function expression is blank\n") + next + } + + # Write the equation to a temporary string file. + iferr { + call ph_wequation (tfd, Memc[label], len_label, Memc[expr], + len_expr) + } then + break + + # Get the fitted parameters. + call printf ("\nEnter initial values for the ") + call printf ("parameters to be fit in EQUATION %d\n\n") + call pargi (neq + 1) + nparam = 1 + len_dexpr = 1 + repeat { + call sprintf (Memc[str], SZ_LINE, "%s %d") + call pargstr ("parameter") + call pargi (nparam) + stat = ph_rlist (Memc[dexpr], len_dexpr, CFG_MAXLENEQN, + Memc[str], verify) + if (stat == EOF) + break + if (stat <= 0) { + call printf ("\n") + call ph_wequation (STDOUT, Memc[label], len_label, + Memc[expr], len_expr) + call printf ("\n") + next + } else + nparam = nparam + 1 + } + + # Write the fitted parameters. + iferr { + if (nparam > 1) + call ph_wparam (ffd, "fit", 3, Memc[dexpr], len_dexpr - 3) + } then + break + + # Get the constant parameters. + call printf ("\nEnter initial values for the ") + call printf ("parameters to be held constant in EQUATION %d\n\n") + call pargi (neq + 1) + nparam = 1 + len_dexpr = 1 + repeat { + call sprintf (Memc[str], SZ_LINE, "%s%d and value") + call pargstr ("parameter") + call pargi (nparam) + stat = ph_rlist (Memc[dexpr], len_dexpr, CFG_MAXLENEQN, + Memc[str], verify) + if (stat == EOF) + break + if (stat <= 0) { + call printf ("\n") + call ph_wequation (STDOUT, Memc[label], len_label, + Memc[expr], len_expr) + call printf ("\n") + next + } else + nparam = nparam + 1 + } + + # Write the constant parameters. + iferr { + if (nparam > 1) + call ph_wparam (cfd, "const", 5, Memc[dexpr], len_dexpr - 3) + } then + break + + neq = neq + 1 + } + + call printf ("\n") + + # Close the string files. + call strclose (tfd) + call strclose (ffd) + call strclose (cfd) + + # Write output results to a file + call ph_wfile (fd, Memc[fit], CFG_MAXLENPARAM, Memc[const], + CFG_MAXLENPARAM, Memc[trans], CFG_MAXLENTRANS) + + # Free memory. + call mfree (trans, TY_CHAR) + call mfree (fit, TY_CHAR) + call mfree (const, TY_CHAR) + call sfree (sp) +end + + +# PH_RCOLNUMBER -- Read in the column name and number as an identifier and +# a number respectively. + +int procedure ph_rcolnumber (helpfile, column, max_lcolname, number) + +char helpfile[ARB] # name of the helpfile +char column[ARB] # name of the column +int max_lcolname # maximum length of the column name +int number # column number + +bool streq(), ph_isident() +int scan(), strmatch(), nscan() + +begin + # Issue the prompt. + call printf ( + "Enter column definition (name number, ?=help, <EOF>=quit entry): ") + call flush (STDOUT) + + if (scan () == EOF) + return (EOF) + call gargwrd (column, max_lcolname) + call gargi (number) + + # Check for errors. + if (streq (column, "?")) { + call pagefile (helpfile, "") + return (0) + } else if (! ph_isident (column) && strmatch (column, "error(") == 0) { + call printf ( + "<Error> %s is not a legal column name\n") + call pargstr (column) + return (0) + } else if (nscan() != 2) { + call printf ("<Error> Cannot decode the column number\n") + return (0) + } else if (number <= 1) { + call printf ( + "<Error> Column 1 is reserved for the object name\n") + return (0) + } + + return (nscan()) +end + + +# PH_VCOLNUMBER -- Verify the column name and number. + +procedure ph_vcolnumber (column, newcolumn, max_lcolname, number, newnumber) + +char column[ARB] # input column name +char newcolumn[ARB] # new column name +int max_lcolname # maximum length of the column name +int number # original column number +int newnumber # new column number + +bool ph_isident() +int scan(), nscan() + +begin + # Issue the verify prompt. + call printf ("\tVerify (%s %d) (name number, <CR>=ok): ") + call pargstr (column) + call pargi (number) + call flush (STDOUT) + + # Get the new values. + if (scan () == EOF) { + newcolumn[1] = EOS + call printf ("\n") + call flush (STDOUT) + } else + call gargstr (newcolumn, max_lcolname) + + # If the new input is not valid use the original values. + if (newcolumn[1] != EOS) { + call sscan (newcolumn) + call gargwrd (newcolumn, max_lcolname) + call gargi (newnumber) + if (! ph_isident(newcolumn)) + call strcpy (column, newcolumn, max_lcolname) + if (nscan() != 2) + newnumber = number + else if (newnumber <= 1) + newnumber = number + } else { + call strcpy (column, newcolumn, max_lcolname) + newnumber = number + } +end + + +# PH_RLABEL -- Read a legal identifier or label. + +int procedure ph_rlabel (keyword, label, max_lenlabel, verify) + +char keyword[ARB] # the identfier or label keyword +char label[ARB] # the output label +int max_lenlabel # maximum length of the label +int verify # verify the expression + +int len_label +pointer sp, newlabel +bool streq(), ph_isident() +int scan(), strlen() + +begin + # Prompt for the label of the specified equation. + call printf ("Enter %s (label, ?=help, <EOF>=quit entry): ") + call pargstr (keyword) + call flush (STDOUT) + + # Read the label value. + if (scan () == EOF) { + call printf ("\n") + return (EOF) + } else + call gargwrd (label, max_lenlabel) + + # Check for errors. + if (streq (label, "?")) { + call pagefile (CFG_TRANSHELP, "") + return (0) + } else if (! ph_isident (label)) { + call printf ("<Error> %s is not a legal label\n") + call pargstr (label) + return (0) + } else { + len_label = strlen (label) + } + + if (verify == NO) + return (len_label) + + # Verify the label. + call smark (sp) + call salloc (newlabel, max_lenlabel, TY_CHAR) + + # Issue the verify prompt. + call printf ("\tVerify (%s) (label, <CR>=ok): ") + call pargstr (label) + call flush (STDOUT) + + # Read the new value. Restore the old values if the input is invalid. + if (scan () == EOF) { + Memc[newlabel] = EOS + call printf ("\n") + call flush (STDOUT) + } else + call gargwrd (Memc[newlabel], max_lenlabel) + + # Check the value. + if (Memc[newlabel] != EOS) { + if (! ph_isident(Memc[newlabel])) + call strcpy (label, Memc[newlabel], max_lenlabel) + } else + call strcpy (label, Memc[newlabel], max_lenlabel) + len_label = strlen (Memc[newlabel]) + + call sfree (sp) + + return (len_label) +end + + +# PH_REXPR -- Read in an expression. The expression can span multiple lines. + +int procedure ph_rexpr (keyword, expr, max_lenexpr, neq, verify) + +char keyword[ARB] # name of the expression +char expr[ARB] # expression +int max_lenexpr # the maximum length of an expression +int neq # the equation number +int verify # verify the expression + +int ip, op, len_expr, sz_expr +pointer sp, newexpr +bool streq() +int strlen(), scan(), gstrcpy() + +begin + # Issue the prompt. + call printf ("Enter %s (equation, equation\=continue, ?=help, ") + call pargstr (keyword) + call printf ("<EOF>=quit entry):\n") + + # Read in the expression. + ip = 1 + repeat { + + # Get a chunk of the equation. + if (scan () == EOF) { + call printf ("\n") + return (EOF) + } else + call gargstr (expr[ip], max_lenexpr) + + # Decode the expresssion. + if (expr[ip] == EOS) { + break + } else if (streq (expr[ip], "?")) { + call pagefile (CFG_TRANSHELP, "") + call printf ( + "Equation %d enter %s (?=help, \=continue, EOF=quit):\n") + call pargi (neq) + call pargstr (keyword) + next + } else { + ip = ip + strlen (expr[ip]) + if (expr[ip-1] == '\\') + ip = ip - 1 + else + break + } + } + + # Return length of expression if verify is off. + len_expr = ip - 1 + if (verify == NO) + return (len_expr) + + # Allocate working space. + call smark (sp) + call salloc (newexpr, max_lenexpr, TY_CHAR) + + # Issue the verify prompt. + call printf ("Verify (equation, <CR>=ok):\n") + call pargstr (keyword) + + # Read the new values. + ip = 1 + op = 1 + while (ip <= len_expr) { + + # Print a chunk of the existing equation. + sz_expr = min (len_expr - ip + 1, CFG_MAXLENLINE - 2) + call printf ("%*.*s\n") + call pargi (-sz_expr) + call pargi (sz_expr) + call pargstr (expr[ip]) + call flush (STDOUT) + + # Get a chunk of the new equation. + if (scan() == EOF) { + Memc[newexpr+op-1] = EOS + call printf ("\n") + call flush (STDOUT) + } else + call gargstr (Memc[newexpr+op-1], CFG_MAXLENLINE) + + if (Memc[newexpr+op-1] == EOS) { + op = op + gstrcpy (expr[ip], Memc[newexpr+op-1], sz_expr) + #} else if (Memc[newexpr+op-1] == '\\') { + #if (scan() == EOF) + #Memc[newexpr+op-1] = EOS + #else + #call gargstr (Memc[newexpr+op-1], CFG_MAXLENLINE) + #op = op + strlen (Memc[newexpr+op-1]) + } else + op = op + strlen (Memc[newexpr+op-1]) + + ip = ip + sz_expr + } + + # Copy the new expression into the output buffer. + if (Memc[newexpr] != EOS) + call strcpy (Memc[newexpr], expr, max_lenexpr) + + call sfree (sp) + + return (op - 1) +end + + +# PH_RLIST -- Get a list of parameter = value strings. + +int procedure ph_rlist (list, op, max_lenlist, keyword, verify) + +char list[ARB] # list of parameter=value strings +int op # pointer into the parameter list +int max_lenlist # maximum length of parameter list +char keyword[ARB] # prompt keyword +int verify # verify the parameter values + +int stat +pointer sp, param, number +int ph_rpar(), gstrcpy() + +begin + # Allocate working space. + call smark (sp) + call salloc (param, SZ_LINE, TY_CHAR) + call salloc (number, SZ_LINE, TY_CHAR) + + # Read the parameter and its associated value. + stat = ph_rpar (CFG_TRANSHELP, keyword, Memc[param], Memc[number], + SZ_LINE, verify) + + # Copy the values into the fitted parameter string. + if (stat >= 2) { + op = op + gstrcpy (Memc[param], list[op], max_lenlist - op + 1) + op = op + gstrcpy (" = ", list[op], max_lenlist - op + 1) + op = op + gstrcpy (Memc[number], list[op], max_lenlist - op + 1) + op = op + gstrcpy (", ", list[op], max_lenlist - op + 1) + } + + call sfree (sp) + + return (stat) +end + + +# PH_RPAR -- Read in a user supplied parameter and value. + +int procedure ph_rpar (helpfile, keyword, param, number, max_lenparam, + verify) + +char helpfile[ARB] # name of the helpfile +char keyword[ARB] # name of the keyword +char param[ARB] # name of the parameter +char number[ARB] # parameter value +int max_lenparam # maximum length of parameter name and value +int verify # verify the values + +int ip, nchars +pointer sp, newparam, newnumber +bool streq(), ph_isident() +int scan(), nscan(), lexnum() + +begin + # Issue the prompt. + call printf ( + "Enter %s (name value, ?=help, <EOF>=quit entry):") + call pargstr (keyword) + call flush (STDOUT) + + # Read the values. + if (scan () == EOF) { + call printf ("\n") + return (EOF) + } else { + call gargwrd (param, max_lenparam) + call gargwrd (number, max_lenparam) + } + + # Check for errors. + ip = 1 + if (streq (param, "?")) { + call pagefile (helpfile, "") + return (0) + } else if (! ph_isident (param)) { + call printf ("<Error> %s is not a legal parameter name\n") + call pargstr (param) + return (0) + } else if (nscan() != 2) { + call printf ("<Error> Cannot decode the parameter value\n") + return (0) + } else if (lexnum (number, ip, nchars) == LEX_NONNUM) { + call printf ( + "<Error> The parameter value %s is not a legal number\n") + call pargstr (number) + return (0) + } else if (verify == NO) { + return (nscan()) + } + + call smark (sp) + call salloc (newparam, max_lenparam, TY_CHAR) + call salloc (newnumber, max_lenparam, TY_CHAR) + + # Issue the verify prompt. + call printf ("\tVerify (%s %s) (name value, <CR>=ok):") + call pargstr (param) + call pargstr (number) + call flush (STDOUT) + + # Read the new values. + ip = 1 + if (scan () == EOF) + Memc[newparam] = EOS + else + call gargstr (Memc[newparam], max_lenparam) + + if (Memc[newparam] != EOS) { + call sscan (Memc[newparam]) + call gargwrd (Memc[newparam], max_lenparam) + call gargwrd (Memc[newnumber], max_lenparam) + if (ph_isident (Memc[newparam])) + call strcpy (Memc[newparam], param, max_lenparam) + if ((nscan() == 2) && (lexnum (Memc[newnumber], ip, nchars) != + LEX_NONNUM)) + call strcpy (number, Memc[newnumber], max_lenparam) + } + + call sfree (sp) + + return (2) +end + + +# PH_WEQUATION -- Format and write a transformation equation to the +# configuration file. + +procedure ph_wequation (fd, label, len_label, expr, len_expr) + +int fd # the output configuration file descriptor +char label[ARB] # the equation label +int len_label # length of the label +char expr[ARB] # the left-hand side or function expression +int len_expr # length of the function expression + +int op +pointer sp, line +errchk ph_write, putline + +begin + # Allocate working space. + call smark (sp) + call salloc (line, CFG_MAXLENLINE + 1, TY_CHAR) + op = 1 + + # Initialize the output buffer and copy the label, the colon + # character label delimiter, te function expression, the equal + # sign and the fit expression to the configurationf file. + + call ph_write (fd, label, len_label, Memc[line], CFG_MAXLENLINE, op) + call ph_write (fd, " : ", 3, Memc[line], CFG_MAXLENLINE, op) + call ph_write (fd, expr, len_expr, Memc[line], CFG_MAXLENLINE, op) + + # Flush the remainder of the output. + if (op > 1) + call putline (fd, Memc[line]) + + call sfree (sp) +end + + +# PH_WDERIV -- Write the derivative expression for the equation to the +# output file. + +procedure ph_wderiv (fd, label, len_label, param, len_param, dexpr, len_dexpr) + +int fd # pointer to the output file descriptor +char label[ARB] # the equation label +int len_label # length of the label +char param[ARB] # the derivative parameter name +int len_param # length of the derivative parameter name +char dexpr[ARB] # the derivative expression +int len_dexpr # length of the derivative expression + +int op +pointer sp, line +errchk ph_write, putline + +begin + call smark (sp) + call salloc (line, CFG_MAXLENLINE + 1, TY_CHAR) + op = 1 + + # Copy the keyword and opening bracket, the equation label, the + # separating comma, the parameter name, the closing bracket and + # equal sign, and the derivative expression to the output file . + + call ph_write (fd, "deriv (", 7, Memc[line], CFG_MAXLENLINE, op) + call ph_write (fd, label, len_label, Memc[line], CFG_MAXLENLINE, op) + call ph_write (fd, ",", 1, Memc[line], CFG_MAXLENLINE, op) + call ph_write (fd, param, len_param, Memc[line], CFG_MAXLENLINE, op) + call ph_write (fd, ") = ", 4, Memc[line], CFG_MAXLENLINE, op) + call ph_write (fd, dexpr, len_dexpr, Memc[line], CFG_MAXLENLINE, op) + + # Flush the remainder of the output. + if (op > 1) + call putline (fd, Memc[line]) + + call sfree (sp) +end + + +# PH_WPARAM -- Write the fitted and constant parameters to the configuration +# file. + +procedure ph_wparam (fd, keyword, len_keyword, paramlist, len_list) + +int fd # output file descriptor +char keyword[ARB] # statement keyword +int len_keyword # length of the keyword +char paramlist[ARB] # fitted parameter list +int len_list # length of fitted parameter list + +int op +pointer sp, line +errchk ph_write, putline + +begin + call smark (sp) + call salloc (line, CFG_MAXLENLINE + 1, TY_CHAR) + + # Write the keyword, two blanks, and the parameter list. + op = 1 + call ph_write (fd, keyword, len_keyword, Memc[line], CFG_MAXLENLINE, op) + call ph_write (fd, " ", 2, Memc[line], CFG_MAXLENLINE, op) + call ph_write (fd, paramlist, len_list, Memc[line], CFG_MAXLENLINE, op) + + # Flush the remainder of the output. + if (op > 1) + call putline (fd, Memc[line]) + + call sfree (sp) +end + + +# PH_WFILE -- Write the stored strings files to the output file. + +procedure ph_wfile (fd, fit, max_lfit, const, max_lconst, trans, max_ltrans) + +int fd # the output file descriptor +char fit[ARB] # the fitted parameter array +int max_lfit # the maximum length of the fit array +char const[ARB] # the constant parameter array +int max_lconst # the maximum length of the constant array +char trans[ARB] # the equation section +int max_ltrans # the maximum length of the equation section + +int tfd, ffd, cfd +pointer sp, line +int stropen(), getline() + +begin + call smark (sp) + call salloc (line, SZ_LINE, TY_CHAR) + + ffd = stropen (fit, max_lfit, READ_ONLY) + cfd = stropen (const, max_lconst, READ_ONLY) + tfd = stropen (trans, max_ltrans, READ_ONLY) + + while (getline (ffd, Memc[line]) != EOF) + call putline (fd, Memc[line]) + call putline (fd, "\n") + while (getline (cfd, Memc[line]) != EOF) + call putline (fd, Memc[line]) + call putline (fd, "\n") + while (getline (tfd, Memc[line]) != EOF) + call putline (fd, Memc[line]) + + call strclose (tfd) + call strclose (ffd) + call strclose (cfd) + + call sfree (sp) +end + + +# PH_WRITE -- Write an output record from the input stream. + +procedure ph_write (fd, input, max_linput, output, max_loutput, op) + +int fd # the output file descriptor +char input[ARB] # the input array +int max_linput # maximum length of the input array +char output[ARB] # the output array +int max_loutput # maximum length of the output array +int op # the output array pointer + +int ip, nchars +errchk putline + +begin + ip = 1 + + repeat { + nchars = min (max_linput - ip + 1, max_loutput - op + 1) + call amovc (input[ip], output[op], nchars) + ip = ip + nchars + op = op + nchars + if (op > max_loutput) { + output[op] = '\n' + output[op+1] = EOS + call putline (fd, output) + op = 1 + } + } until (ip > max_linput) + + output[op] = '\n' + output[op+1] = EOS +end + + +# PH_ISIDENT -- Check to see if a string is a legal identifier. + +bool procedure ph_isident (ident) + +char ident[ARB] # string to be tested + +bool isident +int ip + +begin + if (ident[1] == EOS) + return (false) + if (! IS_ALPHA(ident[1])) + return (false) + + isident = true + for (ip = 2; isident && (ident[ip] != EOS); ip = ip + 1) { + if ((! IS_ALPHA(ident[ip])) && (! IS_DIGIT(ident[ip]))) + isident = false + } + + return (isident) +end |