next up previous contents
Next: Module: Sequential Up: Source Code Previous: Problem Definitions   Contents

Subsections

Module: Definitions

File: defs.h


  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

File: defs.c


  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/