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