diff options
Diffstat (limited to 'pkg/utilities/nttools/lib/newcolnam.x')
-rw-r--r-- | pkg/utilities/nttools/lib/newcolnam.x | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/pkg/utilities/nttools/lib/newcolnam.x b/pkg/utilities/nttools/lib/newcolnam.x new file mode 100644 index 00000000..4179383d --- /dev/null +++ b/pkg/utilities/nttools/lib/newcolnam.x @@ -0,0 +1,97 @@ +include <ctype.h> +include <tbset.h> +include "reloperr.h" + +# NEWCOLNAM -- Create a new, unique column name +# +# This procedure receives as input an array of column pointers from two or +# more tables and an index into that array. If the name of the column pointed +# to by that index is unique, it is output as the new name. If it is not +# unique, a suffix of the form "_i" is appended to the name, where i is +# a digit which (hopefully) makes the name unique. +# +# B.Simon 3-Nov-87 first code +# B.Simon 4-Sep-90 Replaced call to strncmp with streq + +procedure newcolnam (numcol, colptr, colidx, newnam, maxch) + +int numcol # i: Number of column pointers +pointer colptr[ARB] # i: Array of column pointers +int colidx # i: Index to column to be renamed +char newnam[ARB] # o: New column name +int maxch # i: Maximum characters in new name +#-- +int olen, nmatch, nbefore, icol +pointer sp, oldnam, colnam, errtxt + +string notuniq "Cannot create a unique column name (%s)" + +bool streq() +int strlen() + +begin + # Allocate dynamic memory for strings + + call smark (sp) + call salloc (oldnam, SZ_COLNAME, TY_CHAR) + call salloc (colnam, SZ_COLNAME, TY_CHAR) + call salloc (errtxt, SZ_LINE, TY_CHAR) + + # Read column name pointed to by index + + call tbcigt (colptr[colidx], TBL_COL_NAME, Memc[oldnam], SZ_COLNAME) + call strupr (Memc[oldnam]) + + # See if the name is unique, and if not, how many columns with + # the same name precede this one + + nmatch = 0 + nbefore = 0 + do icol = 1, numcol { + call tbcigt (colptr[icol], TBL_COL_NAME, Memc[colnam], SZ_COLNAME) + call strupr (Memc[colnam]) + + if (streq (Memc[colnam], Memc[oldnam])) { + nmatch = nmatch + 1 + if (icol <= colidx) + nbefore = nbefore + 1 + } + } + + # If the name is not unique, add a suffix of the form "_i" + + if (nmatch > 1) { + + # Check for ridiculous values of maxch + + olen = min (maxch-2, strlen(Memc[oldnam])) + if (olen < 1) { + call sprintf (Memc[errtxt], SZ_LINE, notuniq) + call pargstr (Memc[oldnam]) + call error (SYNTAX, Memc[errtxt]) + } + + # Add the suffix + + Memc[oldnam+olen] = '_' + Memc[oldnam+olen+1] = TO_DIGIT (nbefore) + Memc[oldnam+olen+2] = EOS + + # Make sure it is unique + + do icol = 1, numcol { + call tbcigt (colptr[icol], TBL_COL_NAME, Memc[colnam], + SZ_COLNAME) + if (streq (Memc[oldnam], Memc[colnam])) { + call sprintf (Memc[errtxt], SZ_LINE, notuniq) + call pargstr (Memc[oldnam]) + call error (SYNTAX, Memc[errtxt]) + } + } + } + + # Copy to the output string + + call strcpy (Memc[oldnam], newnam, maxch) + call sfree (sp) +end |