write.c
author viric@mandarina
Mon, 13 Aug 2007 23:45:46 +0200
changeset 7 c815840c5b65
parent 0 7f37716d4f1e
child 8 09ec33061ff3
permissions -rw-r--r--
Optimizations
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
     1
#include <stdio.h>
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
     2
#include "dictre.h"
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
     3
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
     4
extern struct Word words[];
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
     5
extern int nwords;
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
     6
extern struct Def defs[];
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
     7
extern int ndefs;
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
     8
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
     9
static char num_to_ia5char(int n)
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    10
{
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    11
    /* From RFC 1421 */
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    12
    if (n >= 0 && n <= 25)
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    13
        return 'A' + n;
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    14
    else if (n >= 26 && n <= 51)
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    15
        return 'a' + (n - 26);
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    16
    else if (n >= 52 && n <= 61)
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    17
        return '0' + (n - 52);
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    18
    else if (n == 62)
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    19
        return '+';
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    20
    else if (n == 63)
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    21
        return '-';
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    22
    else
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    23
        return '!'; /* Error */
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    24
}
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    25
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    26
static int num_to_ia5(char *dest, int n)
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    27
{
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    28
    char tmp[20];
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    29
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    30
    int i, max;
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    31
   
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    32
    for(i =0; i <= 10; ++i)
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    33
    {
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    34
        tmp[i] = num_to_ia5char(n % 64);
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    35
        if (n < 64)
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    36
            break;
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    37
        n /= 64;
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    38
    }
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    39
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    40
    max = i;
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    41
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    42
    /* reverse the number */
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    43
    for (i=0; i<=max; ++i)
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    44
        dest[i] = tmp[max-i];
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    45
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    46
    /* Ending '\0' */
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    47
    dest[max+1] = '\0';
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    48
    return max;
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    49
}
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    50
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    51
static int write_dictionary_data(FILE *fdefs)
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    52
{
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    53
    int i;
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    54
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    55
    int offset = 0;
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    56
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    57
    for (i=0; i < ndefs; ++i)
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    58
    {
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    59
        fwrite(defs[i].d, defs[i].length, 1, fdefs);
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    60
        defs[i].offset = offset;
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    61
        offset += defs[i].length;
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    62
    }
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    63
}
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    64
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    65
static void write_dictionary_index(FILE *index)
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    66
{
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    67
    int i;
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    68
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    69
    for (i=0; i < nwords; ++i)
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    70
    {
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    71
        char offset_str[50];
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    72
        char length_str[50];
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    73
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    74
        num_to_ia5(offset_str, defs[words[i].def].offset);
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    75
        num_to_ia5(length_str, defs[words[i].def].length);
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    76
        fprintf(index, "%s\t%s\t%s\n",
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    77
                words[i].w, offset_str, length_str);
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    78
    }
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    79
}
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    80
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    81
void write_dictionary(const char *name)
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    82
{
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    83
    FILE *i, *d;
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    84
    char tmpname[500];
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    85
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    86
    strcpy(tmpname, name);
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    87
    strcat(tmpname, ".dict");
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    88
    d = fopen(tmpname, "wb");
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    89
    write_dictionary_data(d);
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    90
    fclose(d);
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    91
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    92
    strcpy(tmpname, name);
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    93
    strcat(tmpname, ".index");
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    94
    i = fopen(tmpname, "wb");
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    95
    write_dictionary_index(i);
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    96
    fclose(i);
7f37716d4f1e Initial. Awful makefile.
viric@llimona
parents:
diff changeset
    97
}