// Write when the output file is specified void ConsoleWriteOutFile(CONSOLE *c, wchar_t *str, bool add_last_crlf) { LOCAL_CONSOLE_PARAM *p; // Validate arguments if (c == NULL || str == NULL) { return; } p = (LOCAL_CONSOLE_PARAM *)c->Param; if (p != NULL && p->OutFile != NULL) { wchar_t *tmp = UniNormalizeCrlf(str); UINT utf8_size; UCHAR *utf8; utf8_size = CalcUniToUtf8(tmp); utf8 = ZeroMalloc(utf8_size + 1); UniToUtf8(utf8, utf8_size + 1, tmp); FileWrite(p->OutFile, utf8, utf8_size); if (UniEndWith(str, L"\n") == false && add_last_crlf) { char *crlf = "\r\n"; FileWrite(p->OutFile, "\r\n", StrLen(crlf)); } Free(utf8); Free(tmp); } }
// VALUE を書き出す void WriteValue(BUF *b, VALUE *v, UINT type) { UINT len; BYTE *u; UINT u_size; // 引数チェック if (b == NULL || v == NULL) { return; } // データ項目 switch (type) { case VALUE_INT: // 整数 WriteBufInt(b, v->IntValue); break; case VALUE_INT64: // 64 bit 整数 WriteBufInt64(b, v->Int64Value); break; case VALUE_DATA: // データ // サイズ WriteBufInt(b, v->Size); // 本体 WriteBuf(b, v->Data, v->Size); break; case VALUE_STR: // ANSI 文字列 len = StrLen(v->Str); // 長さ WriteBufInt(b, len); // 文字列本体 WriteBuf(b, v->Str, len); break; case VALUE_UNISTR: // Unicode 文字列 // UTF-8 に変換する u_size = CalcUniToUtf8(v->UniStr) + 1; u = ZeroMalloc(u_size); UniToUtf8(u, u_size, v->UniStr); // サイズ WriteBufInt(b, u_size); // UTF-8 文字列本体 WriteBuf(b, u, u_size); Free(u); break; } }
// Output contents of the item void CfgAddItemText(BUF *b, ITEM *t, UINT depth) { char *data; char *sub = NULL; UINT len; UINT size; char *utf8; UINT utf8_size; wchar_t *string; // Validate arguments if (b == NULL || t == NULL) { return; } // Process the data by its type data = NULL; switch (t->Type) { case ITEM_TYPE_INT: data = Malloc(32); ToStr(data, *((UINT *)t->Buf)); break; case ITEM_TYPE_INT64: data = Malloc(64); ToStr64(data, *((UINT64 *)t->Buf)); break; case ITEM_TYPE_BYTE: data = ZeroMalloc(t->size * 4 + 32); len = B64_Encode(data, t->Buf, t->size); data[len] = 0; break; case ITEM_TYPE_STRING: string = t->Buf; utf8_size = CalcUniToUtf8(string); utf8_size++; utf8 = ZeroMalloc(utf8_size); utf8[0] = 0; UniToUtf8(utf8, utf8_size, string); size = utf8_size; data = utf8; break; case ITEM_TYPE_BOOL: size = 32; data = Malloc(size); if (*((bool *)t->Buf) == false) { StrCpy(data, size, TAG_FALSE); } else { StrCpy(data, size, TAG_TRUE); } break; } if (data == NULL) { return; } // Output the data line CfgAddData(b, t->Type, t->Name, data, sub, depth); // Memory release Free(data); if (sub != NULL) { Free(sub); } }
// Output the folder contents (Recursive, binary) void CfgOutputFolderBin(BUF *b, FOLDER *f) { UINT i; // Validate arguments if (b == NULL || f == NULL) { return; } // Folder name WriteBufStr(b, f->Name); // The number of the subfolder WriteBufInt(b, LIST_NUM(f->Folders)); // Subfolder for (i = 0;i < LIST_NUM(f->Folders);i++) { FOLDER *sub = LIST_DATA(f->Folders, i); CfgOutputFolderBin(b, sub); if ((i % 100) == 99) { YieldCpu(); } } // The number of Items WriteBufInt(b, LIST_NUM(f->Items)); // Item for (i = 0;i < LIST_NUM(f->Items);i++) { char *utf8; UINT utf8_size; ITEM *t = LIST_DATA(f->Items, i); // Item Name WriteBufStr(b, t->Name); // Type WriteBufInt(b, t->Type); switch (t->Type) { case ITEM_TYPE_INT: // Integer WriteBufInt(b, *((UINT *)t->Buf)); break; case ITEM_TYPE_INT64: // 64-bit integer WriteBufInt64(b, *((UINT64 *)t->Buf)); break; case ITEM_TYPE_BYTE: // Data size WriteBufInt(b, t->size); // Data WriteBuf(b, t->Buf, t->size); break; case ITEM_TYPE_STRING: // String utf8_size = CalcUniToUtf8((wchar_t *)t->Buf) + 1; utf8 = ZeroMalloc(utf8_size); UniToUtf8(utf8, utf8_size, (wchar_t *)t->Buf); WriteBufInt(b, StrLen(utf8)); WriteBuf(b, utf8, StrLen(utf8)); Free(utf8); break; case ITEM_TYPE_BOOL: // Boolean type if (*((bool *)t->Buf) == false) { WriteBufInt(b, 0); } else { WriteBufInt(b, 1); } break; } } }