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); }
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; } }
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); }
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); }
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); }
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); }
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); }
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; }
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; }