Fix up morse lib; tests work, still memory leadked

master
Tait Hoyem 2 years ago
parent 46a1aea922
commit f0e56bb1d4

@ -20,17 +20,17 @@ int main(int argc, char *argv[]){
long dash_delay = DEFAULT_DASH_PAUSE; long dash_delay = DEFAULT_DASH_PAUSE;
long dot_delay = DEFAULT_DOT_PAUSE; long dot_delay = DEFAULT_DOT_PAUSE;
bool isSlow = false; bool is_slow = false;
bool convertFromMorse = false; bool convert_from_morse = false;
size_t buflen = 0; size_t buflen = 0;
for (int argi = 0; argi < argc; argi++){ for (int argi = 0; argi < argc; argi++){
char* arg = argv[argi]; char* arg = argv[argi];
if (strcmp(arg, "--slow") == 0 || strcmp(arg, "-s") == 0){ if (strcmp(arg, "--slow") == 0 || strcmp(arg, "-s") == 0){
isSlow = true; is_slow = true;
} else if (strcmp(arg, "--reverse") == 0 || strcmp(arg, "-x") == 0){ } else if (strcmp(arg, "--reverse") == 0 || strcmp(arg, "-x") == 0){
convertFromMorse = true; convert_from_morse = true;
} else if (strcmp(arg, "--dash-delay") == 0 || strcmp(arg, "-hd") == 0){ } else if (strcmp(arg, "--dash-delay") == 0 || strcmp(arg, "-hd") == 0){
if (argc > argi+1){ if (argc > argi+1){
dash_delay = strtol(argv[argi+1], NULL, 10); dash_delay = strtol(argv[argi+1], NULL, 10);
@ -46,7 +46,7 @@ int main(int argc, char *argv[]){
} }
} }
if (convertFromMorse){ if (convert_from_morse){
// for every line in the input, until the end of file // for every line in the input, until the end of file
while ((getline(&input_string, &buflen, stdin))!=EOF){ while ((getline(&input_string, &buflen, stdin))!=EOF){
int stringLen = strlen(input_string); int stringLen = strlen(input_string);
@ -73,7 +73,7 @@ int main(int argc, char *argv[]){
string_to_morse(input_string, output_string); string_to_morse(input_string, output_string);
if (isSlow){ if (is_slow){
for (int i = 0; i < strlen(output_string); i++){ for (int i = 0; i < strlen(output_string); i++){
output_char = output_string[i]; output_char = output_string[i];
if (output_char == '-'){ if (output_char == '-'){

@ -38,23 +38,27 @@ static char* MORSE_ERROR = "........";
// ... it's used for performence! // ... it's used for performence!
// //
// I do not copy ANY data. The pointer returned points to the above array! // I do not copy ANY data. The pointer returned points to the above array!
char* char_to_morse(char letter) { void char_to_morse(char letter, char* result) {
bool found = false;
for (int i = 0; i < NUM_OF_SYMBOLS; i++) { for (int i = 0; i < NUM_OF_SYMBOLS; i++) {
if (letter == SYMBOLS[i]) { if (letter == SYMBOLS[i]) {
return MORSE[i]; strcpy(result, MORSE[i]);
found = true;
} }
} }
return MORSE_ERROR; if (!found) {
strcpy(result, MORSE_ERROR);
}
} }
void string_to_morse(char* string, char* result){ void string_to_morse(char* string, char* result){
int on_char = 0; int on_char = 0;
int string_len = strlen(string); int string_len = strlen(string);
char* morse; char morse[MAX_MORSE_LENGTH] = "";
// worse possible case is 8 times the length (assuming all numbers/punctuation, and adding spaces) // worse possible case is 8 times the length (assuming all numbers/punctuation, and adding spaces)
// +1 for NULL terminator // +1 for NULL terminator
for (int i = 0; i < string_len; i++){ for (int i = 0; i < string_len; i++){
morse = char_to_morse(string[i]); char_to_morse(string[i], morse);
int morse_len = strlen(morse); int morse_len = strlen(morse);
memcpy(result+on_char, morse, morse_len); memcpy(result+on_char, morse, morse_len);
on_char += morse_len; on_char += morse_len;

@ -1,6 +1,6 @@
#include <stdbool.h> #include <stdbool.h>
char* char_to_morse(char letter); void char_to_morse(char letter, char* result);
void string_to_morse(char* string, char* result); void string_to_morse(char* string, char* result);
char morse_to_char(const char* morse); char morse_to_char(const char* morse);
void morse_to_string(const char* morse, char* result); void morse_to_string(const char* morse, char* result);

@ -60,7 +60,8 @@ void assert_str_neq(const char* s1, const char* s2){
} }
void assert_ctm(char input, char* output){ void assert_ctm(char input, char* output){
const char* result = char_to_morse(input); char result[8];
char_to_morse(input, result);
printf(FUNCTION_CALL_CFORMAT, "char_to_morse", input); printf(FUNCTION_CALL_CFORMAT, "char_to_morse", input);
assert_str_eq(result, output); assert_str_eq(result, output);
} }

Loading…
Cancel
Save