//This takes an input file of doubles and makes a sorted output file.

Cd(__DIR__);;

I64 Compare(F64 e1, F64 e2)
{
    return Sign(e1 - e2);
}

U0 F64FileSortTXT(U8 *in_name,U8 *out_name)
{
    CCompCtrl   *cc;
    I64          i, n;
    F64         *a;
    CDoc        *doc;

    //Pass1: Count the number of F64s.
    n = 0;
    cc = CompCtrlNew(MStrPrint("#include \"%s\"", in_name));
    while (Lex(cc))
        if (cc->token == TK_F64)
            n++;
    CompCtrlDel(cc);

    a = MAlloc(n * sizeof(F64));

    //Pass2: Read F64s.
    i = 0;
    cc = CompCtrlNew(MStrPrint("#include \"%s\"", in_name));
    while (Lex(cc))
        if (cc->token == TK_F64)
            a[i++] = cc->cur_f64;
    CompCtrlDel(cc);

    QuickSortI64(a, n, &Compare); //Sort 64-bit sized values

    //Save
    doc = DocNew(out_name);
    DocPrint(doc, "//This is sorted.\n");
    for (i = 0; i < n; i++)
        DocPrint(doc, "%12.6f\n", a[i]);
    DocWrite(doc);
    DocDel(doc);

    Free(a);
}
F64FileSortTXT("~/DemoUnsortedF64.DD", "~/DemoSortedF64.DD");
Type("~/DemoUnsortedF64.DD");
Type("~/DemoSortedF64.DD");

U0 F64FileSortDAT(U8 *in_name, U8 *out_name)
{//File/CFile, ::/Demo/Disk/DataBase.CC
    I64  size;
    F64 *a = FileRead(in_name, &size);

    QuickSortI64(a,size / sizeof(F64), &Compare); //Sort 64-bit sized values
    FileWrite(out_name, a, size);
    Free(a);
}
F64FileSortDAT("~/DemoUnsortedF64.DATA", "~/DemoSortedF64.DATA");

U0 F64FileDumpDAT(U8 *in_name)
{//File/CFile, ::/Demo/Disk/DataBase.CC
    I64  i, n, size;
    F64 *a = FileRead(in_name, &size);

    n = size / sizeof(F64);
    "%s\n", in_name;
    for (i = 0; i < n; i++)
        "%12.6f\n", a[i];
    Free(a);
}
F64FileDumpDAT("~/DemoUnsortedF64.DATA");
F64FileDumpDAT("~/DemoSortedF64.DATA");