/* vim: set expandtab ts=4 sw=4: */
/*
* You may redistribute this program and/or modify it under the terms of
* the GNU General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#ifndef String_H
#define String_H
#include "benc/Object.h"
#include "memory/Allocator.h"
#include "util/platform/libc/strlen.h"
#include "util/Linker.h"
Linker_require("benc/String.c")
#include
/**
* Create a new bencoded string from a C null terminated string.
* This implementation will make a copy of the string into the memory provided by the allocator.
*
* @param bytes the beginning of a memory location containing the string to use.
* @param allocator a means of getting the memory to store the string object.
* @return a bencoded string.
*/
String* String_new(const char* bytes, struct Allocator* allocator);
/**
* Create a new bencoded constant string on the stack.
*/
#define String_CONST(x) (&(String) { .bytes = x, .len = strlen(x) })
/** For use outside of functions with compile time constant strings. */
#define String_CONST_SO(x) (&(String) { .bytes = x, .len = sizeof(x) - 1 })
#define String_OBJ(x) (&(Object) { .type = Object_STRING, .as.string = x })
/**
* Create a new bencoded string from a set of bytes.
* This implementation will make a copy of the string into the memory provided by the allocator.
*
* @param bytes the beginning of a memory location containing thre string to use.
if NULL then this will make a new string of null characters.
* @param length the number of bytes to use from the location.
* @param allocator a means of getting the memory to store the string object.
* @return a bencoded string.
*/
String* String_newBinary(const char* bytes, unsigned long length, struct Allocator* allocator);
#define String_clone(string, alloc) \
((string) ? String_newBinary(string->bytes, string->len, alloc) : NULL)
/**
* Create a new bencoded string from a format and arguments.
* EG: String_printf("this is on line number %d!", allocator, __LINE__);
*
* @param allocator a means of getting the memory to store the string object.
* @param format standard printf formatting.
* @params arguments to the printf() function.
* @return a bencoded string.
*/
String* String_printf(struct Allocator* allocator, const char* format, ...);
#ifdef va_start
/**
* Same as String_printf() except the arguments are passed as a va_list.
* Only enabled if stdarg.h is included before String.h.
*/
String* String_vprintf(struct Allocator* allocator, const char* format, va_list args);
#endif
/**
* Compare 2 bencoded strings.
* If the first differing character is numerically smaller for input a then
* a negative number is returned, if the first differing character is numerically
* smaller for input b then a positive number. If all characters in a and b are
* the same then the difference in length (a->len - b->len) is returned.
* If a is NULL and b is not NULL then a negative is returned, if b is NULL and a
* not NULL then a positive is returned, if both NULL then 0.
*
* @param a the first string to compare.
* @param b the second string to compare.
* @return the output from comparison, 0 if and only if they are equal.
*/
int String_compare(const String* a, const String* b);
/**
* Will return true if and only if the String_compare() would return 0.
*
* @param a the first string to compare.
* @param b the second string to compare.
* @return !(String_compare(a, b))
*/
int String_equals(const String* a, const String* b);
#endif