extern size_t XML1_PackValue(CONVOPT *opt, unsigned char *p, ValueStruct *value) { unsigned char *pp; pp = p; if ((ConvOutput(opt) & XML_OUT_HEADER) != 0) { p += sprintf((char *)p, "<?xml version=\"1.0\""); if (ConvCodeset(opt) != NULL) { p += sprintf((char *)p, " encoding=\"%s\"", ConvCodeset(opt)); } p += sprintf((char *)p, "?>"); p += PutCR(opt, (char *)p); opt->nIndent = 0; } else { opt->nIndent = -1; } if ((ConvOutput(opt) & XML_OUT_HEADER) != 0) { p += sprintf((char *)p, "<lm:block xmlns:lm=\"%s\">", NS_URI); p += PutCR(opt, (char *)p); } if ((ConvOutput(opt) & XML_OUT_BODY) != 0) { p += _XML_PackValue1(opt, p, opt->recname, value); } if ((ConvOutput(opt) & XML_OUT_TAILER) != 0) { p += sprintf((char *)p, "</lm:block>"); } *p = 0; return (p - pp); }
extern size_t XML1_SizeValue(CONVOPT *opt, ValueStruct *value) { char buff[SIZE_BUFF + 1]; size_t size; if ((ConvOutput(opt) & XML_OUT_HEADER) != 0) { size = 19; // <?xml version="1.0" if (ConvCodeset(opt) != NULL) { size += 12 + strlen(ConvCodeset(opt)); // " encoding=\"%s\"",ConvCodeset(opt) } size += 2; // ?> size += PutCR(opt, buff); opt->nIndent = 0; } else if ((ConvOutput(opt) & XML_OUT_TAILER) != 0) { size = 0; opt->nIndent = 0; } else { size = 0; opt->nIndent = -1; } if ((ConvOutput(opt) & XML_OUT_HEADER) != 0) { size += sprintf(buff, "<lm:block xmlns:lm=\"%s\">", NS_URI); size += PutCR(opt, buff); } if ((ConvOutput(opt) & XML_OUT_BODY) != 0) { size += _XML_SizeValue1(opt, opt->recname, value, buff); } if ((ConvOutput(opt) & XML_OUT_TAILER) != 0) { size += 11; // </lm:block> } return (size); }
extern size_t XML_PackValue(CONVOPT *opt, unsigned char *p, ValueStruct *value) { unsigned char *pp; pp = p; if ((ConvOutput(opt) & XML_OUT_HEADER) != 0) { p += sprintf((char *)p, "<?xml version=\"1.0\""); if (ConvCodeset(opt) != NULL) { p += sprintf((char *)p, " encoding=\"%s\"", ConvCodeset(opt)); } p += sprintf((char *)p, "?>"); p += PutCR(opt, (char *)p); opt->nIndent = 0; } else { opt->nIndent = -1; } switch (ConvXmlType(opt)) { case XML_TYPE1: if ((ConvOutput(opt) & XML_OUT_HEADER) != 0) { p += sprintf((char *)p, "<lm:block xmlns:lm=\"%s\">", NS_URI); p += PutCR(opt, (char *)p); } if ((ConvOutput(opt) & XML_OUT_BODY) != 0) { p += _XML_PackValue1(opt, p, opt->recname, value); } if ((ConvOutput(opt) & XML_OUT_TAILER) != 0) { p += sprintf((char *)p, "</lm:block>"); } break; case XML_TYPE2: default: if ((ConvOutput(opt) & XML_OUT_HEADER) != 0) { if (opt->recname != NULL) { p += sprintf((char *)p, "<%s:data xmlns:%s=\"%s/%s.rec\">", opt->recname, opt->recname, NS_URI, opt->recname); } else { p += sprintf((char *)p, "<data>"); } p += PutCR(opt, (char *)p); } if ((ConvOutput(opt) & XML_OUT_BODY) != 0) { if (opt->recname != NULL) { p += _XML_PackValue2(opt, p, opt->recname, value); } else { p += _XML_PackValue2(opt, p, "value", value); } } if ((ConvOutput(opt) & XML_OUT_TAILER) != 0) { if (opt->recname != NULL) { p += sprintf((char *)p, "</%s:data>", opt->recname); } else { p += sprintf((char *)p, "</data>"); } } break; } *p = 0; return (p - pp); }
extern size_t XML_SizeValue(CONVOPT *opt, ValueStruct *value) { char buff[SIZE_BUFF + 1]; size_t size; if ((ConvOutput(opt) & XML_OUT_HEADER) != 0) { size = 19; // <?xml version="1.0" if (ConvCodeset(opt) != NULL) { size += 12 + strlen(ConvCodeset(opt)); // " encoding=\"%s\"",ConvCodeset(opt) } size += 2; // ?> size += PutCR(opt, buff); opt->nIndent = 0; } else if ((ConvOutput(opt) & XML_OUT_TAILER) != 0) { size = 0; opt->nIndent = 0; } else { size = 0; opt->nIndent = -1; } switch (ConvXmlType(opt)) { case XML_TYPE1: if ((ConvOutput(opt) & XML_OUT_HEADER) != 0) { size += sprintf(buff, "<lm:block xmlns:lm=\"%s\">", NS_URI); size += PutCR(opt, buff); } if ((ConvOutput(opt) & XML_OUT_BODY) != 0) { size += _XML_SizeValue1(opt, opt->recname, value, buff); } if ((ConvOutput(opt) & XML_OUT_TAILER) != 0) { size += 11; // </lm:block> } break; case XML_TYPE2: default: if ((ConvOutput(opt) & XML_OUT_HEADER) != 0) { if (opt->recname != NULL) { size += sprintf(buff, "<%s:data xmlns:%s=\"%s/%s.rec\">", opt->recname, opt->recname, NS_URI, opt->recname); } else { size += sprintf(buff, "<data>"); } size += PutCR(opt, buff); } if ((ConvOutput(opt) & XML_OUT_BODY) != 0) { size += _XML_SizeValue2(opt, opt->recname, value, buff); } if ((ConvOutput(opt) & XML_OUT_TAILER) != 0) { if (opt->recname != NULL) { size += sprintf(buff, "</%s:data>", opt->recname); } else { size += sprintf(buff, "</data>"); } } break; } return (size); }
static void _DumpBatchHandler( char *name, BatchBind *bind, void *dummy) { MessageHandler *handler; handler = bind->handler; if ( ( handler->fInit & INIT_LOAD ) == 0 ) { handler->fInit |= INIT_LOAD; printf("\thandler\t\"%s\"\t{\n",handler->name); printf("\t\tmodule \"%s\";\n",(char *)bind->module); printf("\t\tclass \"%s\";\n",(char *)handler->klass); printf("\t\tselialize \"%s\";\n",(char *)handler->serialize); printf("\t\tlocale \"%s\";\n",ConvCodeset(handler->conv)); printf("\t\tstart \"%s\";\n",handler->start); printf("\t\tencoding "); switch (handler->conv->encode) { case STRING_ENCODING_URL: printf("\"URL\";\n"); break; case STRING_ENCODING_BASE64: printf("\"BASE64\";\n"); break; default: printf("\"NULL\";\n"); break; } printf("\t};\n"); } }
static int _StartBatch(MessageHandler *handler, char *name, char *param) { int (*apl)(char *); int rc; ValueStruct *val; char *arg; OpenCOBOL_Conv = NewConvOpt(); ConvSetSize(OpenCOBOL_Conv, ThisBD->textsize, ThisBD->arraysize); ConvSetCodeset(OpenCOBOL_Conv, ConvCodeset(handler->conv)); if (handler->conv != NULL) { OpenCOBOL_Conv->fBigEndian = handler->conv->fBigEndian; } else { Error("handler->conv is NULL"); } InitMONFUNC(OpenCOBOL_Conv, OpenCOBOL_PackValue, OpenCOBOL_UnPackValue, OpenCOBOL_SizeValue); #ifdef DEBUG printf("starting [%s][%s]\n", name, param); #endif if ((apl = cob_resolve(name)) != NULL) { val = NewValue(GL_TYPE_CHAR); SetValueStringWithLength(val, param, ThisBD->textsize, NULL); arg = StrnDup(ValueToString(val, "euc-jisx0213"), ThisBD->textsize); StringC2Cobol(arg, ThisBD->textsize); rc = apl(arg); FreeValueStruct(val); xfree(arg); } else { Warning("%s - %s is not found.", cob_resolve_error(), name); rc = -1; } return (rc); }
static void _ReadyDC( MessageHandler *handler) { ENTER_FUNC; RubyConv = NewConvOpt(); ConvSetSize(RubyConv,ThisLD->textsize,ThisLD->arraysize); ConvSetCodeset(RubyConv,ConvCodeset(handler->conv)); init(handler); LEAVE_FUNC; }
static int _StartBatch( MessageHandler *handler, char *name, char *param) { VALUE app_class; VALUE app; VALUE rc; int state; ENTER_FUNC; #ifdef DEBUG printf("starting [%s][%s]\n",name,param); #endif RubyConv = NewConvOpt(); ConvSetSize(RubyConv,ThisBD->textsize,ThisBD->arraysize); ConvSetCodeset(RubyConv,ConvCodeset(handler->conv)); init(handler); app_class = load_application(handler->loadpath,name); if (NIL_P(app_class)) { Warning("%s in not found.",name); return -1; } app = rb_protect_funcall(app_class,rb_intern("new"),&state,0); if (state && error_handle(state)) { return -1; } rc = rb_protect_funcall(app, rb_intern("start_batch"), &state, 1, rb_str_new2(param)); if (state && error_handle(state)) Warning("eval start_batch failed"); return -1; if (FIXNUM_P(rc)) { return NUM2INT(rc); } else { return -1; } LEAVE_FUNC; return (rc); }
static void _ReadyDC(MessageHandler *handler) { int i; size_t scrsize; OpenCOBOL_Conv = NewConvOpt(); ConvSetSize(OpenCOBOL_Conv, ThisLD->textsize, ThisLD->arraysize); ConvSetCodeset(OpenCOBOL_Conv, ConvCodeset(handler->conv)); if (handler->conv != NULL) { OpenCOBOL_Conv->fBigEndian = handler->conv->fBigEndian; } else { Error("handler->conv is NULL"); } InitMONFUNC(OpenCOBOL_Conv, OpenCOBOL_PackValue, OpenCOBOL_UnPackValue, OpenCOBOL_SizeValue); if (ThisEnv->mcprec != NULL) { McpData = xmalloc(OpenCOBOL_SizeValue(OpenCOBOL_Conv, ThisEnv->mcprec->value)); OpenCOBOL_PackValue(OpenCOBOL_Conv, McpData, ThisEnv->mcprec->value); } else { McpData = NULL; } if (ThisEnv->linkrec != NULL) { LinkData = xmalloc(OpenCOBOL_SizeValue(OpenCOBOL_Conv, ThisEnv->linkrec->value)); } else { LinkData = NULL; } if (ThisLD->sparec != NULL) { SpaData = xmalloc(OpenCOBOL_SizeValue(OpenCOBOL_Conv, ThisLD->sparec->value)); } scrsize = 0; for (i = 0; i < ThisLD->cWindow; i++) { if (ThisLD->windows[i] != NULL) { scrsize += OpenCOBOL_SizeValue(OpenCOBOL_Conv, ThisLD->windows[i]->value); } } ScrData = xmalloc(scrsize); }
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); }
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); }
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); }