/* speed.c - mrq, 2000 calculates the speed of a connection (in terms of bytes) given a speed in bits. for example: 1mbit 512kbit 1gbit */ #include #include #define T_GIG (1073741824) #define T_MEG (1048576) #define T_K (1024) #define T_BYTE (8) double bytespersec; typedef struct { char text[32]; char desc[32]; double multiplier; } wordT; wordT word[10]; long numwords = 0; void setword (char *txt, double mult, char *desc) { strcpy(word[numwords].text, txt); strcpy(word[numwords].desc, desc); word[numwords].multiplier = mult; numwords++; } void calctime(double howmuch, char *description) { long num; num = howmuch / bytespersec; printf("Time to transfer %s: ", description); if (num > 0) { if (num > 86400) { printf("%ld days, ", num / 86400); num = num % 86400; } if (num > 3600) { printf("%ld hours, ", num / 3600); num = num % 3600; } if (num > 60) { printf("%ld mins, ", num / 60); num = num % 60; } printf("%ld secs\n", num); } else { printf("under a second\n"); } } int main(int argc, char **argv) { char buf[1024]; char desc[32]; char *endchar; int i; double multiplier; if (argc < 2) { printf("enter speed: "); fgets(buf, sizeof(buf), stdin); } else { strcpy(buf, ""); for (i = 1; i < argc; i++) { strcat(buf, argv[i]); if (i < (argc - 1)) { strcat(buf, " "); } } } setword("gigabit", T_GIG,"gbit"); setword("gbit", T_GIG,"gbit"); setword("gig", T_GIG,"gbit"); setword("gb", T_GIG,"gbit"); setword("megabit", T_MEG,"mbit"); setword("mbit", T_MEG,"mbit"); setword("meg", T_MEG,"mbit"); setword("mb", T_MEG,"mbit"); setword("kilobit", T_K,"kbit"); setword("kbit", T_K,"kbit"); setword("kb", T_K,"kbit"); setword("k", T_K,"kbit"); setword("baud", 1,"baud"); setword("b", 1,"baud"); endchar = NULL; for (i = 0; i < numwords; i++) { if (strstr(buf, word[i].text)) { endchar = (char *)strstr(buf, word[i].text); multiplier = word[i].multiplier; strcpy(desc, word[i].desc); break; } } if (!endchar) { if ((buf[strlen(buf)-1] == '\n') || (buf[strlen(buf)-1] == '\r')) { buf[strlen(buf)-1] = '\0'; /* get rid of trailing newline */ } printf("assuming that speed entered is in bits per sec (%s baud)\n",buf); strcpy(desc, "baud"); multiplier = 1; } else { *endchar = '\0'; } bytespersec = atof(buf); printf("\n%0.2f %s = ", bytespersec,desc); bytespersec *= multiplier; bytespersec /= T_BYTE; if (bytespersec < T_K ) { printf("%0.2f bytes/sec", bytespersec); } else if (bytespersec < T_MEG) { printf("%0.2f kilobytes/sec", bytespersec / T_K); } else if (bytespersec < T_GIG) { printf("%0.2f megabytes/sec", bytespersec / T_MEG); } else { printf("%0.2f gigabytes/sec", bytespersec / T_GIG); } printf("\n\n"); /* figure out how long it would take for various amounts of data */ calctime(T_K*100, "100k"); calctime(T_MEG, "1 meg"); calctime(T_MEG * 650, "650 meg (1 cdrom)"); calctime(T_GIG, "1 gig"); }