1#! /usr/bin/env slsh
2% This demo counts the number of primes between 2 and some integer
3
4private define usage ()
5{
6   () = fprintf (stderr, "Usage: %S <integer greater than 2>\n", __argv[0]);
7   exit (1);
8}
9
10define count_primes (num)
11{
12   variable size = (num - 1)/2;
13   variable nonprimes = Char_Type[size + 1];   %  last one is sentinel
14   variable count = 1;
15   variable prime = 3;
16   variable i = 0;
17
18   do
19     {
20        count++;
21	%()=printf ("%S\n", prime);
22
23	nonprimes [[i:size-1:prime]] = 1;
24	variable i_save = i;
25	while (i++, nonprimes[i])
26	  ;
27	prime += 2 * (i - i_save);
28     }
29   while (i < size);
30
31   return count;
32}
33
34private variable Num;
35
36if (__argc != 2)
37  usage ();
38Num = integer (__argv[1]);
39if (Num < 3)
40  usage ();
41
42tic ();
43()=printf ("\n\n%d primes between 2 and %d in %f seconds.\n",
44	   count_primes (Num), Num, toc ());
45exit(0);
46