Next: Module: Sequential
Up: Source Code
Previous: Problem Definitions
  Contents
Subsections
1
2 /* Common Definitions */
3
4 #ifndef DEFS_H
5 #define DEFS_H 1
6
7 /* data types */
8
9 #define errtyp float
10 #define byte unsigned char
11 #define word unsigned int
12 #define ind word*
13 #define state int
14
15 /* data lengths */
16
17 #define INTLEN sizeof(int)
18 #define ERRLEN sizeof(int)
19 #define WORDLEN sizeof(unsigned int)
20 #define INDLEN sizeof(ind)
21 #define FLOATLEN sizeof(float)
22 #define PNTLEN sizeof(void*)
23
24 /* maximum values */
25
26 #define MAXERROR 0x7fffffff
27 #define MAXRANDOM 0x7fffffff
28
29 /* macros */
30
31 #define bitoffs(n) ((n) & 31)
32 #define wordoffs(n) ((n) >> 5)
33 #define getbit(x,i) ((x[wordoffs(i)]>>bitoffs(i))&1)
34 #define min(x,y) ((x)<(y) ? (x) : (y))
35 #define max(x,y) ((x)>(y) ? (x) : (y))
36 #define getrand() random()
37 #define seedrand(s) srandom(s)
38 #define gettime() time(0)
39
40 /* flags */
41
42 #define AUTO (-1)
43 #define FAUTO (-65536.0*65536.0)
44 #define NOENTRY (-1)
45 #define UNDEF (-1)
46
47 /* procedures */
48
49 word getbits(ind x,int i,int n);
50 word putbits(word w,ind x,int i,int n);
51 int duallog(int n);
52 int getint(char *s,int min,int max);
53 int getfloat(float *y,char *s,float min,float max);
54 int rounddec(int x);
55
56 #endif
57
1
2 /* Common Procedures */
3
4 #include "defs.h"
5 #include "par.h"
6
7 /* isolate bitstring */
8
9 word getbits(ind x,int i,int n)
10 {
11 byte *p;
12 word *q;
13 int j,k;
14 word m;
15
16 j=bitoffs(i);
17 k=wordoffs(i);
18 m=(1 << n)-1;
19 if(j<bitoffs(i+n))
20 return (x[k] >> j) & m;
21 else
22 return ((x[k] >> j) | (x[k+1] << (32-j))) & m;
23 }
24
25 word putbits(word w,ind x,int i,int n)
26 {
27 byte *p;
28 word *q;
29 int j,k;
30 word m;
31
32 j=bitoffs(i);
33 k=wordoffs(i);
34 m=((1 << n)-1);
35 x[k]&= ~(m << j); x[k]|=(w << j);
36 if(j>=bitoffs(i+n))
37 {
38 x[k+1]&= ~(m >> (32-j));
39 x[k+1]|= (w >> (32-j));
40 };
41 }
42
43 /* dual logarithm, rounded up */
44
45 int duallog(int n)
46 {
47 int l;
48
49 for(l=0;(1<<l)<n;l++);
50 return l;
51 }
52
53 int getfloat(float *y,char *s,float min,float max)
54 {
55 float x;
56
57 if(!s) return 1;
58 switch(s[0])
59 {
60 case 0: return 1;
61 default: sscanf(s,"%f",&x);
62 };
63 if(x<min || x>max) return 1;
64 *y=x;
65 return 0;
66 }
67
68 int getint(char *s,int min,int max)
69 {
70 int n;
71
72 if(!s) return -1;
73 switch(s[0])
74 {
75 case '+': n=1; break;
76 case '-': n=0; break;
77 case 0: n=1; break;
78 default: n=atoi(s);
79 };
80 if(n<min || n>max) return(-1);
81 return n;
82 }
83
84 int rounddec(int x)
85 {
86 if(x<=1) return 1;
87 if(x<=3) return 2;
88 if(x<=7) return 5;
89 return 10*rounddec((x+5)/10);
90 }
(c) Bernhard Ömer - oemer@tph.tuwien.ac.at - http://tph.tuwien.ac.at/~oemer/