Thread: Pascal code to C language

  1. #1
    Registered User
    Join Date
    Oct 2017
    Posts
    2

    Pascal code to C language

    Problem
    The problem at hand is decoding a string. This is done by converting code from Pascal into the C language.

    1. Define the decoded string as a global array of char's and the coded string as a global array of int's:

    Code:
    char plain[4];
    int    coded[3] = {0xdd9134c7,0xa5438229,0xcfbcb417,0};
    2. Implement three functions
    ¤ int codgen(int *seed:_addr) this function should take an address to seed
    as an argument.

    ¤ int decode(int *wordarr, char *bytearr, int *seed_addr): this function should take addresses to wordarr, bytearr, and seed as arguments.

    ¤ int main(void): this is the main funtion, the entry point of the program. The main function should initialize seed as a local variable and invoke decode(coded, plain, &seed)

    3. To test the implementation
    Include the header file stdio.h and add a print-out using printf() at the end of the main function. Compile the program using gcc (gcc -o lab4 lab4.c) and execute it (./lab4).

    Pseudocode (given in the instruction)
    Codeword Generator Subroutine (pseudocode)
    (remember: "seed" is a global variable 0x624d24b8, UNSIGNED INTEGER;

    FUNCTION cogen(): UNSIGNED INTEGER;
    LOCAL SIGNED INTEGER n;
    LOCAL UNSIGNED INTEGER x, y:
    BEGIN n := [right-justify the five bits "seed"<24:20>, and zero-extend];
    WHILE (n >= 0) LOOP
    x := [shift "seed" left-logical by 3 bits];
    y := [divide "seed" (unsigned!) by the constant 16];
    seed := x - y; [ignore overflow condition]
    n := n - 1;
    ENDLOOP
    RETURN(seed XOR 0x0176f7df);
    END

    hint: if "seed" is initialized to 0x34a7ac2c, the first five calls will generate these values:
    0x1d21502a, 0x4a0a7254, 0x9168b479, 0xb97433fe, 0xb5e30319,...

    Recursive Decoding Subroutine (pseudocode)
    FUNCTION decode(wordarr,bytearr): UNSIGNED INTEGER;
    (wordarr, bytearr passed by reference)
    LOCAL UNSIGNED INTEGER m, r, x, y;
    BEGIN
    x := ONE'S - COMPLEMENT of codgen();
    IF ([contents of word at "wordarr"] = 0) THEN
    [byte pointed to by "bytearr"] := 0;
    r := x;
    ELSE
    y := decode(wordarr+,bytearr+);
    m = (x XOR y) - [contents of word at "wordarr"];
    [byte pointed to by "bytearr"] := [the eight bits at "m"<21:14>];
    r := TWO'S - COMPLEMENT OF codgen();
    r = x + y + m + r + 5;
    ENDIF
    RETURN(r);
    END


    My code
    Actually, I get the first function working just fine, the problem is with the second function.
    Code:
    /* define data */
    #include <stdio.h>
    char plain[4];
    int    coded[3] = {0xdd9134c7,0xa5438229,0xcfbcb417,0}; 
    int    a; 
    int    b;
    unsigned int seed;
    int* pseed;
    unsigned int codgen( int *seed_addr );
    unsigned int decode( int *wordarr, char *bytearr, int *seed_addr);
    
    /* main function */
    int main ( void )
    {
            seed = 0x624d24b8; 
            pseed = &seed;
            decode( coded, plain, &seed);
    }
    
    /* codgen function */
    unsigned int codgen ( int *seed_addr ) 
    {
            unsigned int x;
            unsigned int y;
                           int n = seed >> 20; /* shift "seed" right-logical by 20 bits */
                                n = n & 0x1f; /* isolate the 5 bits to the very right */
            while( n >= 0){
                                x = seed << 3; /* shift "seed" left-logical by 3 bits */
                                y = seed >> 4; /* shift '"seed" right-logical by 4 bits */
                                seed = x - y; /* calculate the new seed */
                                n--;
            }
    unsigned int v = seed ^ 0x0176f7df; /* seed XOR 0x0176f7df */
    printf( "\n v = %08x \n \n",v ); /*print v */
    return v;
    }
    
    /* decode function */
    unsigned int decode( int *wordarr, char *bytearr, int *seed_addr )
    {
            unsigned int m;
            unsigned int r;
            unsigned int x;
            unsigned int y;
            x = ~ codgen(seed); /* ONE'S COMPLEMENT OF codgen() */
            if ( coded[a] == 0) {
                    plain[b] = 0;
                    r = x;
            }
            else {
                    a++;
                    b++;
                    y = decode( coded + 1, plain + 1, seed);
           }
           while ( b >= 0 ) {
                   m = x ^ y - plain[b];
                   m = m >> 14;
                   m = m & 0xff;
                   printf( "\n m = %08x \n \n", m )
                   plain[b] = m;
                   x = ~ codgen(seed);
                   r = x + 1;
                   r = x + y + m + r + 5;
                   b--;
             }
             return r;
     }


    Comments
    The codgen function is working properly, I get the correct reference values when initializing the seed to 0x34a7ac2c.

    In the decode function I want to write the decoded values to the plain array, but it seems like the variable m in my code is an integer and I don't know how to deal with it. I checked the "integer to string conversion" but it does not seem to apply in my case. I know that the results should be a string with the content "abc" but I get nowhere near that.

  2. #2
    and the hat of int overfl Salem's Avatar
    Join Date
    Aug 2001
    Location
    The edge of the known universe
    Posts
    39,659
    Pascal code to C language
    Don't be so impatient to wait for moderation.
    If you dance barefoot on the broken glass of undefined behaviour, you've got to expect the occasional cut.
    If at first you don't succeed, try writing your phone number on the exam paper.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Pascal code to C language
    By K.J.Linder in forum C++ Programming
    Replies: 1
    Last Post: 10-21-2017, 02:12 AM
  2. can anyone help me with my pascal triangle c code?
    By einstein in forum C Programming
    Replies: 4
    Last Post: 02-28-2016, 12:09 PM
  3. Code for pascal triangle
    By suryak in forum C Programming
    Replies: 7
    Last Post: 05-20-2011, 08:34 AM
  4. pascal code inside c++
    By geek@02 in forum C++ Programming
    Replies: 4
    Last Post: 09-14-2005, 04:45 AM
  5. Comparing Pascal, C, C++ and Java thru Code.
    By jozzua in forum C++ Programming
    Replies: 14
    Last Post: 07-07-2004, 12:03 AM

Tags for this Thread