#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdlib.h>
#include <time.h>
#define RAND() ((unsigned int)((rand() & 0xff) | ((rand() & 0xff) << 8) | ((rand() & 0xff) << 16) | ((rand() & 0xff) << 24)))
#define GIGA (uint64_t)((uint64_t)0x400*(uint64_t)0x400*(uint64_t)0x400)
#define MAX_LENGTH_SECTION 0x1f
#define MAX_LENGTH_TEXT 0x7f
#define MAX_LENGTH_BUF 0xff
#define MAX_UINT32 0xffffffff
static char const* asz_mon[12] = {
"Jan","Feb","Mar","Apr","May","Jun",
"Jul","Aug","Sep","Oct","Nov","Dec"};
static char* gen_string1(char* sz_string, size_t u_length) {
unsigned char* psz_string = (unsigned char*)sz_string;
unsigned char* psz_string_end = (unsigned char*)sz_string + u_length;
for (; psz_string < psz_string_end; ++psz_string) {
*psz_string = 0x21 + (RAND() % 94);
}
*psz_string = '\0';
return sz_string;
}
static char* gen_string2(char* sz_string, size_t u_length) {
unsigned char c;
char* psz_string = sz_string;
char* psz_string_end = sz_string + u_length;
for (; psz_string < psz_string_end; ++psz_string) {
c = RAND() % 52;
if (c < 26) {
*psz_string = 'A' + c;
} else {
*psz_string = 'a' + (c -26);
}
}
*psz_string = '\0';
return sz_string;
}
int gen_data(FILE* fp, size_t u_GiB) {
char sz_buf[MAX_LENGTH_BUF+1];
unsigned int u_string_recs;
unsigned int u_hatena;
unsigned int u_xy_recs;
unsigned int u_num_recs;
char x_or_y;
time_t u_time = time(NULL);
tm* pt_tm = ::localtime(&u_time);
uint64_t u_pos;
::srand((unsigned int)time(NULL));
for (;;) {
// ①セクション名
// ex. SECTION_NAME ①
::fprintf(fp, "%s\x0a", gen_string2(sz_buf, 1 + (RAND() % MAX_LENGTH_SECTION)));
// ②セクション集計値
// ex. 11200 11200 2 Jun 9 23:23:00 2018 ②
// u_xy_recs = RAND() % 0x8000000 + 1;
u_xy_recs = RAND() % 0x8000 + 1;
u_hatena = u_xy_recs;
u_string_recs = RAND() % 0x20 + 1;
::sprintf(sz_buf, "%s %.2d %02d:%02d:%02d %d", asz_mon[pt_tm->tm_mon], pt_tm->tm_mday, pt_tm->tm_hour, pt_tm->tm_min, pt_tm->tm_sec, pt_tm->tm_year+1900);
::fprintf(fp, "%u %u %u %s\x0a", u_xy_recs, u_hatena, u_string_recs, sz_buf);
// ③テキスト
// ex. This is pen. ③
// hello world. ③
for (unsigned int j = 0; j < u_string_recs; ++j) {
::fprintf(fp, "%s\x0a", gen_string1(sz_buf, 1 + (RAND() % MAX_LENGTH_TEXT)));
}
// ④数値
// ex. x 1 2 ④
for (unsigned int j = 0; j < u_xy_recs; ++j) {
x_or_y = (RAND() % 2) ? 'x' : 'y';
// u_num_recs = RAND() % 0x400 + 1;
u_num_recs = RAND() % 0x100 + 1;
::fprintf(fp, "%c %u %u\x0a", x_or_y, j + 1, u_num_recs);
if (RAND() % 2) {
// ⑤QQ 謎の行
// QQ subname -1 0 0 1 -21000000 600000 2
::fprintf(fp, "QQ %s %d %d %d %d %d %d %d\x0a",
gen_string2(sz_buf, 1 + (RAND() % MAX_LENGTH_SECTION)),
(int32_t)RAND(), (int32_t)RAND(), (int32_t)RAND(), (int32_t)RAND(), (int32_t)RAND(), (int32_t)RAND(), (int32_t)RAND());
}
if (x_or_y == 'x') {
for (unsigned int k = 0; k < u_num_recs; ++k) {
// 100 1 -2000 10
::fprintf(fp, "%d %d %d %d\x0a",
(int32_t)RAND(), (int32_t)RAND(), (int32_t)RAND(), (int32_t)RAND());
}
} else {
for (unsigned int k = 0; k < u_num_recs; ++k) {
// -100 10000
::fprintf(fp, "%d %d\x0a",
(int32_t)RAND(), (int32_t)RAND());
}
}
}
u_pos = ftello(fp);
if (u_pos > GIGA * (uint64_t)u_GiB) {
break;
}
}
return 0;
}
int main(int argc, char** argv) {
if (argc != 3) {
::fprintf(stderr, "Usage: %s <filepath> <buffer size>\n", argv[0]);
return 1;
}
char* filename = argv[1];
size_t u_GiB = ::strtoul(argv[2], NULL, 10);;
if (u_GiB == 0) {
::fprintf(stderr, "Usage: %s <filepath> <GiB size>\n", argv[0]);
::fprintf(stderr, "<GiB size> must be greater than zero\n");
return 1;
}
FILE* fp = ::fopen(filename, "w");
if (::gen_data(fp, u_GiB) < 0) {fclose(fp); return -1;}
fclose(fp);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDx0aW1lLmg+CgojZGVmaW5lIFJBTkQoKSAoKHVuc2lnbmVkIGludCkoKHJhbmQoKSAmIDB4ZmYpIHwgKChyYW5kKCkgJiAweGZmKSA8PCA4KSB8ICgocmFuZCgpICYgMHhmZikgPDwgMTYpIHwgKChyYW5kKCkgJiAweGZmKSA8PCAyNCkpKQojZGVmaW5lIEdJR0EgICAgICAgICAgICAgICAodWludDY0X3QpKCh1aW50NjRfdCkweDQwMCoodWludDY0X3QpMHg0MDAqKHVpbnQ2NF90KTB4NDAwKQojZGVmaW5lIE1BWF9MRU5HVEhfU0VDVElPTiAweDFmCiNkZWZpbmUgTUFYX0xFTkdUSF9URVhUICAgIDB4N2YKI2RlZmluZSBNQVhfTEVOR1RIX0JVRiAgICAgMHhmZgojZGVmaW5lIE1BWF9VSU5UMzIgICAgICAgICAweGZmZmZmZmZmCgpzdGF0aWMgY2hhciBjb25zdCogYXN6X21vblsxMl0gPSB7CiJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLAoiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIn07CgpzdGF0aWMgY2hhciogZ2VuX3N0cmluZzEoY2hhciogc3pfc3RyaW5nLCBzaXplX3QgdV9sZW5ndGgpIHsKCQoJdW5zaWduZWQgY2hhciogcHN6X3N0cmluZyA9ICh1bnNpZ25lZCBjaGFyKilzel9zdHJpbmc7Cgl1bnNpZ25lZCBjaGFyKiBwc3pfc3RyaW5nX2VuZCA9ICh1bnNpZ25lZCBjaGFyKilzel9zdHJpbmcgKyB1X2xlbmd0aDsKCglmb3IgKDsgcHN6X3N0cmluZyA8IHBzel9zdHJpbmdfZW5kOyArK3Bzel9zdHJpbmcpIHsKCQkqcHN6X3N0cmluZyA9IDB4MjEgKyAoUkFORCgpICUgOTQpOwoJfQoKCSpwc3pfc3RyaW5nID0gJ1wwJzsKCXJldHVybiBzel9zdHJpbmc7Cn0KCnN0YXRpYyBjaGFyKiBnZW5fc3RyaW5nMihjaGFyKiBzel9zdHJpbmcsIHNpemVfdCB1X2xlbmd0aCkgewoJCgl1bnNpZ25lZCBjaGFyIGM7CgljaGFyKiBwc3pfc3RyaW5nID0gc3pfc3RyaW5nOwoJY2hhciogcHN6X3N0cmluZ19lbmQgPSBzel9zdHJpbmcgKyB1X2xlbmd0aDsKCglmb3IgKDsgcHN6X3N0cmluZyA8IHBzel9zdHJpbmdfZW5kOyArK3Bzel9zdHJpbmcpIHsKCQljID0gUkFORCgpICUgNTI7CgkJaWYgKGMgPCAyNikgewoJCQkqcHN6X3N0cmluZyA9ICdBJyArIGM7CgkJfSBlbHNlIHsKCQkJKnBzel9zdHJpbmcgPSAnYScgKyAoYyAtMjYpOwoJCX0KCX0KCgkqcHN6X3N0cmluZyA9ICdcMCc7CglyZXR1cm4gc3pfc3RyaW5nOwp9CgppbnQgZ2VuX2RhdGEoRklMRSogZnAsIHNpemVfdCB1X0dpQikgewoKCWNoYXIgc3pfYnVmW01BWF9MRU5HVEhfQlVGKzFdOwoKCXVuc2lnbmVkIGludCB1X3N0cmluZ19yZWNzOwoJdW5zaWduZWQgaW50IHVfaGF0ZW5hOwoJdW5zaWduZWQgaW50IHVfeHlfcmVjczsKCXVuc2lnbmVkIGludCB1X251bV9yZWNzOwoJY2hhciB4X29yX3k7Cgl0aW1lX3QgdV90aW1lID0gdGltZShOVUxMKTsKCXRtKiAgICBwdF90bSA9IDo6bG9jYWx0aW1lKCZ1X3RpbWUpOwoJdWludDY0X3QgdV9wb3M7CgoJOjpzcmFuZCgodW5zaWduZWQgaW50KXRpbWUoTlVMTCkpOwoKCWZvciAoOzspIHsKCQkvLyDikaDvvb7vvbjvvbzvva7vvp3lkI0KCQkvLyBleC4gU0VDVElPTl9OQU1F44CA4pGgCgkJOjpmcHJpbnRmKGZwLCAiJXNceDBhIiwgZ2VuX3N0cmluZzIoc3pfYnVmLCAxICsgKFJBTkQoKSAlIE1BWF9MRU5HVEhfU0VDVElPTikpKTsKCgkJLy8g4pGh772+77247728772u776d6ZuG6KiI5YCkCgkJLy8gZXguIDExMjAwIDExMjAwIDIgSnVuICA5IDIzOjIzOjAwIDIwMTjjgIDikaEKLy8JCXVfeHlfcmVjcyA9IFJBTkQoKSAlIDB4ODAwMDAwMCArIDE7CgkJdV94eV9yZWNzID0gUkFORCgpICUgMHg4MDAwICsgMTsKCQl1X2hhdGVuYSAgPSB1X3h5X3JlY3M7CgkJdV9zdHJpbmdfcmVjcyA9IFJBTkQoKSAlIDB4MjAgKyAxOwoJCTo6c3ByaW50Zihzel9idWYsICIlcyAlLjJkICUwMmQ6JTAyZDolMDJkICVkIiwgYXN6X21vbltwdF90bS0+dG1fbW9uXSwgcHRfdG0tPnRtX21kYXksIHB0X3RtLT50bV9ob3VyLCBwdF90bS0+dG1fbWluLCBwdF90bS0+dG1fc2VjLCBwdF90bS0+dG1feWVhcisxOTAwKTsKCQk6OmZwcmludGYoZnAsICIldSAldSAldSAlc1x4MGEiLCB1X3h5X3JlY3MsIHVfaGF0ZW5hLCB1X3N0cmluZ19yZWNzLCBzel9idWYpOwoJCgkJLy8g4pGi776D77237729776ECgkJLy8gZXguIFRoaXMgaXMgcGVuLuOAgOKRogoJCS8vICAgICBoZWxsbyB3b3JsZC7jgIDikaIKCQlmb3IgKHVuc2lnbmVkIGludCBqID0gMDsgaiA8IHVfc3RyaW5nX3JlY3M7ICsraikgewoJCQk6OmZwcmludGYoZnAsICIlc1x4MGEiLCBnZW5fc3RyaW5nMShzel9idWYsIDEgKyAoUkFORCgpICUgTUFYX0xFTkdUSF9URVhUKSkpOwoJCX0KCgkJLy8g4pGj5pWw5YCkCgkJLy8gZXguIHggMSAy44CA4pGjCgkJZm9yICh1bnNpZ25lZCBpbnQgaiA9IDA7IGogPCB1X3h5X3JlY3M7ICsraikgewoJCQl4X29yX3kgPSAoUkFORCgpICUgMikgPyAneCcgOiAneSc7Ci8vCQkJdV9udW1fcmVjcyA9IFJBTkQoKSAlIDB4NDAwICsgMTsKCQkJdV9udW1fcmVjcyA9IFJBTkQoKSAlIDB4MTAwICsgMTsKCQkJOjpmcHJpbnRmKGZwLCAiJWMgJXUgJXVceDBhIiwgeF9vcl95LCBqICsgMSwgdV9udW1fcmVjcyk7CgkJCWlmIChSQU5EKCkgJSAyKSB7CgkJCQkvLyDikaRRUSDorI7jga7ooYwKCQkJCS8vIFFRIHN1Ym5hbWUgLTEgMCAwIDEgLTIxMDAwMDAwIDYwMDAwMCAyCgkJCQk6OmZwcmludGYoZnAsICJRUSAlcyAlZCAlZCAlZCAlZCAlZCAlZCAlZFx4MGEiLAoJCQkJCWdlbl9zdHJpbmcyKHN6X2J1ZiwgMSArIChSQU5EKCkgJSBNQVhfTEVOR1RIX1NFQ1RJT04pKSwKCQkJCQkoaW50MzJfdClSQU5EKCksIChpbnQzMl90KVJBTkQoKSwgKGludDMyX3QpUkFORCgpLCAoaW50MzJfdClSQU5EKCksIChpbnQzMl90KVJBTkQoKSwgKGludDMyX3QpUkFORCgpLCAoaW50MzJfdClSQU5EKCkpOwoJCQl9CgkJCWlmICh4X29yX3kgPT0gJ3gnKSB7CgkJCQlmb3IgKHVuc2lnbmVkIGludCBrID0gMDsgayA8IHVfbnVtX3JlY3M7ICsraykgewoJCQkJCS8vIDEwMCAxIC0yMDAwIDEwCgkJCQkJOjpmcHJpbnRmKGZwLCAiJWQgJWQgJWQgJWRceDBhIiwKCQkJCQkJKGludDMyX3QpUkFORCgpLCAoaW50MzJfdClSQU5EKCksIChpbnQzMl90KVJBTkQoKSwgKGludDMyX3QpUkFORCgpKTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWZvciAodW5zaWduZWQgaW50IGsgPSAwOyBrIDwgdV9udW1fcmVjczsgKytrKSB7CgkJCQkJLy8gLTEwMCAxMDAwMAoJCQkJCTo6ZnByaW50ZihmcCwgIiVkICVkXHgwYSIsCgkJCQkJCShpbnQzMl90KVJBTkQoKSwgKGludDMyX3QpUkFORCgpKTsKCQkJCX0KCQkJfQoJCX0KCgkJdV9wb3MgPSBmdGVsbG8oZnApOwoKCQlpZiAodV9wb3MgPiBHSUdBICogKHVpbnQ2NF90KXVfR2lCKSB7CgkJCWJyZWFrOwoJCX0KCX0KCglyZXR1cm4gMDsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CgoJaWYgKGFyZ2MgIT0gMykgewoJCTo6ZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgPGZpbGVwYXRoPiA8YnVmZmVyIHNpemU+XG4iLCBhcmd2WzBdKTsKCQlyZXR1cm4gMTsKCX0KCgljaGFyKiBmaWxlbmFtZSA9IGFyZ3ZbMV07CglzaXplX3QgdV9HaUIgPSA6OnN0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTApOzsKCglpZiAodV9HaUIgPT0gMCkgewoJCTo6ZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgPGZpbGVwYXRoPiA8R2lCIHNpemU+XG4iLCBhcmd2WzBdKTsKCQk6OmZwcmludGYoc3RkZXJyLCAiPEdpQiBzaXplPiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvXG4iKTsKCQlyZXR1cm4gMTsKCX0KCglGSUxFKiBmcCA9IDo6Zm9wZW4oZmlsZW5hbWUsICJ3Iik7CgoJaWYgKDo6Z2VuX2RhdGEoZnAsIHVfR2lCKSA8IDApIHtmY2xvc2UoZnApOyByZXR1cm4gLTE7fQoJZmNsb3NlKGZwKTsKCXJldHVybiAwOwp9Cg==