Skip to content

Commit

Permalink
Reverse words function.
Browse files Browse the repository at this point in the history
  • Loading branch information
jwasham committed Oct 18, 2016
1 parent 0d8004b commit 54d2706
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 0 deletions.
3 changes: 3 additions & 0 deletions assembly/cmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
display/10i $eip

break main
80 changes: 80 additions & 0 deletions experiments/reverse_words.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
#include "assert.h"
#include "stdbool.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

bool reverseWords(char str[]);

int main(int argc, char **argv) {
char *s1 = "My kingdom for a horse.";
reverseWords(s1);
printf("%s\n", s1);

return 0;
}

bool reverseWords(char str[]) {
char *buffer;
int slen, tokenBegin, tokenEnd, writePos, copyPos;

slen = strlen(str);

buffer = (char *)malloc(slen + 1);
if (! buffer)
return false;

tokenBegin = tokenEnd = slen - 1;
writePos = copyPos = 0;

while (tokenBegin >= 0) {
if (str[tokenBegin] == ' ') {
buffer[writePos++] = str[tokenBegin--];
} else {
while (tokenBegin >= 0 && str[tokenBegin] != ' ')
--tokenBegin;
copyPos = tokenBegin + 1;
while (copyPos <= tokenEnd)
buffer[writePos++] = str[copyPos++];
}
}

buffer[writePos] = '\0';
strlcpy(str, buffer, slen + 1);
free(buffer);

return true;
}

//bool reverseWords(char str[]) {
// char *buffer;
// int slen, tokenReadPos, wordReadPos, wordEnd, writePos = 0;
// slen = strlen(str);
// /* Position of the last character is length - 1 */
// tokenReadPos = slen - 1;
// buffer = (char *)malloc(slen + 1);
//
// if (!buffer) return false; /* reverseWords failed */
// while (tokenReadPos >= 0) {
// if (str[tokenReadPos] == ' ') { /* Non-word characters */
// /* Write character */
// buffer[writePos++] = str[tokenReadPos--];
// } else { /* Word characters */
// /* Store position of end of word */
// wordEnd = tokenReadPos;
// /* Scan to next non-word character */
// while (tokenReadPos >= 0 && str[tokenReadPos] != ' ') tokenReadPos--;
// /* tokenReadPos went past the start of the word */
// wordReadPos = tokenReadPos + 1;
// /* Copy the characters of the word */
// while (wordReadPos <= wordEnd) {
// buffer[writePos++] = str[wordReadPos++];
// }
// }
// }
// /* null terminate buffer and copy over str */
// buffer[writePos] = '\0';
// strlcpy(str, buffer, slen + 1);
// free(buffer);
// return true; /* ReverseWords successful */
//}

0 comments on commit 54d2706

Please sign in to comment.