#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int count;
int reserved;
double *tab;
} FloatVector;
FloatVector *FloatVectorCreate(int reserve)
{
FloatVector
*result
= (FloatVector
*)malloc(sizeof(FloatVector
)); if (result)
{
result
->tab
= (double *)malloc(sizeof(*result
->tab
) * reserve
); result->count = 0;
result->reserved = reserve;
}
return result;
}
void FloatVectorFree(FloatVector *vec)
{
if (vec)
{
}
}
void FloatVectorAppend(FloatVector *vec, double x)
{
if (vec->count >= vec->reserved)
{
vec->reserved += 0x10;
vec
->tab
= realloc(vec
->tab
, sizeof(*vec
->tab
) * vec
->reserved
); }
vec->tab[vec->count++] = x;
}
FloatVector *FloatVectorCreateFormString(const char *line)
{
FloatVector *vec = FloatVectorCreate(0x10);
char *p = (char *)line;
while (1)
{
char *q = p;
if (p == q)
break;
FloatVectorAppend(vec, x);
}
return vec;
}
int ReadCSV(FILE* f, FloatVector ***data)
{
char buffer[0x800];
int reservedDataSize = 0x10;
int dataSize = 0;
*data
= calloc(reservedDataSize
, sizeof(FloatVector
*));
while (fgets(buffer
, sizeof(buffer
), f
)) {
if (dataSize >= reservedDataSize)
{
reservedDataSize += 0x10;
*data
= (FloatVector
**)realloc(*data
, reservedDataSize
* sizeof(FloatVector
*)); }
(*data)[dataSize++] = FloatVectorCreateFormString(buffer);
}
return dataSize;
}
int main(void) {
FloatVector **data;
int size = ReadCSV(stdin, &data);
for (int i=0; i<size; ++i)
{
printf("%d\n", data
[i
]->count
); for (int j=0; j<data[i]->count; ++j)
printf(" %4lg", data
[i
]->tab
[j
]); }
for (int i=0; i<size; ++i)
{
FloatVectorFree(data[i]);
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnR5cGVkZWYgc3RydWN0IAp7CiAgICBpbnQgY291bnQ7CglpbnQgcmVzZXJ2ZWQ7CiAgICBkb3VibGUgKnRhYjsKfSBGbG9hdFZlY3RvcjsKCkZsb2F0VmVjdG9yICpGbG9hdFZlY3RvckNyZWF0ZShpbnQgcmVzZXJ2ZSkKewoJRmxvYXRWZWN0b3IgKnJlc3VsdCA9IChGbG9hdFZlY3RvciAqKW1hbGxvYyhzaXplb2YoRmxvYXRWZWN0b3IpKTsKCWlmIChyZXN1bHQpCgl7CgkJcmVzdWx0LT50YWIgPSAoZG91YmxlICopbWFsbG9jKHNpemVvZigqcmVzdWx0LT50YWIpICogcmVzZXJ2ZSk7CgkJcmVzdWx0LT5jb3VudCA9IDA7CgkJcmVzdWx0LT5yZXNlcnZlZCA9IHJlc2VydmU7Cgl9CglyZXR1cm4gcmVzdWx0Owp9Cgp2b2lkIEZsb2F0VmVjdG9yRnJlZShGbG9hdFZlY3RvciAqdmVjKQp7CglpZiAodmVjKQoJewoJCWZyZWUodmVjLT50YWIpOwoJCWZyZWUodmVjKTsKCX0KfQoKdm9pZCBGbG9hdFZlY3RvckFwcGVuZChGbG9hdFZlY3RvciAqdmVjLCBkb3VibGUgeCkKewoJaWYgKHZlYy0+Y291bnQgPj0gdmVjLT5yZXNlcnZlZCkKCXsKCQl2ZWMtPnJlc2VydmVkICs9IDB4MTA7CgkJdmVjLT50YWIgPSByZWFsbG9jKHZlYy0+dGFiLCBzaXplb2YoKnZlYy0+dGFiKSAqIHZlYy0+cmVzZXJ2ZWQpOwoJfQoJdmVjLT50YWJbdmVjLT5jb3VudCsrXSA9IHg7Cn0KCkZsb2F0VmVjdG9yICpGbG9hdFZlY3RvckNyZWF0ZUZvcm1TdHJpbmcoY29uc3QgY2hhciAqbGluZSkKewoJRmxvYXRWZWN0b3IgKnZlYyA9IEZsb2F0VmVjdG9yQ3JlYXRlKDB4MTApOwoJY2hhciAqcCA9IChjaGFyICopbGluZTsKCXdoaWxlICgxKQoJewoJCWNoYXIgKnEgPSBwOwoJCWRvdWJsZSB4ID0gc3RydG9kKHEsICZwKTsKCQlpZiAocCA9PSBxKQoJCQlicmVhazsKCQlGbG9hdFZlY3RvckFwcGVuZCh2ZWMsIHgpOwoJfQoJcmV0dXJuIHZlYzsKfQoKaW50IFJlYWRDU1YoRklMRSogZiwgRmxvYXRWZWN0b3IgKioqZGF0YSkKewoJY2hhciBidWZmZXJbMHg4MDBdOwoJaW50IHJlc2VydmVkRGF0YVNpemUgPSAweDEwOwoJaW50IGRhdGFTaXplID0gMDsKCgkqZGF0YSA9IGNhbGxvYyhyZXNlcnZlZERhdGFTaXplLCBzaXplb2YoRmxvYXRWZWN0b3IgKikpOwoKCXdoaWxlIChmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBmKSkKCXsKCQlpZiAoZGF0YVNpemUgPj0gcmVzZXJ2ZWREYXRhU2l6ZSkKCQl7CgkJCXJlc2VydmVkRGF0YVNpemUgKz0gMHgxMDsKCQkJKmRhdGEgPSAoRmxvYXRWZWN0b3IgKiopcmVhbGxvYygqZGF0YSwgcmVzZXJ2ZWREYXRhU2l6ZSAqIHNpemVvZihGbG9hdFZlY3RvciAqKSk7CgkJfQoJCSgqZGF0YSlbZGF0YVNpemUrK10gPSBGbG9hdFZlY3RvckNyZWF0ZUZvcm1TdHJpbmcoYnVmZmVyKTsKCX0KCXJldHVybiBkYXRhU2l6ZTsKfQoKaW50IG1haW4odm9pZCkgewoJRmxvYXRWZWN0b3IgKipkYXRhOwoKCWludCBzaXplID0gUmVhZENTVihzdGRpbiwgJmRhdGEpOwoKCWZvciAoaW50IGk9MDsgaTxzaXplOyArK2kpCgl7CgkJcHJpbnRmKCIlZFxuIiwgZGF0YVtpXS0+Y291bnQpOwoJCWZvciAoaW50IGo9MDsgajxkYXRhW2ldLT5jb3VudDsgKytqKQoJCQlwcmludGYoIiAlNGxnIiwgZGF0YVtpXS0+dGFiW2pdKTsKCQlwcmludGYoIlxuIik7Cgl9CgoJZm9yIChpbnQgaT0wOyBpPHNpemU7ICsraSkKCXsKCQlGbG9hdFZlY3RvckZyZWUoZGF0YVtpXSk7Cgl9CglmcmVlKGRhdGEpOwoJcmV0dXJuIDA7Cn0K