// 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)