Esempio n. 1
0
static	void
_DumpItems(
	ValueStruct	*value)
{
	int		i;

	if		(  value  ==  NULL  )	return;
	switch	(ValueType(value)) {
	  case	GL_TYPE_INT:
		printf("int");
		break;
	  case	GL_TYPE_BOOL:
		printf("bool");
		break;
	  case	GL_TYPE_BYTE:
		printf("byte");
		break;
	  case	GL_TYPE_CHAR:
		printf("char(%d)",(int)ValueStringLength(value));
		break;
	  case	GL_TYPE_VARCHAR:
		printf("varchar(%d)",(int)ValueStringLength(value));
		break;
	  case	GL_TYPE_DBCODE:
		printf("dbcode(%d)",(int)ValueStringLength(value));
		break;
	  case	GL_TYPE_NUMBER:
		if		(  ValueFixedSlen(value)  ==  0  ) {
			printf("number(%d)",(int)ValueFixedLength(value));
		} else {
			printf("number(%d,%d)",
				   (int)ValueFixedLength(value),
				   (int)ValueFixedSlen(value));
		}
		break;
	  case	GL_TYPE_TEXT:
		printf("text");
		break;
	  case	GL_TYPE_ARRAY:
		_DumpItems(ValueArrayItem(value,0));
		printf("[%d]",(int)ValueArraySize(value));
		break;
	  case	GL_TYPE_RECORD:
		printf("{\n");
		nTab ++;
		for	( i = 0 ; i < ValueRecordSize(value) ; i ++ ) {
			PutTab(nTab);
			printf("%s\t",ValueRecordName(value,i));
			_DumpItems(ValueRecordItem(value,i));
			printf(";\n");
		}
		nTab --;
		PutTab(nTab);
		printf("}");
		break;
	  default:
		break;
	}
	fflush(stdout);
}
Esempio n. 2
0
static VALUE
recval_length(VALUE self)
{
    value_struct_data *data;

    Data_Get_Struct(self, value_struct_data, data);
    return INT2NUM(ValueRecordSize(data->value));
}
Esempio n. 3
0
static	void
recval_set_method(VALUE obj, ValueStruct *val)
{
    int i;
    VALUE name;

    for (i = 0; i < ValueRecordSize(val); i++) {
        rb_define_singleton_method(obj, ValueRecordName(val, i),
                                   recval_get_field, 0);
        name = rb_str_new2(ValueRecordName(val, i));
        rb_str_cat2(name, "=");
        rb_define_singleton_method(obj, StringValuePtr(name),
                                   recval_set_field, 1);
    }
}
Esempio n. 4
0
static void SetNil(ValueStruct *val) {
  int i;

  switch (ValueType(val)) {
  case GL_TYPE_ARRAY:
    for (i = 0; i < ValueArraySize(val); i++) {
      SetNil(ValueArrayItem(val, i));
    }
    break;
  case GL_TYPE_ROOT_RECORD:
  case GL_TYPE_RECORD:
    for (i = 0; i < ValueRecordSize(val); i++) {
      SetNil(ValueRecordItem(val, i));
    }
    break;
  default:
    ValueIsNil(val);
    break;
  }
}
Esempio n. 5
0
static size_t _XML_PackValue2(CONVOPT *opt, unsigned char *p, char *name,
                              ValueStruct *value) {
  char num[SIZE_NAME + 1];
  int i;
  unsigned char *pp;

  if (IS_VALUE_NIL(value))
    return (0);
  pp = p;
  if (value != NULL) {
    opt->nIndent++;
    p += IndentLine(opt, p);
    switch (ValueType(value)) {
    case GL_TYPE_ARRAY:
      if (opt->recname != NULL) {
        p += sprintf(p, "<%s:%s type=\"array\"", opt->recname, name);
      } else {
        p += sprintf(p, "<%s type=\"array\"", name);
      }
      p += sprintf(p, " count=\"%d\">", (int)ValueArraySize(value));
      p += PutCR(opt, p);
      for (i = 0; i < ValueArraySize(value); i++) {
        sprintf(num, "%s", name);
        p += _XML_PackValue2(opt, p, num, ValueArrayItem(value, i));
      }
      p += IndentLine(opt, p);
      if (opt->recname != NULL) {
        p += sprintf(p, "</%s:%s>", opt->recname, name);
      } else {
        p += sprintf(p, "</%s>", name);
      }
      break;
    case GL_TYPE_ROOT_RECORD:
    case GL_TYPE_RECORD:
      if (opt->recname != NULL) {
        p += sprintf(p, "<%s:%s type=\"record\"", opt->recname, name);
      } else {
        p += sprintf(p, "<%s type=\"record\"", name);
      }
      p += sprintf(p, " size=\"%d\">", (int)ValueRecordSize(value));
      p += PutCR(opt, p);
      for (i = 0; i < ValueRecordSize(value); i++) {
        p += _XML_PackValue2(opt, p, ValueRecordName(value, i),
                             ValueRecordItem(value, i));
      }
      p += IndentLine(opt, p);
      if (opt->recname != NULL) {
        p += sprintf(p, "</%s:%s>", opt->recname, name);
      } else {
        p += sprintf(p, "</%s>", name);
      }
      break;
    case GL_TYPE_ALIAS:
      if (opt->recname != NULL) {
        p += sprintf(p, "<%s:%s type=\"alias\">", opt->recname, name);
      } else {
        p += sprintf(p, "<%s type=\"alias\">", name);
      }
      p += sprintf(p, "%s", ValueAliasName(value));
      if (opt->recname != NULL) {
        p += sprintf(p, "</%s:%s>", opt->recname, name);
      } else {
        p += sprintf(p, "</%s>", name);
      }
      break;
    default:
      if (opt->recname != NULL) {
        p += sprintf(p, "<%s:%s", opt->recname, name);
      } else {
        p += sprintf(p, "<%s", name);
      }
      p += sprintf(p, " type=");
      switch (ValueType(value)) {
      case GL_TYPE_INT:
        p += sprintf(p, "\"int\"");
        break;
      case GL_TYPE_BOOL:
        p += sprintf(p, "\"bool\"");
        break;
      case GL_TYPE_BYTE:
        p += sprintf(p, "\"byte\" size=\"%d\"", (int)ValueByteLength(value));
        break;
      case GL_TYPE_BINARY:
        p += sprintf(p, "\"binary\" size=\"%d\"", (int)ValueByteLength(value));
        break;
      case GL_TYPE_CHAR:
        p += sprintf(p, "\"char\" size=\"%d\"", (int)ValueStringLength(value));
        break;
      case GL_TYPE_VARCHAR:
        p += sprintf(p, "\"varchar\" size=\"%d\"",
                     (int)ValueStringLength(value));
        break;
      case GL_TYPE_TEXT:
        p += sprintf(p, "\"text\" size=\"%d\"", (int)ValueStringLength(value));
        break;
      case GL_TYPE_SYMBOL:
        p +=
            sprintf(p, "\"symbol\" size=\"%d\"", (int)ValueStringLength(value));
        break;
      case GL_TYPE_DBCODE:
        p +=
            sprintf(p, "\"dbcode\" size=\"%d\"", (int)ValueStringLength(value));
        break;
      case GL_TYPE_NUMBER:
        p += sprintf(p, "\"number\" size=\"%d\" ssize=\"%d\"",
                     (int)ValueFixedLength(value), (int)ValueFixedSlen(value));
        break;
      case GL_TYPE_FLOAT:
        p += sprintf(p, "\"float\"");
        break;
      case GL_TYPE_OBJECT:
        p += sprintf(p, "\"object\"");
        break;
      case GL_TYPE_TIMESTAMP:
        p += sprintf(p, "\"timestamp\"");
        break;
      case GL_TYPE_DATE:
        p += sprintf(p, "\"date\"");
        break;
      case GL_TYPE_TIME:
        p += sprintf(p, "\"time\"");
        break;
      default:
        break;
      }
      p += sprintf(p, ">");
      if (!IS_VALUE_NIL(value)) {
        p += XML_Encode(ValueToString(value, ConvCodeset(opt)), p);
      }
      if (opt->recname != NULL) {
        p += sprintf((char *)p, "</%s:%s>", opt->recname, name);
      } else {
        p += sprintf((char *)p, "</%s>", name);
      }
      break;
    }
    p += PutCR(opt, (char *)p);
    opt->nIndent--;
  }
  return (p - pp);
}
Esempio n. 6
0
static size_t _XML_SizeValue2(CONVOPT *opt, char *name, ValueStruct *value,
                              char *buff) {
  char num[SIZE_NAME + 1];
  int i;
  size_t size;

  size = 0;
  if (value != NULL) {
    if (IS_VALUE_NIL(value))
      return (0);
    opt->nIndent++;
    size += IndentLine(opt, NULL);
    switch (ValueType(value)) {
    case GL_TYPE_ARRAY:
      if (opt->recname != NULL) {
        size += sprintf(buff, "<%s:%s type=\"array\" count=\"%d\">",
                        opt->recname, name, (int)ValueArraySize(value));
      } else {
        size += sprintf(buff, "<%s type=\"array\" count=\"%d\">", name,
                        (int)ValueArraySize(value));
      }
      size += PutCR(opt, buff);
      for (i = 0; i < ValueArraySize(value); i++) {
        sprintf(num, "%s:%d", name, i);
        size += _XML_SizeValue2(opt, num, ValueArrayItem(value, i), buff);
      }
      size += IndentLine(opt, NULL);
      if (opt->recname != NULL) {
        size += sprintf(buff, "</%s:%s>", opt->recname, name);
      } else {
        size += sprintf(buff, "</%s>", name);
      }
      break;
    case GL_TYPE_ROOT_RECORD:
    case GL_TYPE_RECORD:
      if (opt->recname != NULL) {
        size += sprintf(buff, "<%s:%s type=\"record\" size=\"%d\">",
                        opt->recname, name, (int)ValueRecordSize(value));
      } else {
        size += sprintf(buff, "<%s type=\"record\" size=\"%d\">", name,
                        (int)ValueRecordSize(value));
      }
      size += PutCR(opt, buff);
      for (i = 0; i < ValueRecordSize(value); i++) {
        size += _XML_SizeValue2(opt, ValueRecordName(value, i),
                                ValueRecordItem(value, i), buff);
      }
      size += IndentLine(opt, NULL);
      if (opt->recname != NULL) {
        size += sprintf(buff, "</%s:%s>", opt->recname, name);
      } else {
        size += sprintf(buff, "</%s>", name);
      }
      break;
    default:
      if (opt->recname != NULL) {
        size += sprintf(buff, "<%s:%s", opt->recname, name);
      } else {
        size += sprintf(buff, "<%s", name);
      }
      size += 6; //	" type="
      switch (ValueType(value)) {
      case GL_TYPE_INT:
        size += 5; //	"int"
        break;
      case GL_TYPE_BOOL:
        size += 6; //	"bool"
        break;
      case GL_TYPE_BYTE:
        size +=
            sprintf(buff, "\"byte\" size=\"%d\"", (int)ValueByteLength(value));
        break;
      case GL_TYPE_BINARY:
        size += sprintf(buff, "\"binary\" size=\"%d\"",
                        (int)ValueByteLength(value));
        break;
      case GL_TYPE_CHAR:
        size += sprintf(buff, "\"char\" size=\"%d\"",
                        (int)ValueStringLength(value));
        break;
      case GL_TYPE_VARCHAR:
        size += sprintf(buff, "\"varchar\" size=\"%d\"",
                        (int)ValueStringLength(value));
        break;
      case GL_TYPE_TEXT:
        size += sprintf(buff, "\"text\" size=\"%d\"",
                        (int)ValueStringLength(value));
        break;
      case GL_TYPE_SYMBOL:
        size += sprintf(buff, "\"symbol\" size=\"%d\"",
                        (int)ValueStringLength(value));
        break;
      case GL_TYPE_DBCODE:
        size += sprintf(buff, "\"dbcode\" size=\"%d\"",
                        (int)ValueStringLength(value));
        break;
      case GL_TYPE_NUMBER:
        size +=
            sprintf(buff, "\"number\" size=\"%d\" ssize=\"%d\"",
                    (int)ValueFixedLength(value), (int)ValueFixedSlen(value));
        break;
      case GL_TYPE_FLOAT:
        size += 7; //	"float"
        break;
      case GL_TYPE_OBJECT:
        size += 8; //	"object"
        break;
      case GL_TYPE_TIMESTAMP:
        size += 9; //	"timestamp"
        break;
      case GL_TYPE_DATE:
        size += 4; //	"date"
        break;
      case GL_TYPE_TIME:
        size += 8; //	"time"
        break;
      case GL_TYPE_ALIAS:
      default:
        break;
      }
      size += 1; //	">"
      if (!IS_VALUE_NIL(value)) {
        size += XML_EncodeSize(ValueToString(value, ConvCodeset(opt)));
      }
      if (opt->recname != NULL) {
        size += sprintf(buff, "</%s:%s>", opt->recname, name);
      } else {
        size += sprintf(buff, "</%s>", name);
      }
      break;
    }
    size += PutCR(opt, buff);
    opt->nIndent--;
  }
  return (size);
}
Esempio n. 7
0
extern size_t OpenCOBOL_SizeValue(CONVOPT *opt, ValueStruct *value) {
  int i;
  size_t ret;

  if (value == NULL)
    return (0);
  dbgmsg(">OpenCOBOL_SizeValue");
  switch (ValueType(value)) {
  case GL_TYPE_INT:
    ret = sizeof(int);
    break;
  case GL_TYPE_FLOAT:
    ret = sizeof(double);
    break;
  case GL_TYPE_BOOL:
    ret = 1;
    break;
  case GL_TYPE_BINARY:
  case GL_TYPE_TEXT:
  case GL_TYPE_SYMBOL:
    ret = opt->textsize;
    break;
  case GL_TYPE_BYTE:
  case GL_TYPE_CHAR:
  case GL_TYPE_VARCHAR:
  case GL_TYPE_DBCODE:
    ret = ValueStringLength(value);
    break;
  case GL_TYPE_NUMBER:
    ret = ValueFixedLength(value);
    break;
  case GL_TYPE_OBJECT:
    ret = SIZE_UUID;
    break;
  case GL_TYPE_TIMESTAMP:
    ret = 8 + 6;
    break;
  case GL_TYPE_DATE:
    ret = 8;
    break;
  case GL_TYPE_TIME:
    ret = 6;
    break;
  case GL_TYPE_ARRAY:
    ret = 0;
    for (i = 0; i < ValueArraySize(value); i++) {
      ret += OpenCOBOL_SizeValue(opt, ValueArrayItem(value, i));
    }
    break;
  case GL_TYPE_ROOT_RECORD:
  case GL_TYPE_RECORD:
    ret = 0;
    for (i = 0; i < ValueRecordSize(value); i++) {
      ret += OpenCOBOL_SizeValue(opt, ValueRecordItem(value, i));
    }
    break;
  default:
    ret = 0;
    break;
  }
  dbgmsg("<OpenCOBOL_SizeValue");
  return (ret);
}
Esempio n. 8
0
extern size_t OpenCOBOL_PackValue(CONVOPT *opt, unsigned char *p,
                                  ValueStruct *value) {
  int i;
  size_t size;
  unsigned char *pp;

  pp = p;
  if (value != NULL) {
    switch (ValueType(value)) {
    case GL_TYPE_INT:
      *(int32_t *)p = (int32_t)ValueInteger(value);
      IntegerC2Cobol(opt, (int32_t *)p);
      p += sizeof(int32_t);
      break;
    case GL_TYPE_FLOAT:
      *(double *)p = ValueFloat(value);
      p += sizeof(double);
      break;
    case GL_TYPE_BOOL:
      *(char *)p = ValueBool(value) ? 'T' : 'F';
      p++;
      break;
    case GL_TYPE_BYTE:
      memcpy(p, ValueByte(value), ValueByteLength(value));
      p += ValueByteLength(value);
      break;
    case GL_TYPE_BINARY:
      memclear(p, opt->textsize);
      size = (opt->textsize < ValueByteLength(value)) ? opt->textsize
                                                      : ValueByteLength(value);
      memcpy(p, ValueToBinary(value), size);
      p += opt->textsize;
      break;
    case GL_TYPE_TEXT:
    case GL_TYPE_SYMBOL:
      size = (opt->textsize < ValueStringLength(value))
                 ? opt->textsize
                 : ValueStringLength(value);
      memcpy(p, ValueToString(value, ConvCodeset(opt)), size);
      StringC2Cobol(p, opt->textsize);
      p += opt->textsize;
      break;
    case GL_TYPE_CHAR:
    case GL_TYPE_VARCHAR:
    case GL_TYPE_DBCODE:
      if (IS_VALUE_NIL(value)) {
        memclear(p, ValueStringLength(value)); /*	LOW-VALUE	*/
      } else {
        strncpy(p, ValueToString(value, ConvCodeset(opt)),
                ValueStringLength(value));
        StringC2Cobol(p, ValueStringLength(value));
      }
      p += ValueStringLength(value);
      break;
    case GL_TYPE_NUMBER:
      memcpy(p, ValueFixedBody(value), ValueFixedLength(value));
      FixedC2Cobol(p, ValueFixedLength(value));
      p += ValueFixedLength(value);
      break;
    case GL_TYPE_OBJECT:
      memcpy(p, ValueBody(value), SIZE_UUID);
      StringC2Cobol(p, SIZE_UUID);
      p += SIZE_UUID;
      break;
    case GL_TYPE_TIMESTAMP:
      p += sprintf(p, "%04d%02d%02d%02d%02d%02d", ValueDateTimeYear(value),
                   ValueDateTimeMon(value) + 1, ValueDateTimeMDay(value),
                   ValueDateTimeHour(value), ValueDateTimeMin(value),
                   ValueDateTimeSec(value));
      break;
    case GL_TYPE_DATE:
      p += sprintf(p, "%04d%02d%02d", ValueDateTimeYear(value),
                   ValueDateTimeMon(value) + 1, ValueDateTimeMDay(value));
      break;
    case GL_TYPE_TIME:
      p += sprintf(p, "%02d%02d%02d", ValueDateTimeHour(value),
                   ValueDateTimeMin(value), ValueDateTimeSec(value));
      break;
    case GL_TYPE_ARRAY:
      for (i = 0; i < ValueArraySize(value); i++) {
        p += OpenCOBOL_PackValue(opt, p, ValueArrayItem(value, i));
      }
      break;
    case GL_TYPE_ROOT_RECORD:
    case GL_TYPE_RECORD:
      for (i = 0; i < ValueRecordSize(value); i++) {
        p += OpenCOBOL_PackValue(opt, p, ValueRecordItem(value, i));
      }
      break;
    default:
      break;
    }
  }
  return (p - pp);
}
Esempio n. 9
0
extern size_t OpenCOBOL_UnPackValue(CONVOPT *opt, unsigned char *p,
                                    ValueStruct *value) {
  int32_t i;
  char buff[SIZE_NUMBUF + 1];
  unsigned char *q;
  ValueStruct *child;

  q = p;
  if (value != NULL) {
    ValueIsNonNil(value);
    switch (ValueType(value)) {
    case GL_TYPE_INT:
      i = *(int32_t*)p;
      IntegerCobol2C(opt, &i);
      SetValueInteger(value, (int64_t)i);
      p += sizeof(int32_t);
      break;
    case GL_TYPE_FLOAT:
      ValueFloat(value) = *(double *)p;
      p += sizeof(double);
      break;
    case GL_TYPE_BOOL:
      SetValueBool(value,(*(char *)p == 'T') ? TRUE : FALSE);
      p++;
      break;
    case GL_TYPE_OBJECT:
      StringCobol2C(p, SIZE_UUID);
      memcpy(ValueBody(value), p, SIZE_UUID);
      p += SIZE_UUID;
      break;
    case GL_TYPE_BYTE:
      memcpy(ValueByte(value), p, ValueByteLength(value));
      p += ValueByteLength(value);
      break;
    case GL_TYPE_BINARY:
      SetValueBinary(value, p, opt->textsize);
      p += opt->textsize;
      break;
    case GL_TYPE_TEXT:
    case GL_TYPE_SYMBOL:
      StringCobol2C(p, opt->textsize);
      SetValueStringWithLength(value, p, opt->textsize, ConvCodeset(opt));
      p += opt->textsize;
      break;
    case GL_TYPE_CHAR:
    case GL_TYPE_VARCHAR:
    case GL_TYPE_DBCODE:
      StringCobol2C(p, ValueStringLength(value));
      SetValueStringWithLength(value, p, ValueStringLength(value),
                               ConvCodeset(opt));
      p += ValueStringLength(value);
      break;
    case GL_TYPE_NUMBER:
      memcpy(buff, p, ValueFixedLength(value));
      FixedCobol2C(buff, ValueFixedLength(value));
      strcpy(ValueFixedBody(value), buff);
      p += ValueFixedLength(value);
      break;
    case GL_TYPE_TIMESTAMP:
      ValueDateTimeYear(value) = StrToInt(p, 4);
      p += 4;
      ValueDateTimeMon(value) = StrToInt(p, 2) - 1;
      p += 2;
      ValueDateTimeMDay(value) = StrToInt(p, 2);
      p += 2;
      ValueDateTimeHour(value) = StrToInt(p, 2);
      p += 2;
      ValueDateTimeMin(value) = StrToInt(p, 2);
      p += 2;
      ValueDateTimeSec(value) = StrToInt(p, 2);
      p += 2;
      mktime(ValueDateTime(value));
      break;
    case GL_TYPE_TIME:
      ValueDateTimeYear(value) = 0;
      ValueDateTimeMon(value) = 0;
      ValueDateTimeMDay(value) = 0;
      ValueDateTimeHour(value) = StrToInt(p, 2);
      p += 2;
      ValueDateTimeMin(value) = StrToInt(p, 2);
      p += 2;
      ValueDateTimeSec(value) = StrToInt(p, 2);
      p += 2;
      break;
    case GL_TYPE_DATE:
      ValueDateTimeYear(value) = StrToInt(p, 4);
      p += 4;
      ValueDateTimeMon(value) = StrToInt(p, 2) - 1;
      p += 2;
      ValueDateTimeMDay(value) = StrToInt(p, 2);
      p += 2;
      ValueDateTimeHour(value) = 0;
      ValueDateTimeMin(value) = 0;
      ValueDateTimeSec(value) = 0;
      mktime(ValueDateTime(value));
      break;
    case GL_TYPE_ARRAY:
      for (i = 0; i < ValueArraySize(value); i++) {
        child = ValueArrayItem(value, i);
        if (child != NULL) {
          p += OpenCOBOL_UnPackValue(opt, p, child);
          ValueParent(child) = value;
        }
      }
      break;
    case GL_TYPE_ROOT_RECORD:
    case GL_TYPE_RECORD:
      for (i = 0; i < ValueRecordSize(value); i++) {
        child = ValueRecordItem(value, i);
        if (child != NULL) {
          p += OpenCOBOL_UnPackValue(opt, p, child);
          ValueParent(child) = value;
        }
      }
      break;
    default:
      ValueIsNil(value);
      break;
    }
  }
  return (p - q);
}
Esempio n. 10
0
static xmlNodePtr Value2XMLNode(char *name, ValueStruct *val) {
  xmlNodePtr node;
  xmlNodePtr child;
  int i;

  if (val == NULL) {
    return NULL;
  }
  node = NULL;
  switch (ValueType(val)) {
  case GL_TYPE_INT:
    node = xmlNewNode(NULL, "int");
    xmlNodeAddContent(node, ValueToString(val, NULL));
    break;
  case GL_TYPE_FLOAT:
    node = xmlNewNode(NULL, "float");
    xmlNodeAddContent(node, ValueToString(val, NULL));
    break;
  case GL_TYPE_NUMBER:
    node = xmlNewNode(NULL, "number");
    xmlNodeAddContent(node, ValueToString(val, NULL));
    break;
  case GL_TYPE_BOOL:
    node = xmlNewNode(NULL, "bool");
    xmlNodeAddContent(node, ValueToString(val, NULL));
    break;
  case GL_TYPE_CHAR:
  case GL_TYPE_VARCHAR:
  case GL_TYPE_SYMBOL:
  case GL_TYPE_DBCODE:
  case GL_TYPE_TEXT:
    node = xmlNewNode(NULL, "string");
    xmlNodeAddContent(node, ValueToString(val, NULL));
    break;
  case GL_TYPE_ARRAY:
    node = xmlNewNode(NULL, "array");
    for (i = 0; i < ValueArraySize(val); i++) {
      child = Value2XMLNode(NULL, ValueArrayItem(val, i));
      if (child != NULL) {
        xmlAddChildList(node, child);
      }
    }
    break;
  case GL_TYPE_RECORD:
    node = xmlNewNode(NULL, "record");
    for (i = 0; i < ValueRecordSize(val); i++) {
      if (!strcmp(ValueRecordName(val, i), "mode")) {
        continue;
      }
      child = Value2XMLNode(ValueRecordName(val, i), ValueRecordItem(val, i));
      if (child != NULL) {
        xmlAddChildList(node, child);
      }
    }
    break;
  }
  if (node != NULL && name != NULL && strlen(name) > 0) {
    xmlNewProp(node, "name", name);
  }
  return node;
}
Esempio n. 11
0
static int XMLNode2Value(ValueStruct *val, xmlNodePtr root) {
  int i;
  char *buff1;
  xmlNodePtr node;

  if (val == NULL || root == NULL) {
    return MCP_BAD_OTHER;
  }
  switch (ValueType(val)) {
  case GL_TYPE_INT:
    if (xmlStrcmp(root->name, "int") != 0) {
      break;
    }
    buff1 = XMLGetString(root, "0");
    SetValueStringWithLength(val, buff1, strlen(buff1), NULL);
    free(buff1);
    break;
  case GL_TYPE_FLOAT:
    if (xmlStrcmp(root->name, "float") != 0) {
      break;
    }
    buff1 = XMLGetString(root, "0");
    SetValueStringWithLength(val, buff1, strlen(buff1), NULL);
    free(buff1);
    break;
  case GL_TYPE_NUMBER:
    if (xmlStrcmp(root->name, "number") != 0) {
      break;
    }
    buff1 = XMLGetString(root, "0.0");
    SetValueStringWithLength(val, buff1, strlen(buff1), NULL);
    free(buff1);
    break;
  case GL_TYPE_BOOL:
    if (xmlStrcmp(root->name, "bool") != 0) {
      break;
    }
    buff1 = XMLGetString(root, "FALSE");
    SetValueStringWithLength(val, buff1, strlen(buff1), NULL);
    free(buff1);
    break;
  case GL_TYPE_CHAR:
  case GL_TYPE_VARCHAR:
  case GL_TYPE_SYMBOL:
  case GL_TYPE_DBCODE:
  case GL_TYPE_TEXT:
    if (xmlStrcmp(root->name, "string") != 0) {
      break;
    }
    buff1 = XMLGetString(root, "");
    SetValueStringWithLength(val, buff1, strlen(buff1), NULL);
    free(buff1);
    break;
  case GL_TYPE_ARRAY:
    if (xmlStrcmp(root->name, "array") != 0) {
      break;
    }
    node = root->children;
    for (i = 0; i < ValueArraySize(val); i++) {
      if (node == NULL) {
        break;
      }
      XMLNode2Value(ValueArrayItem(val, i), node);
      node = node->next;
    }
    break;
  case GL_TYPE_RECORD:
    if (xmlStrcmp(root->name, "record") != 0) {
      break;
    }
    for (i = 0; i < ValueRecordSize(val); i++) {
      for (node = root->children; node != NULL; node = node->next) {
        if ((buff1 = xmlGetProp(node, "name")) == NULL) {
          continue;
        }
        if (!xmlStrcmp(buff1, ValueRecordName(val, i))) {
          XMLNode2Value(ValueRecordItem(val, i), node);
          free(buff1);
          break;
        }
        free(buff1);
      }
    }
    break;
  case GL_TYPE_OBJECT:
    break;
  default:
    return MCP_BAD_ARG;
    break;
  }
  return MCP_OK;
}