[Oberon] ReadNum and WriteNum in C

Srinivas Nayak sinu.nayak2001 at gmail.com
Tue Jul 12 03:43:15 CEST 2016


Thanks Jorg.
This is better.
Much is revealed, when we compile.
I never knew, for such a small function,
I have to wrestle with C standard!

I wanted to use only int as NW does...
But see, C fails...


With thanks and best regards,

Yours sincerely,
Srinivas Nayak

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

On 07/11/2016 06:44 PM, Jörg Straube wrote:
> Srinivas
>
> Coming back to your request how to program WriteNum and ReadNum in C.
> Did not compile it on a machine but this code should do:
>
>
> void WriteNum(FILE* R, int x)
> {
>    unsigned char b;
>
>    for(;;)
>    {
>      b = x & 0x7f;
>      if ( (x < -0x40) || (0x40 <= x) ) break;
>      fputc(0x80 | b, R); x >>= 7;
>    }
>    fputc(b, R);
> }
>
>
> void ReadNum(FILE* R, int* x)
> {
>    unsigned char b;
>    int y=0, shift=0;
>
>    do
>    {
>      b = fgetc(R); y |= (b & 0x7f) << shift; shift += 7;
>    }
>    while (b >= 0x80);
>    if (b >= 0x40) y |= -1 << shift;
>    *x=y
> }
>
>
> Jörg
>
>
>
> Gruss, Jörg
>> Am 09.07.2016 um 14:43 schrieb Srinivas Nayak <sinu.nayak2001 at gmail.com>:
>>
>> 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/
>> --
>> Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
>> https://lists.inf.ethz.ch/mailman/listinfo/oberon
>
> --
> Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
> https://lists.inf.ethz.ch/mailman/listinfo/oberon
>


More information about the Oberon mailing list