repeated.c
author viric@mandarina
Mon, 13 Aug 2007 23:45:46 +0200
changeset 7 c815840c5b65
parent 6 bc41369f4587
permissions -rw-r--r--
Optimizations
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
     1
#include <stdio.h>
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
     2
#include "dictre.h"
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
     3
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
     4
extern struct Def defs[];
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
     5
extern int ndefs;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
     6
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
     7
enum
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
     8
{
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
     9
    MAXLEN = 200
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    10
};
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    11
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    12
struct HashElement
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    13
{
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    14
    struct HashElement *next;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    15
    struct Def *def;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    16
    int index;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    17
};
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    18
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    19
static struct HashElement *dhash[MAXLEN];
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    20
static int ndhash[MAXLEN];
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    21
static struct HashElement *dhash_last[MAXLEN];
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    22
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    23
void init_repeated()
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    24
{
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    25
    int i;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    26
    for(i=0; i<MAXLEN; ++i)
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    27
    {
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    28
        ndhash[i] = 0;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    29
    }
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    30
}
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    31
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    32
void remove_def(int i)
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    33
{
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    34
    ndefs--;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    35
    for(i=i; i<ndefs; ++i)
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    36
        defs[i] = defs[i+1];
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    37
}
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    38
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    39
/*
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    40
static void remove_hashdef(struct Def *ptr, int hash)
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    41
{
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    42
    int i;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    43
    struct HashElement *root = dhash[hash];
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    44
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    45
    for(i=0; i<ndhash[hash]; ++i)
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    46
        if (root[i] == ptr)
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    47
            break;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    48
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    49
    ndhash[hash]--;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    50
    for(; i<ndhash[hash]; ++i)
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    51
        root[i] = root[i+1];
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    52
}
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    53
*/
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    54
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    55
static int calc_hash(struct Def *ptr)
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    56
{
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    57
    int hash;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    58
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    59
    hash = ptr->length % MAXLEN;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    60
    return hash;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    61
}
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    62
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    63
void new_hashdef(struct Def *ptr, int index)
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    64
{
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    65
    int hash;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    66
    struct HashElement *el;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    67
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    68
    hash = calc_hash(ptr);
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    69
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    70
    el = (struct HashElement *) fastmalloc(sizeof(*el));
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    71
    el->def = ptr;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    72
    el->next = 0;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    73
    el->index = index;
6
bc41369f4587 Fixed things in replace.
viric@mandarina
parents: 5
diff changeset
    74
    /*
bc41369f4587 Fixed things in replace.
viric@mandarina
parents: 5
diff changeset
    75
    printf("New index: %i\n", index);
bc41369f4587 Fixed things in replace.
viric@mandarina
parents: 5
diff changeset
    76
    */
5
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    77
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    78
    /* Let the last point to the new element */
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    79
    if (ndhash[hash] != 0)
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    80
    {
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    81
        dhash_last[hash]->next = el;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    82
    } else /* 0 elements in row */
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    83
    {
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    84
        dhash[hash] = el;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    85
    }
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    86
    ndhash[hash] += 1;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    87
    dhash_last[hash] = el;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    88
}
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    89
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    90
int def_repeated(struct Def *ptr)
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    91
{
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    92
    int hash;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    93
    int i;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    94
    struct HashElement *h;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    95
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    96
    hash = calc_hash(ptr);
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    97
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    98
    h = dhash[hash];
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
    99
    for(i=0; i < ndhash[hash]; ++i)
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
   100
    {
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
   101
        struct Def *hdef = h->def;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
   102
        if (hdef->length == ptr->length
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
   103
                && (strncmp(hdef->d, ptr->d, ptr->length) == 0))
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
   104
            /* Repeated found !*/
6
bc41369f4587 Fixed things in replace.
viric@mandarina
parents: 5
diff changeset
   105
        {
bc41369f4587 Fixed things in replace.
viric@mandarina
parents: 5
diff changeset
   106
            /*
bc41369f4587 Fixed things in replace.
viric@mandarina
parents: 5
diff changeset
   107
            printf("Found: l1: %i l2: %i => %i\n", ptr->length, hdef->length,
bc41369f4587 Fixed things in replace.
viric@mandarina
parents: 5
diff changeset
   108
                    h->index);
bc41369f4587 Fixed things in replace.
viric@mandarina
parents: 5
diff changeset
   109
                    */
5
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
   110
            return h->index;
6
bc41369f4587 Fixed things in replace.
viric@mandarina
parents: 5
diff changeset
   111
        }
bc41369f4587 Fixed things in replace.
viric@mandarina
parents: 5
diff changeset
   112
        h = h->next;
5
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
   113
    }
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
   114
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
   115
    /* Not found */
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
   116
    return -1;
c87681fff7d3 Checks for repeated definitions.
viric@mandarina
parents:
diff changeset
   117
}