aboutsummaryrefslogtreecommitdiffhomepage
path: root/libslang/examples/assoc.sl
blob: c4b2b37378fe671d07b53fde071c55803c87424d (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
% This example illustrates the use of associative arrays.  
% The function 'analyse_file' counts the number of occurrences of each word
% in a specified file.  Once the file has been read in, it writes out
% the list of words and number of occurrences to the file counts.log

define analyse_file (file)
{
   variable fp;
   variable line;
   variable i, a, n, word;
   variable keys, values;

   fp = fopen (file, "r");
   if (fp == NULL)
     verror ("Unable to open %s", file);
   
   % Create an Integer_Type assoc array with default value of 0.
   a = Assoc_Type[Integer_Type, 0];
   
   while (-1 != fgets (&line, fp))
     {
	foreach (strtok (strlow(line), "^a-zA-Z\d128-\d255"))
	  {
	     word = ();
	     a[word] = a[word] + 1;    %  default value of 0 assumed!!
	  }
     }
   
   () = fclose (fp);
   keys = assoc_get_keys (a);
   values = assoc_get_values (a);

   i = array_sort (values);
   keys = keys[i];
   values = values[i];

   fp = fopen ("count.log", "w");
   % The default array_sort for Int_Type is an ascending sort.  We want the 
   % opposite.
   for (i = n-1; i >= 0; i--)
     {
	() = fputs (sprintf ("%s:\t%d\n", keys[i], values[i]), fp);
     }
   () = fclose (fp);
}