#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>
#include <ctype.h>
// Had to adjust macros a bit.
char * String_Utils_concat( char * string_one, char * string_two, int parameter) ;
char * String_Utils_set( char ** string_one, char * string_two, int parameter) ;
char * String_Utils_copy( char * string, int parameter) ;
void testString_Utils_concat( ) ;
#define NONE 1 << 0
#define MODIFY 1 << 1
#define DEBUG 1
#define DEBUG_PRINTF(MESSAGE, ...)(DEBUG ? fprintf(stderr, MESSAGE, __VA_ARGS__) : DEBUG)
#define VALIDATE_PTR(PTR, RETURN_VAL) do { if(PTR == NULL){ \
DEBUG_PRINTF("Error: %s == NULL\n", #PTR); return RETURN_VAL;}} while(0)
#define SELECTED(ARGUMENT, MACRO)((ARGUMENT & MACRO))
char * String_Utils_concat( char * string_one, char * string_two, int parameter) { // For this demonstration, MODIFY is passed
char * temp = NULL;
// Validate_PTR checks if pointer is null, and if so returns the second parameter, I.E NULL
VALIDATE_PTR( string_one, NULL) ;
VALIDATE_PTR( string_two, NULL) ;
// Allocate temporary string to size of two strings, + 1 for null terminator
// Zeroes the struct to clean it.
// Copies the first string to temp
// Concatenates string_two to temp
// Based on parameters below, will modify the original screen, or just return the new string.
if ( SELECTED( parameter, MODIFY) ) {
String_Utils_set( & string_one, temp, NONE) ; // The call to set. Passes address of the string
// Free temp as no longer needed.
return string_one; // Has to return something, may as well be the same string
} else return temp; // Not modifying the original string is the default, even if there was no valid parameter.
}
char * String_Utils_set( char ** string_one, char * string_two, int parameter) {
VALIDATE_PTR( string_one, NULL) ;
VALIDATE_PTR( * string_one, NULL) ; // Also checks if the string is null through the reference.
VALIDATE_PTR( string_two, NULL) ;
printf ( "Value of *string_one = %s\n Memory Address of *String_one = %p\n String_two = %s\n " , * string_one
, * string_one
, string_two
) ; char * temp_string_two = String_Utils_copy( string_two, parameter) ; // Copy returns a copy of the string modified with the parameter
// Frees the string. This WILL SEGFAULT if a normal string literal was passed.
* string_one
= malloc ( strlen ( temp_string_two
) + 1 ) ; // Allocates string_one. // Clears out the string
// Copy string_two into string_one
strcpy ( * string_one
, temp_string_two
) ; printf ( "Final result of *String_one = %s\n Final Memory Address of *String_one = %p\n " , * string_one
, * string_one
) ; return * string_one;
}
char * String_Utils_copy( char * string, int parameter) { // Returns a copy of the string modified if parameters are passed.
VALIDATE_PTR( string, NULL) ;
// Allocates a temporary string to hold copy of string
// The below will modify temp the appropriate parameter.
//if(SELECTED(parameter, LOWERCASE)) temp = String_Utils_to_lowercase(temp, MODIFY); // MODIFY parameter always results in calling set.
//if(SELECTED(parameter, UPPERCASE)) temp = String_Utils_to_uppercase(temp, MODIFY); // Comment these out if you want to run without it.
//if(SELECTED(parameter, REVERSE)) temp = String_Utils_reverse(temp, MODIFY);
return temp;
}
// The test portion
void testString_Utils_concat( ) {
char * string_one = "Hello " ;
char * string_two = "World" ;
char * string_three = String_Utils_copy( "" , NONE) ; // In order to change this value, a copy of the string is returned else SEGFAULT
printf ( "\n \n \n String_Three's value: %s\n String_Three's memory address: %p\n " , string_three
, string_three
) ; char * null_string = NULL;
int parameter_one = NONE;
int parameter_two = MODIFY;
char * result_one = String_Utils_concat( string_one, string_two, parameter_one) ;
char * result_two = String_Utils_concat( string_one, null_string, parameter_one) ;
String_Utils_concat( string_three, result_one, parameter_two) ; // Modifies string_three
printf ( "String_Three's value: %s\n String_Three's memory address: %p\n " , string_three
, string_three
) ;
if ( strcmp ( result_one
, "Hello World" ) != 0 ) { //assert(0);
}
if ( result_two
!= NULL
) assert ( 0 ) ; printf ( "Passed test: Concat!\n " ) ; //free(string_one);
//free(string_two);
}
int main( void ) {
testString_Utils_concat( ) ;
return 0 ;
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgovLyBIYWQgdG8gYWRqdXN0IG1hY3JvcyBhIGJpdC4KCmNoYXIgKlN0cmluZ19VdGlsc19jb25jYXQoY2hhciAqc3RyaW5nX29uZSwgY2hhciAqc3RyaW5nX3R3bywgaW50IHBhcmFtZXRlcik7CmNoYXIgKlN0cmluZ19VdGlsc19zZXQoY2hhciAqKnN0cmluZ19vbmUsIGNoYXIgKnN0cmluZ190d28sIGludCBwYXJhbWV0ZXIpOwpjaGFyICpTdHJpbmdfVXRpbHNfY29weShjaGFyICpzdHJpbmcsIGludCBwYXJhbWV0ZXIpOwp2b2lkIHRlc3RTdHJpbmdfVXRpbHNfY29uY2F0KCk7CgojZGVmaW5lIE5PTkUgMSA8PCAwCiNkZWZpbmUgTU9ESUZZIDEgPDwgMQojZGVmaW5lIERFQlVHIDEKI2RlZmluZSBERUJVR19QUklOVEYoTUVTU0FHRSwgLi4uKShERUJVRyA/IGZwcmludGYoc3RkZXJyLCBNRVNTQUdFLCBfX1ZBX0FSR1NfXykgOiBERUJVRykKI2RlZmluZSBWQUxJREFURV9QVFIoUFRSLCBSRVRVUk5fVkFMKSBkbyB7IGlmKFBUUiA9PSBOVUxMKXsgXAogICAgICAgIERFQlVHX1BSSU5URigiRXJyb3I6ICVzID09IE5VTExcbiIsICNQVFIpOyByZXR1cm4gUkVUVVJOX1ZBTDt9fSB3aGlsZSgwKQojZGVmaW5lIFNFTEVDVEVEKEFSR1VNRU5ULCBNQUNSTykoKEFSR1VNRU5UICYgTUFDUk8pKQoKCmNoYXIgKlN0cmluZ19VdGlsc19jb25jYXQoY2hhciAqc3RyaW5nX29uZSwgY2hhciAqc3RyaW5nX3R3bywgaW50IHBhcmFtZXRlcikgeyAvLyBGb3IgdGhpcyBkZW1vbnN0cmF0aW9uLCBNT0RJRlkgaXMgcGFzc2VkCiAgICBjaGFyICp0ZW1wID0gTlVMTDsKICAgIC8vIFZhbGlkYXRlX1BUUiBjaGVja3MgaWYgcG9pbnRlciBpcyBudWxsLCBhbmQgaWYgc28gcmV0dXJucyB0aGUgc2Vjb25kIHBhcmFtZXRlciwgSS5FIE5VTEwKICAgIFZBTElEQVRFX1BUUihzdHJpbmdfb25lLCBOVUxMKTsKICAgIFZBTElEQVRFX1BUUihzdHJpbmdfdHdvLCBOVUxMKTsKICAgIC8vIEFsbG9jYXRlIHRlbXBvcmFyeSBzdHJpbmcgdG8gc2l6ZSBvZiB0d28gc3RyaW5ncywgKyAxIGZvciBudWxsIHRlcm1pbmF0b3IKICAgIHRlbXAgPSBtYWxsb2Moc3RybGVuKHN0cmluZ19vbmUpICsgc3RybGVuKHN0cmluZ190d28pICsgMSk7CiAgICAvLyBaZXJvZXMgdGhlIHN0cnVjdCB0byBjbGVhbiBpdC4KICAgIG1lbXNldCh0ZW1wLCAwLCBzdHJsZW4oc3RyaW5nX29uZSkgKyBzdHJsZW4oc3RyaW5nX3R3bykgKyAxKTsKICAgIC8vIENvcGllcyB0aGUgZmlyc3Qgc3RyaW5nIHRvIHRlbXAKICAgIHN0cmNweSh0ZW1wLCBzdHJpbmdfb25lKTsKICAgIC8vIENvbmNhdGVuYXRlcyBzdHJpbmdfdHdvIHRvIHRlbXAKICAgIHN0cmNhdCh0ZW1wLCBzdHJpbmdfdHdvKTsKICAgIC8vIEJhc2VkIG9uIHBhcmFtZXRlcnMgYmVsb3csIHdpbGwgbW9kaWZ5IHRoZSBvcmlnaW5hbCBzY3JlZW4sIG9yIGp1c3QgcmV0dXJuIHRoZSBuZXcgc3RyaW5nLgogICAgaWYgKFNFTEVDVEVEKHBhcmFtZXRlciwgTU9ESUZZKSkgewogICAgICAgIFN0cmluZ19VdGlsc19zZXQoJnN0cmluZ19vbmUsIHRlbXAsIE5PTkUpOyAvLyBUaGUgY2FsbCB0byBzZXQuIFBhc3NlcyBhZGRyZXNzIG9mIHRoZSBzdHJpbmcKICAgICAgICAvLyBGcmVlIHRlbXAgYXMgbm8gbG9uZ2VyIG5lZWRlZC4KICAgICAgICBmcmVlKHRlbXApOwogICAgICAgIHJldHVybiBzdHJpbmdfb25lOyAvLyBIYXMgdG8gcmV0dXJuIHNvbWV0aGluZywgbWF5IGFzIHdlbGwgYmUgdGhlIHNhbWUgc3RyaW5nCiAgICB9IGVsc2UgcmV0dXJuIHRlbXA7IC8vIE5vdCBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIHN0cmluZyBpcyB0aGUgZGVmYXVsdCwgZXZlbiBpZiB0aGVyZSB3YXMgbm8gdmFsaWQgcGFyYW1ldGVyLgp9CgpjaGFyICpTdHJpbmdfVXRpbHNfc2V0KGNoYXIgKipzdHJpbmdfb25lLCBjaGFyICpzdHJpbmdfdHdvLCBpbnQgcGFyYW1ldGVyKSB7CiAgICBWQUxJREFURV9QVFIoc3RyaW5nX29uZSwgTlVMTCk7CiAgICBWQUxJREFURV9QVFIoKnN0cmluZ19vbmUsIE5VTEwpOyAvLyBBbHNvIGNoZWNrcyBpZiB0aGUgc3RyaW5nIGlzIG51bGwgdGhyb3VnaCB0aGUgcmVmZXJlbmNlLgogICAgVkFMSURBVEVfUFRSKHN0cmluZ190d28sIE5VTEwpOwogICAgcHJpbnRmKCJWYWx1ZSBvZiAqc3RyaW5nX29uZSA9ICVzXG5NZW1vcnkgQWRkcmVzcyBvZiAqU3RyaW5nX29uZSA9ICVwXG4gU3RyaW5nX3R3byA9ICVzXG4iLCAqc3RyaW5nX29uZSwgKnN0cmluZ19vbmUsIHN0cmluZ190d28pOwogICAgY2hhciAqdGVtcF9zdHJpbmdfdHdvID0gU3RyaW5nX1V0aWxzX2NvcHkoc3RyaW5nX3R3bywgcGFyYW1ldGVyKTsgLy8gQ29weSByZXR1cm5zIGEgY29weSBvZiB0aGUgc3RyaW5nIG1vZGlmaWVkIHdpdGggdGhlIHBhcmFtZXRlcgogICAgLy8gRnJlZXMgdGhlIHN0cmluZy4gVGhpcyBXSUxMIFNFR0ZBVUxUIGlmIGEgbm9ybWFsIHN0cmluZyBsaXRlcmFsIHdhcyBwYXNzZWQuCiAgICBmcmVlKCpzdHJpbmdfb25lKTsKICAgICpzdHJpbmdfb25lID0gbWFsbG9jKHN0cmxlbih0ZW1wX3N0cmluZ190d28pICsgMSk7IC8vIEFsbG9jYXRlcyBzdHJpbmdfb25lLiAKICAgIC8vIENsZWFycyBvdXQgdGhlIHN0cmluZwogICAgbWVtc2V0KCpzdHJpbmdfb25lLCAwICwgc3RybGVuKHRlbXBfc3RyaW5nX3R3bykrMSk7CiAgICAvLyBDb3B5IHN0cmluZ190d28gaW50byBzdHJpbmdfb25lCiAgICBzdHJjcHkoKnN0cmluZ19vbmUsIHRlbXBfc3RyaW5nX3R3byk7CiAgICBmcmVlKHRlbXBfc3RyaW5nX3R3byk7CiAgICBwcmludGYoIkZpbmFsIHJlc3VsdCBvZiAqU3RyaW5nX29uZSA9ICVzXG5GaW5hbCBNZW1vcnkgQWRkcmVzcyBvZiAqU3RyaW5nX29uZSA9ICVwXG4iLCAqc3RyaW5nX29uZSwgKnN0cmluZ19vbmUpOwogICAgcmV0dXJuICpzdHJpbmdfb25lOwp9CiAgIApjaGFyICpTdHJpbmdfVXRpbHNfY29weShjaGFyICpzdHJpbmcsIGludCBwYXJhbWV0ZXIpIHsgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIHN0cmluZyBtb2RpZmllZCBpZiBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQuCiAgICBWQUxJREFURV9QVFIoc3RyaW5nLCBOVUxMKTsKICAgIC8vIEFsbG9jYXRlcyBhIHRlbXBvcmFyeSBzdHJpbmcgdG8gaG9sZCBjb3B5IG9mIHN0cmluZwogICAgY2hhciAqdGVtcCA9IG1hbGxvYyhzdHJsZW4oc3RyaW5nKSArIDEpOwogICAgc3RyY3B5KHRlbXAsIHN0cmluZyk7CiAgICAvLyBUaGUgYmVsb3cgd2lsbCBtb2RpZnkgdGVtcCB0aGUgYXBwcm9wcmlhdGUgcGFyYW1ldGVyLgogICAgLy9pZihTRUxFQ1RFRChwYXJhbWV0ZXIsIExPV0VSQ0FTRSkpIHRlbXAgPSBTdHJpbmdfVXRpbHNfdG9fbG93ZXJjYXNlKHRlbXAsIE1PRElGWSk7IC8vIE1PRElGWSBwYXJhbWV0ZXIgYWx3YXlzIHJlc3VsdHMgaW4gY2FsbGluZyBzZXQuCiAgICAvL2lmKFNFTEVDVEVEKHBhcmFtZXRlciwgVVBQRVJDQVNFKSkgdGVtcCA9IFN0cmluZ19VdGlsc190b191cHBlcmNhc2UodGVtcCwgTU9ESUZZKTsgLy8gQ29tbWVudCB0aGVzZSBvdXQgaWYgeW91IHdhbnQgdG8gcnVuIHdpdGhvdXQgaXQuCiAgICAvL2lmKFNFTEVDVEVEKHBhcmFtZXRlciwgUkVWRVJTRSkpIHRlbXAgPSBTdHJpbmdfVXRpbHNfcmV2ZXJzZSh0ZW1wLCBNT0RJRlkpOwogICAgcmV0dXJuIHRlbXA7Cn0KCi8vIFRoZSB0ZXN0IHBvcnRpb24KCnZvaWQgdGVzdFN0cmluZ19VdGlsc19jb25jYXQoKSB7CiAgICBjaGFyKiBzdHJpbmdfb25lID0gIkhlbGxvICI7CiAgICBjaGFyKiBzdHJpbmdfdHdvID0gIldvcmxkIjsKICAgIGNoYXIgKnN0cmluZ190aHJlZSA9IFN0cmluZ19VdGlsc19jb3B5KCIiLCBOT05FKTsgLy8gSW4gb3JkZXIgdG8gY2hhbmdlIHRoaXMgdmFsdWUsIGEgY29weSBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkIGVsc2UgU0VHRkFVTFQKICAgIHByaW50ZigiXG5cblxuU3RyaW5nX1RocmVlJ3MgdmFsdWU6ICVzXG5TdHJpbmdfVGhyZWUncyBtZW1vcnkgYWRkcmVzczogJXBcbiIsIHN0cmluZ190aHJlZSwgc3RyaW5nX3RocmVlKTsKICAgIGNoYXIgKm51bGxfc3RyaW5nID0gTlVMTDsKICAgIGludCBwYXJhbWV0ZXJfb25lID0gTk9ORTsKICAgIGludCBwYXJhbWV0ZXJfdHdvID0gTU9ESUZZOwogICAgY2hhciogcmVzdWx0X29uZSA9IFN0cmluZ19VdGlsc19jb25jYXQoc3RyaW5nX29uZSwgc3RyaW5nX3R3bywgcGFyYW1ldGVyX29uZSk7CiAgICBjaGFyICpyZXN1bHRfdHdvID0gU3RyaW5nX1V0aWxzX2NvbmNhdChzdHJpbmdfb25lLCBudWxsX3N0cmluZywgcGFyYW1ldGVyX29uZSk7CiAgICBTdHJpbmdfVXRpbHNfY29uY2F0KHN0cmluZ190aHJlZSwgcmVzdWx0X29uZSwgcGFyYW1ldGVyX3R3byk7IC8vIE1vZGlmaWVzIHN0cmluZ190aHJlZQogICAgcHJpbnRmKCJTdHJpbmdfVGhyZWUncyB2YWx1ZTogJXNcblN0cmluZ19UaHJlZSdzIG1lbW9yeSBhZGRyZXNzOiAlcFxuIiwgc3RyaW5nX3RocmVlLCBzdHJpbmdfdGhyZWUpOwogICAgCiAgICBpZiAoc3RyY21wKHJlc3VsdF9vbmUsICJIZWxsbyBXb3JsZCIpICE9IDApIHsKICAgICAgIC8vYXNzZXJ0KDApOwogICAgfQogICAgaWYocmVzdWx0X3R3byAhPSBOVUxMKSBhc3NlcnQoMCk7CiAgICBpZihzdHJjbXAocmVzdWx0X29uZSwgc3RyaW5nX3RocmVlKSAhPSAwKSBhc3NlcnQoMCk7CiAgICBwcmludGYoIlBhc3NlZCB0ZXN0OiBDb25jYXQhXG4iKTsKICAgIC8vZnJlZShzdHJpbmdfb25lKTsKICAgIC8vZnJlZShzdHJpbmdfdHdvKTsKICAgIGZyZWUoc3RyaW5nX3RocmVlKTsKICAgIGZyZWUocmVzdWx0X29uZSk7CiAgICBmcmVlKHJlc3VsdF90d28pOwp9CgppbnQgbWFpbih2b2lkKXsKCXRlc3RTdHJpbmdfVXRpbHNfY29uY2F0KCk7CglyZXR1cm4gMDsKfQ==