# include "dvoshell.h"

int dbCheckStack (dbStack *stack, int Nstack, int table, dbField **inFields, int *inNfields) {

  int i, j, status, NFIELDS, Nfields;
  char *c;
  dbField *fields;

  fields = *inFields;
  Nfields = *inNfields;

  NFIELDS = Nfields + 10;
  REALLOCATE (fields, dbField, NFIELDS);

  for (i = 0; i < Nstack; i++) {
    if (stack[i].type == 'X') {

      /** if this is a number, put it on the list of scalers and move on **/
      stack[i].Float = strtod (stack[i].name, &c);
      if (c == stack[i].name + strlen (stack[i].name)) {
	stack[i].type  = 'S';
	continue;
      } 

      // the value might be a special type of number: RA,DEC in sexigesimal or 
      // time in YYYY/MM/DD, etc
      // status = ohana_str_to_time (stack[i].name, &seconds);
      // keep as time_t
      // status = ohana_dms_to_ddd (&ddd, stack[i].name);
      // keep as either hours (RA) or deg (DEC).

      // strings protected by double quotes should parse to be special types of numbers
      // (photcodes, dates, ra / dec)
      if (stack[i].name[0] == '"') {
	  if (stack[i].name[strlen(stack[i].name) - 1] != '"') {
	      gprint (GP_ERR, "syntax error for field %s\n", stack[i].name);
	      goto failure;
	  }
	  char *tmpstring;
	  tmpstring = strncreate (&stack[i].name[1], strlen(stack[i].name) - 2);

	  // attempt to parse the string as a special word:
	  PhotCode *code;
	  code = GetPhotcodebyName (tmpstring);
	  if (code) {
	      stack[i].Float = code->code;
	      stack[i].type  = 'S';
	      continue;
	  } 

	  // add in tests for sexigesimal, date/time
	  // TimeRefPM = ohana_date_to_sec ("2000/01/01");
	  
	  gprint (GP_ERR, "syntax error for field %s\n", stack[i].name);
	  goto failure;
      }

      // this must be a field : is it already in the list?
      for (j = 0; (j < Nfields) && strcasecmp (stack[i].name, fields[j].name); j++);
      if (j < Nfields) {
	stack[i].field = j;
	stack[i].type  = 'F';
	stack[i].name  = NULL;
	stack[i].Float = 0.0;
	continue;
      }

      // this must be a field : is it a valid name?
      if (table == DVO_TABLE_MEASURE) {
	status = ParseMeasureField (&fields[Nfields], stack[i].name);
      } 
      if (table == DVO_TABLE_AVERAGE) {
	status = ParseAverageField (&fields[Nfields], stack[i].name);
      } 
      if (!status) {
	gprint (GP_ERR, "unknown database field %s\n", stack[i].name);
	goto failure;
      }
      stack[i].field = Nfields;
      stack[i].type  = 'F';
      stack[i].name  = NULL;
      stack[i].Float = 0.0;

      Nfields ++;
      CHECK_REALLOCATE (fields, dbField, NFIELDS, Nfields, 10);
    }
  }

  *inNfields = Nfields;
  *inFields = fields;
  return (TRUE);

failure:
  *inNfields = Nfields;
  *inFields = fields;
  return (FALSE);
}

/* check stack identifies the data elements as plain scalars or table fields
   operators have already been identified.  
   check stack returns the total stack dimensionality (0,1,2)
   on error, check stack returns FALSE
*/
