# Routines for element list parsing - to be included in GAWK programs
# Last edited on 2000-10-24 14:37:16 by stolfi

function parse_explicit_elems(elemList,elem,eindex,eclass,   e,i,nels)
{
  # Parses a comma-separated list of elements 
  # Defines the global variables 
  # Defines the global variables 
  #   "elem[1..nels]" (list of elements),
  #   "eclass[1..nels]" (corrsponding classes, always ""),
  #   "eindex[e]" (element index, "1..nels") and 
  # the last two being indexed by the element "e".
  # Returns the number "nels" of elements in the list.
  # Also sets the global "hasclass" to 0.
  # 
  split("", eindex);
  split("", eclass);
  hasclass = 0;
  nels = split(elemList, elem, ",");
  for (i = 1; i <= nels; i++) 
    { e = elem[i];
      if (e !~ /^[-~\/]$/)
        { if (e in eindex) arg_error(("repeated elem = \"" e "\""));
          eindex[e] = i; eclass[e] = "";
        }
    }
  return nels;
}

function load_elems_from_file(file,elem,eindex,eclass,   e,i,lin,fld,nfld,cl,nels)
{
  # Reads a table mapping elements to classes 
  # Defines the global variables 
  #   "elem[1..nels]" (list of elements),
  #   "eclass[1..nels]" (corresponding classes),
  #   "eindex[e]" (element index, "1..nels") and 
  # the last two being indexed by the element "e".
  # Returns the number "nels" of elements in the table.
  # Also sets "hasclass" to 1.
  # 
  nels=0;
  split("", eindex);
  split("", eclass);
  hasclass = 0;
  while((getline lin < file) > 0) { 
    if (! match(lin, /^[#]/))
      { nfld = split(lin, fld, " ");
        if (nfld < 1) table_error(("bad table entry = \"" lin "\""));
        e = fld[1];
        nels++; i = nels; 
        elem[i] = e; eclass[i] = "";
        if ((e != "/") && (e != "-") && (e != "~"))
          { if (e in eindex) table_error(("repeated elem = \"" e "\""));
            if (nfld >= 2) 
              { cl = fld[2]; eclass[i] = cl; hasclass = 1; }
            eindex[e] = i;
          }
      }
  }
  if (ERRNO != "0") { table_error((file ": " ERRNO)); }
  close (file);
  if (nels == 0) { arg_error(("file \"" file "\" empty or missing")); }
  printf "loaded %6d elements\n", nels > "/dev/stderr";
  return nels;
}