extract.c - OpenLearning
// by Sabrina Rispin, Nicholas Everton
// Tut Class:  wed 18 tuba, Tutor Name: Callum
// Activity Section: 6
// Date: 22/4/15
// Description:

// extract.c
// funtions and types used to extract x,y,z values from a
// string containing a url of the form
// "http://almondbread.cse.unsw.edu.au:7191/tile_x3.14_y-0.141_z5.bmp"
// initially by richard buckland
// 13 April 2014
// your name here: Sabrina Rispin
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include "extract.h"

#define ZERO '0'
#define TEN 10
#define FALSE 0
#define TRUE 1
#define MAX_LEN_INPUT 50
#define OFFSET 2
#define POS 0
#define NEG 1

void testMyAtoD (void);
void testMyAtoL (void);
 
int main (int argc, char *argv[]) {
    testMyAtoD ();
    testMyAtoL ();
    
    char * message = "http://almondbread.cse.unsw.edu.au:7191/tile_x3.14_y-0.141_z5.bmp";
 
    triordinate dat = extract (message);
 
    printf ("dat is (%f, %f, %d)\n", dat.x, dat.y, dat.z);
 
    assert (dat.x == 3.14);
    assert (dat.y == -0.141);
    assert (dat.z == 5);
 
    return EXIT_SUCCESS;
}

triordinate extract (char *message) {
    triordinate tri = {0, 0, 7};
    int xStart = strlen (message);
    int yStart = strlen (message);
    int zStart = strlen (message);
    int zEnd = strlen (message) - 1;
    char x[MAX_LEN_INPUT];
    char y[MAX_LEN_INPUT];
    char z[MAX_LEN_INPUT];
    memset (x, '\0', MAX_LEN_INPUT);
    memset (y, '\0', MAX_LEN_INPUT);
    memset (z, '\0', MAX_LEN_INPUT);

    int i = 0;
    while (i < strlen (message)) {
        if (message[i] == '_') {
            if (message[i+1] == 'x') {
                xStart = i + OFFSET;
            } else if (message[i+1] == 'y') {
                yStart = i + OFFSET;
            } else if (message[i+1] == 'z') {
                zStart = i + OFFSET;
            }
        }

        if (message[i] == '.') {
            zEnd = i;
        }
        i++;
    }

    strncpy (x, message + xStart, yStart - xStart - OFFSET);
    strncpy (y, message + yStart, zStart - yStart - OFFSET);
    strncpy (z, message + zStart, zEnd - zStart);
    
    //printf ("%s\n", x);
    //printf ("%s\n", y);
    //printf ("%s\n", z);

    if (strlen (x) > 0) {
        tri.x = myAtoD (x);
    }
    if (strlen (y) > 0) {
        tri.y = myAtoD (y);
    }
    if (strlen (z) > 0) {
        tri.z = myAtoL (z);
    }

    return tri;
}
 
double myAtoD (char *message) {
    double result = 0.0;
    int decimalPos = 0;
    int num;
    int highestPow = strlen (message) - 1;
    int sign = POS;


    int count = 0;

    if (message[0] == '-') {
        sign = NEG;
        count = 1;
    }
    
    while (count < strlen (message)) {
        if (message[count] == '.') {
            decimalPos = highestPow - count;
            result /= TEN;
        } else {
            num = message[count] - ZERO;
            result += num * pow (TEN, highestPow - count);
        }
        count++;
    }

    if (sign) {
        result *= -1;
    }

    // printf("%s\n", message);
    // printf("%lf\n", result);
    // printf("the decimal %d away from where it should be\n", decimalPos);
    // printf("divide by: %f\n", pow (TEN, decimalPos));
    
    result = result / pow (TEN, decimalPos);

    return result;
}

long myAtoL (char *message) {
    long result = 0;
    int num;
    int highestPow = strlen (message) - 1;
    int sign = POS;

    int count = 0;

    if (message[0] == '-') {
        sign = NEG;
        count = 1;
    }

    while (count < strlen (message)) {
        if (message[count] == '.') {
            count = strlen (message);
        } else {
            num = message[count] - ZERO;
            result += num * pow (TEN, highestPow - count);
        }
        count++;
    }

    if (sign) {
        result *= -1;
    }

    return result;
}

void testMyAtoD (void) {
    char *message = "12345";
    assert (myAtoD (message) == 12345.0);
    message = "100000000";
    assert (myAtoD (message) == 100000000.0);
    message = "9999999999";
    assert (myAtoD (message) == 9999999999.0);
    message = "9999999999.";
    assert (myAtoD (message) == 9999999999.0);
    message = "0.0";
    assert (myAtoD (message) == 0.0);
    message = "0.1234";
    assert (myAtoD (message) == 0.1234);
    message = "3.1415926589793";
    assert (myAtoD (message) == 3.1415926589793);
    message = "3141592.6589793";
    assert (myAtoD (message) == 3141592.6589793);
    message = "314159265897.93";
    assert (myAtoD (message) == 314159265897.93);

    message = "-12345";
    assert (myAtoD (message) == -12345.0);
    message = "-100000000";
    assert (myAtoD (message) == -100000000.0);
    message = "-9999999999";
    assert (myAtoD (message) == -9999999999.0);
    message = "-9999999999.";
    assert (myAtoD (message) == -9999999999.0);
    message = "-0.0";
    assert (myAtoD (message) == 0.0);
    message = "-0.1234";
    assert (myAtoD (message) == -0.1234);
    message = "-3.1415926589793";
    assert (myAtoD (message) == -3.1415926589793);
    message = "-3141592.6589793";
    assert (myAtoD (message) == -3141592.6589793);
    message = "-314159265897.93";
    assert (myAtoD (message) == -314159265897.93);
}

void testMyAtoL (void) {
    char *message = "12345";
    assert (myAtoL (message) == 12345);
    message = "100000000";
    assert (myAtoL (message) == 100000000);
    message = "9999999999";
    assert (myAtoL (message) == 9999999999);
    message = "0.0";
    assert (myAtoL (message) == 0);
    message = "0";
    assert (myAtoL (message) == 0);
    
    message = "-12345";
    assert (myAtoL (message) == -12345);
    message = "-100000000";
    assert (myAtoL (message) == -100000000);
    message = "-9999999999";
    assert (myAtoL (message) == -9999999999);
    message = "-0.0";
    assert (myAtoL (message) == 0);
    message = "-0";
    assert (myAtoL (message) == 0);
}

Download file: extract.c (5.7 KB)

Comments

Chat