summaryrefslogtreecommitdiff
path: root/ghc/utils/hp2ps/TopTwenty.c
blob: bbb6be439023387baea07bf6e5fc128bba26d474 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "Main.h"
#include <stdio.h>
#include <stdlib.h>
#include "Defines.h"
#include "Error.h"
#include "HpFile.h"
#include "Utilities.h"

/* own stuff */
#include "TopTwenty.h"

/*
 *	We only have room in the key for a maximum of 20 identifiers. 
 *	We therefore choose to keep the top 20 bands --- these will 
 *	be the most important ones, since this pass is performed after 
 *	the threshold and standard deviation passes. If there are more 
 *	than 20 bands, the excess are gathered together as an "OTHER" ]
 *	band which appears as band 20.
 */

void
TopTwenty()
{
    intish i;
    intish j;
    intish compact;
    intish bucket;
    floatish value;
    struct entry* en;
    struct chunk* ch;
    floatish *other; 

    i = nidents;
    if (i <= TWENTY) return;	/* nothing to do! */

    other = (floatish*) xmalloc(nsamples * sizeof(floatish));
    /* build a list of samples for "OTHER" */ 

    compact = (i - TWENTY) + 1;

    for (i = 0; i < nsamples; i++) {
        other[ i ] = 0.0;
    }   

    for (i = 0; i < compact && i < nidents; i++) {
        for (ch = identtable[i]->chk; ch; ch = ch->next) {
            for (j = 0; j < ch->nd; j++) {
                bucket = ch->d[j].bucket;
                value  = ch->d[j].value;
		if (bucket >= nsamples)
		    Disaster("bucket out of range");
                other[ bucket ] += value;
            }   
        }    
    }    

    en = MakeEntry("OTHER");
    en->next = 0;

    for (i = 0; i < nsamples; i++) {
    	StoreSample(en, i, other[i]);
    }

    /* slide samples down */
    for (i = compact; i < nidents; i++) {
        identtable[i-compact+1] = identtable[i];
    }

    nidents = TWENTY;
    identtable[0] = en;
    free(other);
}