From 19bbd273058f79cf0c41c2a6fffcd63d308fd362 Mon Sep 17 00:00:00 2001
From: Adorn Binoy <ajb527@drexel.edu>
Date: Fri, 17 Jan 2025 16:29:56 -0500
Subject: [PATCH] First homework assignment

---
 1-C-Refresher/makefile    |  20 +++
 1-C-Refresher/stringfun   | Bin 0 -> 19640 bytes
 1-C-Refresher/stringfun.c | 265 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 285 insertions(+)
 create mode 100644 1-C-Refresher/makefile
 create mode 100755 1-C-Refresher/stringfun
 create mode 100644 1-C-Refresher/stringfun.c

diff --git a/1-C-Refresher/makefile b/1-C-Refresher/makefile
new file mode 100644
index 0000000..98655da
--- /dev/null
+++ b/1-C-Refresher/makefile
@@ -0,0 +1,20 @@
+# Compiler settings
+CC = gcc
+CFLAGS = -Wall -Wextra -g
+
+# Target executable name
+TARGET = stringfun
+
+# Default target
+all: $(TARGET)
+
+# Compile source to executable
+$(TARGET): stringfun.c
+	$(CC) $(CFLAGS) -o $(TARGET) $^
+
+# Clean up build files
+clean:
+	rm -f $(TARGET)
+
+# Phony targets
+.PHONY: all clean
\ No newline at end of file
diff --git a/1-C-Refresher/stringfun b/1-C-Refresher/stringfun
new file mode 100755
index 0000000000000000000000000000000000000000..163914fd7bab18843084bcbbd5b82eda185bb8a9
GIT binary patch
literal 19640
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
Bg%kh)

literal 0
HcmV?d00001

diff --git a/1-C-Refresher/stringfun.c b/1-C-Refresher/stringfun.c
new file mode 100644
index 0000000..239b4b3
--- /dev/null
+++ b/1-C-Refresher/stringfun.c
@@ -0,0 +1,265 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#define BUFFER_SZ 50
+
+//prototypes
+void usage(char *);
+void print_buff(char *, int);
+int setup_buff(char *, char *, int);
+int count_words(char *, int, int);
+
+// Implementatino of the setup buff as per the directions
+int setup_buff(char *buff, char *user_str, int len) {
+    char *dest = buff; // Pointer to the buffer
+    char prevChar = ' '; // Tracks previous character for spaces
+    int charCounter = 0; // Number of characters processed
+
+    // Null check for input string
+    if (user_str == NULL) {
+        printf("Error: Null input string.\n");
+        return -1;
+    }
+
+    // Process user_str and fill the buffer
+    while (*user_str != '\0' && charCounter < len) {
+        // Copy every nonwhite space character into internal buffer and updates variables
+        if (*user_str != ' ' && *user_str != '\t') {
+            *dest = *user_str;
+            dest++;
+            charCounter++;
+            prevChar = *user_str;
+        } 
+        // Checks for double space and replaces with single space
+        else if (prevChar != ' ') {
+            *dest = ' ';
+            dest++;
+            charCounter++;
+            prevChar = ' ';
+        }
+        // Increments input pointer to next memory location
+        user_str++;
+    }
+
+    // Checks for the user supplied string being too large (end never reached)
+    if (*user_str != '\0') {
+        printf("Error: Provided input string is too long.\n");
+        return -1;
+    }
+
+    // Fill the rest of the buffer with dots
+    while (charCounter < len) {
+        *dest = '.';
+        dest++;
+        charCounter++;
+    }
+
+    // If no errors, return the length of the user supplied string
+    return charCounter;
+}
+
+// Function to print the entire buffer
+void print_buff(char *buff, int len) {
+    printf("Buffer:  %.*s\n", len, buff);
+}
+
+void usage(char *exename) {
+    printf("usage: %s [-h|c|r|w|x] \"string\" [other args]\n", exename);
+}
+
+int count_words(char *buff, int len, int str_len) {
+    // Exit if string length greater than the buffer length
+    if (str_len > len) {
+        return -1;
+    }
+
+    // Exit if the string is empty
+    if (str_len == 0) {
+        return 0;
+    }
+
+    int totalWords = 0;
+
+    // Loops through the buffer and updates totalWords based on current/previous character being a space
+    for (int i = 0; i < str_len; i++) {
+        if (buff[i] != ' ' && (i == 0 || buff[i - 1] == ' ')) {
+            totalWords++;
+        }
+    }
+
+    return totalWords;
+}
+
+void reverseString(char *buff, int str_len) {
+    int actual_length = 0;
+    for (int i = 0; i < str_len; i++) {
+        if (buff[i] != '.') {
+            actual_length++;
+        } else {
+            break;
+        }
+    }
+
+    char *start = buff;
+    char *end = buff + actual_length - 1;
+
+    while (start < end) {
+        char temp = *start;
+        *start = *end;
+        *end = temp;
+        start++;
+        end--;
+    }
+}
+
+void printWords(char *buff, int str_len) {
+    int wordCounter = 0;  // Index of the word from the input
+    int startIndex = -1;  // Tracks the start index of the word
+
+    printf("Word Print\n----------\n");
+
+    for (int i = 0; i < str_len; i++) {
+        // Ignore dots explicitly
+        if (buff[i] == '.') {
+            if (startIndex != -1) {
+                // Print the current word and reset startIndex
+                printf("%.*s (%d)\n", i - startIndex, &buff[startIndex], i - startIndex);
+                startIndex = -1;
+            }
+            continue;
+        }
+
+        // Start of a new word. Keep track of characters.
+        if (buff[i] != ' ') {
+            if (startIndex == -1) {
+                wordCounter++;
+                startIndex = i;
+                printf("%d. ", wordCounter);
+            }
+        } 
+        // End of the current word. Reset the index for the next word
+        else if (startIndex != -1) {
+            printf("%.*s (%d)\n", i - startIndex, &buff[startIndex], i - startIndex);
+            startIndex = -1;
+        }
+    }
+
+    // Prints output for the last word if it exists.
+    if (startIndex != -1) {
+        printf("%.*s (%d)\n", str_len - startIndex, &buff[startIndex], str_len - startIndex);
+    }
+}
+
+
+int main(int argc, char *argv[]) {
+    char *buff;             // Placeholder for the internal buffer
+    char *input_string;     // holds the string provided by the user on cmd line
+    char opt;               // used to capture user option from cmd line
+    int rc;                 // used for return codes
+    int user_str_len;       // length of user supplied string
+
+    //TODO:  #1. WHY IS THIS SAFE, aka what if argv[1] does not exist?
+    // This code is safe because the first part of the if statement checks to make ensure if there are enough arguments.
+    // So if this first test fails, the second part won't be ran and the code exits.
+    if ((argc < 2) || (*argv[1] != '-')) {
+        printf("Error: Invalid option. Please try again.\n");
+        usage(argv[0]);
+        exit(1);
+    }
+
+    opt = (char)*(argv[1] + 1);
+
+    // handle the help flag and then exit normally
+    if (opt == 'h') {
+        usage(argv[0]);
+        exit(0);
+    }
+
+    //TODO:  #2 Document the purpose of the if statement below
+    // This if statement makes sure that an input string is provided along with the command.
+    if (argc < 3) {
+        printf("Error: Missing input string.\n");
+        usage(argv[0]);
+        exit(1);
+    }
+
+    input_string = argv[2];
+
+    //TODO:  #3 Allocate space for the buffer using malloc and
+    //          handle error if malloc fails by exiting with a 
+    //          return code of 99 and prints error message.
+    buff = (char *)malloc(BUFFER_SZ * sizeof(char));
+    if (buff == NULL) {
+        printf("Error: Memory allocation failed.\n");
+        exit(99);
+    }
+
+    // Initialize buffer
+    for (int i = 0; i < BUFFER_SZ; i++) {
+        buff[i] = '.';
+    }
+
+    user_str_len = setup_buff(buff, input_string, BUFFER_SZ);
+    if (user_str_len < 0) {
+        printf("Error setting up buffer, error = %d", user_str_len);
+        exit(2);
+    }
+
+    switch (opt) {
+        case 'c':
+            rc = count_words(buff, BUFFER_SZ, user_str_len);  // you need to implement
+            if (rc < 0) {
+                printf("Error counting words, rc = %d", rc);
+                exit(2);
+            }
+            printf("Word Count: %d\n", rc);
+            break;
+
+        case 'r':
+            reverseString(buff, user_str_len);
+            // Print the reversed string without the dots
+            printf("Reversed String: ");
+            for (int i = 0; i < user_str_len; i++) {
+                if (buff[i] != '.') {
+                    putchar(buff[i]);
+                }
+            }
+            printf("\n");
+            break;
+
+        case 'w':
+            printWords(buff, user_str_len);
+            break;
+
+        case 'x':
+            if (argc < 5) {
+                printf("Error: Not enough arguments\n");
+                exit(1);
+            }
+
+            printf("Not implemented!\n");
+            break;
+
+        //TODO:  #5 Implement the other cases for 'r' and 'w' by extending
+        //       the case statement options
+        default:
+            usage(argv[0]);
+            exit(1);
+    }
+
+    //TODO:  #6 Don't forget to free your buffer before exiting
+    print_buff(buff, BUFFER_SZ);
+    free(buff);
+    exit(0);
+}
+
+//TODO:  #7  Notice all of the helper functions provided in the 
+//          starter take both the buffer as well as the length.  Why
+//          do you think providing both the pointer and the length
+//          is a good practice, after all we know from main() that 
+//          the buff variable will have exactly 50 bytes?
+//  
+//          Passing the length makes it so that buffer overflows can be prevented since the helper functions are not aware of the size that is defined in main.
+//          It reduces risk and makes the code more future proof in case the size of the buffer changes.
+//          Finally, it makes the code more readable as the function's purpose can be observed easier and clearly.
-- 
GitLab