From f4f730e3c3912c0635abaf7f6be24a7bd50a1885 Mon Sep 17 00:00:00 2001
From: Andrew To <andrewto.307@gmail.com>
Date: Sun, 19 Jan 2025 23:57:44 -0500
Subject: [PATCH] HW2

---
 .DS_Store       | Bin 0 -> 6148 bytes
 Hw2/Makefile    |  20 ++++
 Hw2/stringfun   | Bin 0 -> 19496 bytes
 Hw2/stringfun.c | 255 ++++++++++++++++++++++++++++++++++++++++++++++++
 Hw2/test.sh     | 100 +++++++++++++++++++
 5 files changed, 375 insertions(+)
 create mode 100644 .DS_Store
 create mode 100644 Hw2/Makefile
 create mode 100755 Hw2/stringfun
 create mode 100644 Hw2/stringfun.c
 create mode 100644 Hw2/test.sh

diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..b1d5ffd05b4a2a5df0a3d7e7f0ab95a9d60d40d1
GIT binary patch
literal 6148
zcmZQzU|@7AO)+F(5MW?n;9!8zOq>i@0Z1N%F(jFwB3vNzKxX8m8wMxm=N3T4N2$Rd
z0-(5KVbEhpXUJqIL5;sfpu_=}%guLjNy^Dj0wowr*GF!=bB{SPFfbs=r{I+@$UsUP
zOdmiY!^sfD;L700;KJa`;L4!Kkjs$bnUkLkwFP85$OgUtU;xs<z{XI{kjjwCkj<dW
zV2Gx6Jp%&+PPM2$V>M=AKs5`+cQtDd3d{ui4#mFQd?X*@P=n%2aP9)Tdz2Urfzc2c
z4S~TG0*nynaBxHDQF1f{MnhmU1mGb6DjyUeZF>d>DBS>|K~fBi3=H5d03)aw2-U?1
z>IXp7fV6_tfV6^WkX8mp5DP31*2=)hzyj9E2=0b3Ffc+JO^gg+?F@`yn?d4W?F@`y
zn;94wA=()jA=()jp*<8vP_q$aK14eMBiMGZ6{Eyx2#kgRQV1|Z*aD#X-<5#@SN|WP
zYLpxefzc2cmLb5%;u7rQ1gbP~cn?(9g6h)*s640+235z5pn4f02Cj;kAOngLP+?GY
d57G*v!BsIM0|Q9wXhQ%NK%?|%2n;|7003<kT*UwY

literal 0
HcmV?d00001

diff --git a/Hw2/Makefile b/Hw2/Makefile
new file mode 100644
index 0000000..98655da
--- /dev/null
+++ b/Hw2/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/Hw2/stringfun b/Hw2/stringfun
new file mode 100755
index 0000000000000000000000000000000000000000..8cb7308c3a354760af3f736e12c9caff340d3342
GIT binary patch
literal 19496
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
Gx_$ukj(YF_

literal 0
HcmV?d00001

diff --git a/Hw2/stringfun.c b/Hw2/stringfun.c
new file mode 100644
index 0000000..6b962f1
--- /dev/null
+++ b/Hw2/stringfun.c
@@ -0,0 +1,255 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdbool.h>
+
+
+#define BUFFER_SZ 50
+
+//prototypes
+void usage(char *);
+void print_buff(char *, int);
+int  setup_buff(char *, char *, int);
+
+//prototypes for functions to handle required functionality
+int  count_words(char *, int, int);
+//add additional prototypes here
+
+
+int setup_buff(char *buff, char *user_str, int len){
+    //TODO: #4:  Implement the setup buff as per the directions
+    bool isSpace = false;
+    int count = 0;
+
+    while (*user_str != '\0' && count < BUFFER_SZ - 1) { // stop when reaching the end-of-buffer
+        if (*user_str != '\t'){
+            if (*user_str != ' ' || isSpace == false) {
+                *buff = *user_str;
+                if (*user_str == ' '){
+                    isSpace = true;
+                } else {
+                    isSpace = false;
+                }
+                buff++;
+                user_str++;
+                count++;
+            } else {
+                user_str++;
+                isSpace = false;
+            }
+        } else {
+            user_str++;
+        }
+    }
+    int ret = count;
+    if (count > len){
+        return -1;
+    }
+    while (count <= len){
+        *buff = '.';
+        buff++;
+        count++;
+    }
+
+    return ret; //for now just so the code compiles. 
+}
+
+void print_buff(char *buff, int len){
+    printf("Buffer:  ");
+    for (int i=0; i<len; i++){
+        putchar(*(buff+i));
+    }
+    putchar('\n');
+}
+
+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){
+    //YOU MUST IMPLEMENT
+    if (str_len > len){
+        return -1;
+    }
+
+    if (str_len==0){
+        return 0;
+    }
+    int words = 1;
+    for (int i=0; i<str_len; i++){
+        if (*buff == ' '){
+            words++;
+        }
+        buff++;
+    }
+    return words;
+}
+
+//ADD OTHER HELPER FUNCTIONS HERE FOR OTHER REQUIRED PROGRAM OPTIONS
+
+void reverse_string(char *buff, int len, int str_len){
+    int lim;
+    if (len < str_len){
+        lim = len;
+    } else {
+        lim = str_len;
+    }
+    char *newBuff = (char*)malloc(BUFFER_SZ);
+    for (int i=0; i<lim; i++){
+        *newBuff = *buff;
+        newBuff--;
+        buff++;
+    }
+
+    for (int i=0; i<lim; i++){
+        putchar(*(newBuff+i));
+    }
+
+    printf("\n");
+}
+
+void word_print(char *buff, int len, int str_len){
+    int lim;
+    if (len < str_len){
+        lim = len;
+    } else {
+        lim = str_len;
+    }
+
+    int count = 1;
+    int track = 0;
+    printf("Word Print\n");
+    printf("--------------\n");
+    printf("%d. ", count);
+    for (int i=0; i<lim; i++){
+        if (*buff != ' '){
+            putchar(*buff);
+            track++;
+        } else {
+            printf(" (%d)\n",track);
+            count++;
+            printf("%d. ", count);
+            track = 0;
+        }
+        buff++;
+    }
+    printf(" (%d)\n",track);
+}
+
+// void replace(char *buff, *new_buff)
+
+int main(int argc, char *argv[]){
+
+    char *buff;             //placehoder 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 arv[1] does not exist?
+    //      PLACE A COMMENT BLOCK HERE EXPLAINING
+
+    /*
+    If arv[1] does not exist, the condition argc < 2, so the program will safely exit and print the usage:
+    usage: ./stringfun [-h|c|r|w|x] "string" [other args]
+    */
+
+    if ((argc < 2) || (*argv[1] != '-')){
+        usage(argv[0]);
+        exit(1);
+    }
+
+    opt = (char)*(argv[1]+1);   //get the option flag
+
+    //handle the help flag and then exit normally
+    if (opt == 'h'){
+        usage(argv[0]);
+        exit(0);
+    }
+
+    //WE NOW WILL HANDLE THE REQUIRED OPERATIONS
+
+    //TODO:  #2 Document the purpose of the if statement below
+    //      PLACE A COMMENT BLOCK HERE EXPLAINING
+
+    /*
+    This if statement make sure that users provide a string after the namefile and the operation (-h|c|r|w|x)
+    If not, it will print the usage
+    */
+    if (argc < 3){
+        usage(argv[0]);
+        exit(1);
+    }
+
+    input_string = argv[2]; //capture the user input string
+
+    //TODO:  #3 Allocate space for the buffer using malloc and
+    //          handle error if malloc fails by exiting with a 
+    //          return code of 99
+    // CODE GOES HERE FOR #3
+    buff= (char*)malloc(BUFFER_SZ);
+    user_str_len = setup_buff(buff, input_string, BUFFER_SZ);     //see todos
+    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;
+        // TODO:  #5 Implement the other cases for 'r' and 'w' by extending
+        // the case statement options
+        case 'r':
+            reverse_string(buff, BUFFER_SZ, user_str_len);
+            break;
+
+        case 'w':
+            word_print(buff, BUFFER_SZ, user_str_len);
+            break;
+
+        case 'x':
+            if (argc < 5){
+                printf("Need 3 arguments: sample string and 2 other strings\n");
+                exit(1);
+            } else {
+                // buff= (char*)malloc(BUFFER_SZ);
+                // old_string = argv[3];
+                // old_str_len = setup_buff()
+                // new_string = argv[4];
+                // new_str_len = setup_buff(buff, new_string, BUFFER_SZ);
+                printf("Not Implemented\n");
+                break;   
+            }
+
+        default:
+            usage(argv[0]);
+            exit(1);
+    }
+
+    //TODO:  #6 Dont 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?
+//  
+//          PLACE YOUR ANSWER HERE
+
+// 
+
+// We need the pointer to access and modify the values in the address. 
+// Providing the length is a good practice since we sometimes need to
+// use the length (of the buffer and the user string) to make sure that
+// there is no buffer overflow or similiar errors appear in our function.
\ No newline at end of file
diff --git a/Hw2/test.sh b/Hw2/test.sh
new file mode 100644
index 0000000..f2b431b
--- /dev/null
+++ b/Hw2/test.sh
@@ -0,0 +1,100 @@
+#!/usr/bin/env bats
+
+@test "no args shows usage" {
+    run ./stringfun
+    [ "$status" -eq 1 ]
+    [ "${lines[0]}" = "usage: ./stringfun [-h|c|r|w|x] \"string\" [other args]" ]
+}
+
+@test "bad args shows usage" {
+    run ./stringfun -z "Bad arg usage"  
+    [ "$status" -eq 1 ]
+    [ "${lines[0]}" = "usage: ./stringfun [-h|c|r|w|x] \"string\" [other args]" ]
+}
+
+@test "check -h" {
+    run ./stringfun -h
+    [ "$status" -eq 0 ]
+    [ "${lines[0]}" = "usage: ./stringfun [-h|c|r|w|x] \"string\" [other args]" ]
+}
+
+@test "wordcount" {
+    run ./stringfun -c "There should be eight words in this sentence"
+    [ "$status" -eq 0 ]
+    [ "$output" = "Word Count: 8
+Buffer:  [There should be eight words in this sentence......]" ]
+}
+
+@test "remove extra spaces" {
+    run ./stringfun -c "   The   strange    spaces    should   be     removed   from this    "
+    [ "$status" -eq 0 ]
+    [ "$output" = "Word Count: 8
+Buffer:  [The strange spaces should be removed from this....]" ]
+}
+
+@test "reverse" {
+    run ./stringfun -r "Reversed sentences look very weird"
+    [ "$status" -eq 0 ]
+    [ "$output" = "Buffer:  [driew yrev kool secnetnes desreveR................]" ]
+}
+
+@test "print words" {
+    run ./stringfun -w "Lets get a lot of words to test"
+    [ "$status" -eq 0 ]
+    [ "$output" = "Word Print
+----------
+1. Lets(4)
+2. get(3)
+3. a(1)
+4. lot(3)
+5. of(2)
+6. words(5)
+7. to(2)
+8. test(4)
+
+Number of words returned: 8
+Buffer:  [Lets get a lot of words to test...................]" ]
+}
+
+@test "check max length" {
+    run ./stringfun -r "This is the maximum length string that should work"
+    [ "$status" -eq 0 ]
+    [ "$output" = "Buffer:  [krow dluohs taht gnirts htgnel mumixam eht si sihT]" ]
+}
+
+@test "check over max length" {
+    run ./stringfun -w "This is a string that does not work as it is too long"
+    [ "$status" -ne 0 ]
+}
+
+
+
+@test "basic string search replace" {
+    run ./stringfun -x "This is a bad test" bad  great
+    [ "$output" = "Buffer:  [This is a great test..............................]" ] ||
+    [ "$output" = "Not Implemented!" ]
+}
+
+@test "search replace not found" {
+    run ./stringfun -x "This is a a long string for testing" bad  great
+    [ "$status" -ne 0 ] || 
+    [ "$output" = "Not Implemented!" ]
+}
+
+@test "basic overflow search replace" {
+    run ./stringfun -x "This is a super long string for testing my program" testing  validating
+    [ "$output" = "Buffer:  [This is a super long string for validating my prog]" ] ||
+    [ "$output" = "Not Implemented!" ]
+}
+
+@test "test overflow string replace" {
+    run ./stringfun -x "This is a super long string for testing my program" testing  validating
+    [ "$output" = "Buffer:  [This is a super long string for validating my prog]" ] ||
+    [ "$output" = "Not Implemented!" ]
+}
+
+@test "test shorter string replace" {
+    run ./stringfun -x "This is a super long string for testing my program" program  app
+    [ "$output" = "Buffer:  [This is a super long string for testing my app....]" ] || 
+    [ "$output" = "Not Implemented!" ]
+}
-- 
GitLab