#include <rudiments/charstring.h>
#include <rudiments/stdio.h>

int main(int argc, const char **argv) {

        char            buffer[32];


        // zero the buffer
        charstring::zero(buffer,sizeof(buffer));


        // append strings, integers and floats
        charstring::append(buffer,"Hello ");
        charstring::append(buffer,"there!",6);
        charstring::append(buffer," ");
        charstring::append(buffer,(uint64_t)1);
        charstring::append(buffer,(uint64_t)2);
        charstring::append(buffer,(uint64_t)3);
        charstring::append(buffer," ");
        charstring::append(buffer,1.234,4,3);
        stdoutput.printf("buffer: %s\n",buffer);
        stdoutput.write('\n');


        // get length
        stdoutput.printf("length(buffer)=%d\n",charstring::length(buffer));
        stdoutput.write('\n');


        // zero the buffer again
        charstring::zero(buffer,sizeof(buffer));


        // copy to the beginning of the buffer
        charstring::copy(buffer,"Hello!");
        stdoutput.printf("buffer: %s\n",buffer);


        // copy the specified number of bytes to the beginning of the buffer
        charstring::copy(buffer,"Hello again!",6);
        stdoutput.printf("buffer: %s\n",buffer);


        // copy to the specified offset
        charstring::copy(buffer,6,"again!");
        stdoutput.printf("buffer: %s\n",buffer);


        // copy the specified number of bytes to the specified offset
        charstring::copy(buffer,12," Hi!  blah blah blah",4);
        stdoutput.printf("buffer: %s\n",buffer);
        stdoutput.write('\n');


        // get length
        stdoutput.printf("length(buffer)=%d\n",charstring::length(buffer));
        stdoutput.write('\n');


        // zero the buffer again
        charstring::zero(buffer,sizeof(buffer));


        // safely copy a long string to a smaller buffer
        charstring::safeCopy(buffer,sizeof(buffer),
                                "This string is longer than the buffer");
        stdoutput.printf("buffer: %.*s\n",sizeof(buffer),buffer);


        // safely copy the specified number of bytes of a
        // long string to a smaller buffer
        charstring::safeCopy(buffer,sizeof(buffer),
                                "This string is longer than the buffer",36);
        stdoutput.printf("buffer: %.*s\n",sizeof(buffer),buffer);
        stdoutput.write('\n');


        // get length
        stdoutput.printf("length(buffer)=%d\n",charstring::length(buffer));
        stdoutput.write('\n');


        // zero the buffer again
        charstring::zero(buffer,sizeof(buffer));


        // print formatted data to the buffer
        charstring::printf(buffer,sizeof(buffer),"%s%05d%7.4f",
                                                "hello",100,123.4567);
        stdoutput.printf("buffer: %s\n",buffer);
        stdoutput.write('\n');


        // get length
        stdoutput.printf("length(buffer)=%d\n",charstring::length(buffer));
        stdoutput.write('\n');


        // duplicate a string
        char    *completedup=charstring::duplicate("Hello there!");
        char    *partialdup=charstring::duplicate("Hello there!",5);
        stdoutput.printf("complete duplicate of \"Hello there!\"\"%s\"\n",
                                                                completedup);
        stdoutput.printf(" partial duplicate of \"Hello there!\"\"%s\"\n",
                                                                partialdup);
        delete[] completedup;
        delete[] partialdup;
}