[Oberon] ReadNum and WriteNum in C

Srinivas Nayak sinu.nayak2001 at gmail.com
Sat Jul 9 14:43:11 CEST 2016


Dear All,

Here I tried to implement ReadNum and WriteNum in C.
I couldn't do it simply using / and % imitating
how NW has written them using DIV and MOD and Shifts.
I would like to see a better way to do it...


#include <stdio.h>

#define ELSIF  }else if(
#define ELSE   }else{
#define IF     if(
#define THEN   ){
#define END    }
#define WHILE  while(
#define DO     ){
#define REPEAT do{
#define UNTIL  }while(!(
#define RETURN return

unsigned int ROR(unsigned int x, int n)
{
	return (x >> (n%32))|(x << ((32-n)%32));
}

int ASR(int x, int n)
{
	return (x >> n%32);
}

void ReadNum(FILE* R, int* x)
{
     int y, n;
     unsigned char b;
     n = 32; y = 0;
     b = fgetc(R);
     //printf("%hhu ", b);

     WHILE b >= 0x80 DO
		y = ROR(y|(b-0x80), 7);
		n = n-7;
		b = fgetc(R);
		//printf("%hhu ", b);
	END

	//printf("\n");

     IF n <= 4 THEN
		*x = ROR(y|(b&0xF), 4);
	ELSE
		*x = ASR(ROR(y|b, 7), n-7);
	END
}

void WriteNum(FILE* R, int x)
{
	unsigned char b;

     WHILE (x < -0x40) || (x >= 0x40) DO
		b = (x & 0x7F)|0x80;
		fputc(b, R);
		//printf("%hhu ", b);
		x = ASR(x, 7);
     END

	b = (x & 0x7F);
     fputc(b, R);
     //printf("%hhu ", b);
     //printf("\n");
}


int main()
{
	FILE *f;
	int i = 0;
	int m = 0, n = 0;

	for (i = -8192; i <= 8192; i++)
	{
		m = i;
		//printf("\nnum write = %d\n", m);
		f = fopen("test.bin", "wb");
		WriteNum(f, m);
		fclose(f);

		f = fopen("test.bin", "rb");
		ReadNum(f, &n);
		fclose(f);
		//printf("num read = %d\n", n);

		if(m != n)
		{
			printf("%d FAILED\n", m);
		}
	}

	return 0;
}



With thanks and best regards,

Yours sincerely,
Srinivas Nayak

Home: http://www.mathmeth.com/sn/
Blog: http://srinivas-nayak.blogspot.in/


More information about the Oberon mailing list