Objectively
Ultra-lightweight object oriented framework for GNU C.
Loading...
Searching...
No Matches
String Struct Reference

#include <String.h>

Overview

UTF-8 strings.

Remarks
Because Strings are encoded using UTF-8, they must not be treated as ASCII C strings. That is, a single Unicode code point will often span multiple chars. Be mindful of this when executing Range operations.
Strings are locale-ready, but Objectively does not enable locale by default. Call setlocale to enable localization.

Definition at line 69 of file String.h.

Inheritance diagram for String:
Object

Properties

char * chars
 The backing null-terminated UTF-8 encoded character array.
 
size_t length
 The length of the String in bytes.
 
Object object
 The superclass.
 
- Properties inherited from Object
Classclazz
 Every instance of Object begins with a pointer to its Class.
 
unsigned int magic
 A header to allow introspection of Object types.
 

Methods

Class_String (void)
 The String archetype.
 
void appendBytes (String *self, const uint8_t *bytes, size_t length, StringEncoding encoding)
 Appends the decoded contents of bytes.
 
void appendCharacters (String *self, const char *chars)
 Appends the specified UTF-8 encoded C string.
 
void appendFormat (String *self, const char *fmt,...)
 Appends the specified formatted string.
 
void appendString (String *self, const String *string)
 Appends the specified String to this String.
 
void appendVaList (String *self, const char *fmt, va_list args)
 Appends the specified format string.
 
Order compareTo (const String *self, const String *other, const Range range)
 Compares this String lexicographically to another.
 
ArraycomponentsSeparatedByCharacters (const String *self, const char *chars)
 Returns the components of this String that were separated by chars.
 
ArraycomponentsSeparatedByString (const String *self, const String *string)
 Returns the components of this String that were separated by string.
 
void deleteCharactersInRange (String *self, const Range range)
 Deletes the characters within range from this String.
 
DatagetData (const String *self, StringEncoding encoding)
 Returns a Data with this String's contents in the given encoding.
 
bool hasPrefix (const String *self, const String *prefix)
 Checks this String for the given prefix.
 
bool hasSuffix (const String *self, const String *suffix)
 Checks this String for the given suffix.
 
Stringinit (String *self)
 Initializes this String.
 
StringinitWithBytes (String *self, const uint8_t *bytes, size_t length, StringEncoding encoding)
 Initializes this String by decoding length of bytes.
 
StringinitWithCapacity (String *self, size_t capacity)
 Initializes this String with the given capacity.
 
StringinitWithCharacters (String *self, const char *chars)
 Initializes this String by copying chars.
 
StringinitWithContentsOfFile (String *self, const char *path, StringEncoding encoding)
 Initializes this String with the contents of the FILE at path.
 
StringinitWithData (String *self, const Data *data, StringEncoding encoding)
 Initializes this String with the given Data.
 
StringinitWithFormat (String *self, const char *fmt,...)
 Initializes this String with the specified format string.
 
StringinitWithMemory (String *self, const ident mem, size_t length)
 Initializes this String with the specified buffer.
 
StringinitWithString (String *self, const String *string)
 Initializes this String with the contents of string.
 
StringinitWithVaList (String *self, const char *fmt, va_list args)
 Initializes this String with the specified arguments list.
 
void insertCharactersAtIndex (String *self, const char *chars, size_t index)
 Inserts the specified String at the given index.
 
void insertStringAtIndex (String *self, const String *string, size_t index)
 Inserts the specified String at the given index.
 
StringlowercaseString (const String *self)
 
Range rangeOfCharacters (const String *self, const char *chars, const Range range)
 Finds and returns the first occurrence of chars in this String.
 
Range rangeOfString (const String *self, const String *string, const Range range)
 Finds and returns the first occurrence of string in this String.
 
void replaceCharactersInRange (String *self, const Range range, const char *chars)
 Replaces the characters in range with the given characters.
 
void replaceOccurrencesOfCharacters (String *self, const char *chars, const char *replacement)
 Replaces all occurrences of chars with the given replacement.
 
void replaceOccurrencesOfCharactersInRange (String *self, const char *chars, const Range range, const char *replacement)
 Replaces occurrences of chars in range with the given replacement.
 
void replaceOccurrencesOfString (String *self, const String *string, const String *replacement)
 Replaces all occurrences of string with the given replacement.
 
void replaceOccurrencesOfStringInRange (String *self, const String *string, const Range range, const String *replacement)
 Replaces occurrences of string in range with the given replacement.
 
void replaceStringInRange (String *self, const Range range, const String *string)
 Replaces the characters in range with the contents of string.
 
void setCharacters (String *self, const char *chars)
 Sets the contents of this String to chars.
 
void setFormat (String *self, const char *fmt)
 Sets the contents of this String to the formatted string.
 
void setFormat (String *self, const char *fmt,...)
 
void setLength (String *self, size_t length)
 Sets the length of this String to length.
 
void setString (String *self, const String *string)
 Sets the contents of this String to that of string.
 
Stringstring (void)
 Returns a new String.
 
StringstringWithBytes (const uint8_t *bytes, size_t length, StringEncoding encoding)
 Returns a new String by decoding length of bytes to UTF-8.
 
StringstringWithCapacity (size_t capacity)
 Returns a new String with the given capacity.
 
StringstringWithCharacters (const char *chars)
 Returns a new String by copying chars.
 
StringstringWithContentsOfFile (const char *path, StringEncoding encoding)
 Returns a new String with the contents of the FILE at path.
 
StringstringWithData (const Data *data, StringEncoding encoding)
 Returns a new String with the the given Data.
 
StringstringWithFormat (const char *fmt)
 Returns a new String with the given format string.
 
StringstringWithMemory (const ident mem, size_t length)
 Returns a new String with the given buffer.
 
Stringsubstring (const String *string, const Range range)
 Creates a new String from a subset of this one.
 
void trim (String *self)
 Trims leading and trailing whitespace from this String.
 
StringtrimmedString (const String *self)
 Creates a copy of this String with leading and trailing whitespace removed.
 
StringuppercaseString (const String *self)
 
bool writeToFile (const String *self, const char *path, StringEncoding encoding)
 Writes this String to path.
 
- Methods inherited from Object
Class_Object (void)
 The Object archetype.
 
Objectcopy (const Object *self)
 Creates a shallow copy of this Object.
 
void dealloc (Object *self)
 Frees all resources held by this Object.
 
Stringdescription (const Object *self)
 
int hash (const Object *self)
 
Objectinit (Object *self)
 Initializes this Object.
 
bool isEqual (const Object *self, const Object *other)
 Tests equality of the other Object.
 
bool isKindOfClass (const Object *self, const Class *clazz)
 Tests for Class hierarchy membership.
 

Protected Attributes

StringInterface * interface
 The interface.
 
- Protected Attributes inherited from Object
ObjectInterface * interface
 The interface.
 

Related Symbols

OBJECTIVELY_EXPORT const char * NameForStringEncoding (StringEncoding encoding)
 
OBJECTIVELY_EXPORT Stringstr (const char *fmt,...)
 A convenience function for instantiating Strings.
 
OBJECTIVELY_EXPORT Order StringCompare (const ident a, const ident b)
 A Comparator for sorting Strings.
 
OBJECTIVELY_EXPORT StringEncoding StringEncodingForName (const char *name)
 

Property Details

◆ chars

char* String::chars

The backing null-terminated UTF-8 encoded character array.

Definition at line 85 of file String.h.

◆ interface

StringInterface* String::interface
protected

The interface.

Definition at line 80 of file String.h.

◆ length

size_t String::length

The length of the String in bytes.

Definition at line 90 of file String.h.

◆ object

Object String::object

The superclass.

Definition at line 74 of file String.h.

Method Details

◆ _String()

Class * _String ( void  )

The String archetype.

Returns
The String Class.

Definition at line 999 of file String.c.

999 {
1000 static Class *clazz;
1001 static Once once;
1002
1003 do_once(&once, {
1004 clazz = _initialize(&(const ClassDef) {
1005 .name = "String",
1006 .superclass = _Object(),
1007 .instanceSize = sizeof(String),
1008 .interfaceOffset = offsetof(String, interface),
1009 .interfaceSize = sizeof(StringInterface),
1011 });
1012 });
1013
1014 return clazz;
1015}
static void initialize(Class *clazz)
Definition Array.c:710
Class * _initialize(const ClassDef *def)
Initializes the given Class.
Definition Class.c:86
long Once
The Once type.
Definition Once.h:37
#define do_once(once, block)
Executes the given block at most one time.
Definition Once.h:43
ClassDefs are passed to _initialize via an archetype to initialize a Class.
Definition Class.h:41
The runtime representation of a Class.
Definition Class.h:95
Class * clazz
Every instance of Object begins with a pointer to its Class.
Definition Object.h:55
Class * _Object(void)
The Object archetype.
Definition Object.c:136
UTF-8 strings.
Definition String.h:69
StringInterface * interface
The interface.
Definition String.h:80

◆ appendBytes()

void appendBytes ( String self,
const uint8_t *  bytes,
size_t  length,
StringEncoding  encoding 
)

Appends the decoded contents of bytes.

Parameters
selfThe String.
bytesThe bytes.
lengthThe length of bytes to decode.
encodingThe character encoding.

Definition at line 476 of file String.c.

476 {
477
478 if (bytes) {
479
480 Transcode trans = {
482 .from = encoding,
483 .in = (char *) bytes,
484 .length = length,
485 .out = calloc(length * sizeof(Unicode) + 1, sizeof(char)),
486 .size = length * sizeof(Unicode) + 1
487 };
488
489 assert(trans.out);
490
491 const size_t size = transcode(&trans);
492 assert(size < trans.size);
493
494 trans.out[size] = '\0';
495
496 $(self, appendCharacters, trans.out);
497
498 free(trans.out);
499 }
500}
static size_t transcode(Transcode *trans)
Transcodes input from one character encoding to another via iconv.
Definition String.c:131
@ STRING_ENCODING_UTF8
Definition String.h:53
wchar_t Unicode
The Unicode type.
Definition String.h:41
size_t length
The length of the String in bytes.
Definition String.h:90
void appendCharacters(String *self, const char *chars)
Appends the specified UTF-8 encoded C string.
Definition String.c:506
Character transcoding context for iconv.
Definition String.c:117
char * out
Definition String.c:122
size_t size
Definition String.c:123
StringEncoding to
Definition String.c:118

◆ appendCharacters()

void appendCharacters ( String self,
const char *  chars 
)

Appends the specified UTF-8 encoded C string.

Parameters
selfThe String.
charsA UTF-encoded C string.

Definition at line 506 of file String.c.

506 {
507
508 if (chars) {
509
510 const size_t len = strlen(chars);
511 if (len) {
512
513 const size_t newSize = self->length + strlen(chars) + 1;
514 const size_t newCapacity = (newSize / _pageSize + 1) * _pageSize;
515
516 if (newCapacity > self->capacity) {
517
518 if (self->length) {
519 self->chars = realloc(self->chars, newCapacity);
520 } else {
521 self->chars = malloc(newCapacity);
522 }
523
524 assert(self->chars);
525 self->capacity = newCapacity;
526 }
527
528 ident ptr = self->chars + self->length;
529 memmove(ptr, chars, len);
530
531 self->chars[newSize - 1] = '\0';
532 self->length += len;
533 }
534 }
535}
size_t _pageSize
Definition Class.c:39
Pointer * ptr(ident pointer, Consumer destroy)
Definition Pointer.c:157
void * ident
The identity type, similar to Objective-C id.
Definition Types.h:49
char * chars
The backing null-terminated UTF-8 encoded character array.
Definition String.h:85

◆ appendFormat()

void appendFormat ( String self,
const char *  fmt,
  ... 
)

Appends the specified formatted string.

Parameters
selfThe String.
fmtThe format string.

Definition at line 541 of file String.c.

541 {
542
543 va_list args;
544 va_start(args, fmt);
545
546 $(self, appendVaList, fmt, args);
547
548 va_end(args);
549}
void appendVaList(String *self, const char *fmt, va_list args)
Appends the specified format string.
Definition String.c:566

◆ appendString()

void appendString ( String self,
const String string 
)

Appends the specified String to this String.

Parameters
selfThe String.
stringThe String to append.

Definition at line 555 of file String.c.

555 {
556
557 if (string) {
558 $(self, appendCharacters, string->chars);
559 }
560}
String * string(void)
Returns a new String.
Definition String.c:905

◆ appendVaList()

void appendVaList ( String self,
const char *  fmt,
va_list  args 
)

Appends the specified format string.

Parameters
selfThe String.
fmtThe format string.
argsThe format arguments.

Definition at line 566 of file String.c.

566 {
567 char *chars;
568
569 const int len = vasprintf(&chars, fmt, args);
570 if (len > 0) {
571 $(self, appendCharacters, chars);
572 }
573
574 free(chars);
575}

◆ compareTo()

Order compareTo ( const String self,
const String other,
const Range  range 
)

Compares this String lexicographically to another.

Parameters
selfThe String.
otherThe String to compare to.
rangeThe character Range to compare.
Returns
The ordering of this String compared to other.

Definition at line 161 of file String.c.

161 {
162
163 assert(range.location + range.length <= self->length);
164
165 if (other) {
166 const int i = strncmp(self->chars + range.location, other->chars, range.length);
167 if (i == 0) {
168 return OrderSame;
169 }
170 if (i > 0) {
171 return OrderDescending;
172 }
173 }
174
175 return OrderAscending;
176}
@ OrderSame
Definition Types.h:72
@ OrderDescending
Definition Types.h:73
@ OrderAscending
Definition Types.h:71
ssize_t location
The location.
Definition Types.h:59
size_t length
The length.
Definition Types.h:64

◆ componentsSeparatedByCharacters()

Array * componentsSeparatedByCharacters ( const String self,
const char *  chars 
)

Returns the components of this String that were separated by chars.

Parameters
selfThe String.
charsThe separating characters.
Returns
An Array of substrings that were separated by chars.

Definition at line 182 of file String.c.

182 {
183
184 assert(chars);
185
186 Array *components = $(alloc(Array), init);
187
188 Range search = { 0, self->length };
189 Range result = $(self, rangeOfCharacters, chars, search);
190
191 while (result.length) {
192 search.length = result.location - search.location;
193
194 String *component = $(self, substring, search);
195 $(components, addObject, component);
196 release(component);
197
198 search.location = result.location + result.length;
199 search.length = self->length - search.location;
200
201 result = $(self, rangeOfCharacters, chars, search);
202 }
203
204 String *component = $(self, substring, search);
205 $(components, addObject, component);
206 release(component);
207
208 return components;
209}
static void addObject(Array *self, const ident obj)
Definition Array.c:181
ident release(ident obj)
Atomically decrement the given Object's reference count. If the resulting reference count is 0,...
Definition Class.c:195
#define alloc(type)
Allocate and initialize and instance of type.
Definition Class.h:176
Arrays.
Definition Array.h:56
A location and length into contiguous collections.
Definition Types.h:54
String * substring(const String *string, const Range range)
Creates a new String from a subset of this one.
Definition String.c:401
Range rangeOfCharacters(const String *self, const char *chars, const Range range)
Finds and returns the first occurrence of chars in this String.
Definition String.c:303
String * init(String *self)
Initializes this String.
Definition String.c:598

◆ componentsSeparatedByString()

Array * componentsSeparatedByString ( const String self,
const String string 
)

Returns the components of this String that were separated by string.

Parameters
selfThe String.
stringThe separating String.
Returns
An Array of substrings that were separated by string.

Definition at line 215 of file String.c.

215 {
216
217 assert(string);
218
220}
Array * componentsSeparatedByCharacters(const String *self, const char *chars)
Returns the components of this String that were separated by chars.
Definition String.c:182

◆ deleteCharactersInRange()

void deleteCharactersInRange ( String self,
const Range  range 
)

Deletes the characters within range from this String.

Parameters
selfThe String.
rangeThe Range of characters to delete.

Definition at line 581 of file String.c.

581 {
582
583 assert(range.location >= 0);
584 assert(range.length <= self->length);
585
586 ident ptr = self->chars + range.location;
587 const size_t length = self->length - range.location - range.length + 1;
588
589 memmove(ptr, ptr + range.length, length);
590
591 self->length -= range.length;
592}

◆ getData()

Data * getData ( const String self,
StringEncoding  encoding 
)

Returns a Data with this String's contents in the given encoding.

Parameters
selfThe String.
encodingThe desired StringEncoding.
Returns
A Data with this String's contents in the given encoding.

Definition at line 226 of file String.c.

226 {
227
228 Transcode trans = {
229 .to = encoding,
230 .from = STRING_ENCODING_UTF8,
231 .in = self->chars,
232 .length = self->length,
233 .out = calloc(self->length, sizeof(Unicode) / sizeof(char)),
234 .size = self->length * sizeof(Unicode)
235 };
236
237 assert(trans.out);
238
239 const size_t size = transcode(&trans);
240 assert(size <= trans.size);
241
242 return $$(Data, dataWithMemory, trans.out, size);
243}
static Data * dataWithMemory(ident mem, size_t length)
Definition Data.c:142
Data buffers.
Definition Data.h:50

◆ hasPrefix()

bool hasPrefix ( const String self,
const String prefix 
)

Checks this String for the given prefix.

Parameters
selfThe String.
prefixThe Prefix to check.
Returns
True if this String starts with prefix, false otherwise.

Definition at line 249 of file String.c.

249 {
250
251 if (prefix->length > self->length) {
252 return false;
253 }
254
255 Range range = { 0, prefix->length };
256 return $(self, compareTo, prefix, range) == OrderSame;
257}
Order compareTo(const String *self, const String *other, const Range range)
Compares this String lexicographically to another.
Definition String.c:161

◆ hasSuffix()

bool hasSuffix ( const String self,
const String suffix 
)

Checks this String for the given suffix.

Parameters
selfThe String.
suffixThe suffix to check.
Returns
True if this String ends with suffix, false otherwise.

Definition at line 263 of file String.c.

263 {
264
265 if (suffix->length > self->length) {
266 return false;
267 }
268
269 Range range = { self->length - suffix->length, suffix->length };
270 return $(self, compareTo, suffix, range) == OrderSame;
271}

◆ init()

String * init ( String self)

Initializes this String.

Parameters
selfThe String.
Returns
The initialized String, or NULL on error.

Definition at line 598 of file String.c.

598 {
599 return $(self, initWithCapacity, 0);
600}
String * initWithCapacity(String *self, size_t capacity)
Initializes this String with the given capacity.
Definition String.c:620

◆ initWithBytes()

String * initWithBytes ( String self,
const uint8_t *  bytes,
size_t  length,
StringEncoding  encoding 
)

Initializes this String by decoding length of bytes.

Parameters
selfThe String.
bytesThe bytes.
lengthThe length of bytes to decode.
encodingThe character encoding.
Returns
The initialized String, or NULL on error.

Definition at line 606 of file String.c.

606 {
607
608 self = $(self, init);
609 if (self) {
610 $(self, appendBytes, bytes, length, encoding);
611 }
612
613 return self;
614}
void appendBytes(String *self, const uint8_t *bytes, size_t length, StringEncoding encoding)
Appends the decoded contents of bytes.
Definition String.c:476

◆ initWithCapacity()

String * initWithCapacity ( String self,
size_t  capacity 
)

Initializes this String with the given capacity.

Parameters
selfThe String.
capacityThe capacity, in bytes.
Returns
The initialized String, or NULL on error.

Definition at line 620 of file String.c.

620 {
621
622 self = $(self, initWithMemory, NULL, 0);
623 if (self) {
624 self->capacity = capacity;
625 if (self->capacity) {
626 self->chars = calloc(self->capacity, sizeof(char));
627 assert(self->chars);
628 }
629 }
630
631 return self;
632}
String * initWithMemory(String *self, const ident mem, size_t length)
Initializes this String with the specified buffer.
Definition String.c:700

◆ initWithCharacters()

String * initWithCharacters ( String self,
const char *  chars 
)

Initializes this String by copying chars.

Parameters
selfThe String.
charsThe null-terminated, UTF-8 encoded C string.
Returns
The initialized String, or NULL on error.

Definition at line 638 of file String.c.

638 {
639
640 self = $(self, init);
641 if (self) {
642 $(self, appendCharacters, chars);
643 }
644
645 return self;
646}

◆ initWithContentsOfFile()

String * initWithContentsOfFile ( String self,
const char *  path,
StringEncoding  encoding 
)

Initializes this String with the contents of the FILE at path.

Parameters
selfThe String.
pathThe path of the file to load.
encodingThe character encoding.
Returns
The initialized String, or NULL on error.

Definition at line 652 of file String.c.

652 {
653
654 Data *data = $$(Data, dataWithContentsOfFile, path);
655 if (data) {
656 self = $(self, initWithData, data, encoding);
657 } else {
658 self = $(self, init);
659 }
660
661 release(data);
662 return self;
663}
static Data * data(void)
Definition Data.c:286
static Data * dataWithContentsOfFile(const char *path)
Definition Data.c:133
String * initWithData(String *self, const Data *data, StringEncoding encoding)
Initializes this String with the given Data.
Definition String.c:669

◆ initWithData()

String * initWithData ( String self,
const Data data,
StringEncoding  encoding 
)

Initializes this String with the given Data.

Parameters
selfThe String.
dataThe Data object.
encodingThe character encoding.
Returns
The initialized String, or NULL on error.

Definition at line 669 of file String.c.

669 {
670
671 assert(data);
672
673 return $(self, initWithBytes, data->bytes, data->length, encoding);
674}
size_t length
The length of bytes.
Definition Data.h:76
uint8_t * bytes
The bytes.
Definition Data.h:66
String * initWithBytes(String *self, const uint8_t *bytes, size_t length, StringEncoding encoding)
Initializes this String by decoding length of bytes.
Definition String.c:606

◆ initWithFormat()

String * initWithFormat ( String self,
const char *  fmt,
  ... 
)

Initializes this String with the specified format string.

Parameters
selfThe String.
fmtThe format string.
Returns
The initialized String, or NULL on error.

Definition at line 680 of file String.c.

680 {
681
682 self = $(self, init);
683 if (self) {
684
685 va_list args;
686 va_start(args, fmt);
687
688 $(self, appendVaList, fmt, args);
689
690 va_end(args);
691 }
692
693 return self;
694}

◆ initWithMemory()

String * initWithMemory ( String self,
const ident  mem,
size_t  length 
)

Initializes this String with the specified buffer.

Parameters
selfThe String.
memThe dynamically allocated null-terminated, UTF-8 encoded buffer.
lengthThe length of mem in printable characters.
Returns
The initialized String, or NULL on error.
Remarks
The memory will be freed when this String is deallocated.

Definition at line 700 of file String.c.

700 {
701
702 self = (String *) super(Object, self, init);
703 if (self) {
704 self->chars = (char *) mem;
705 self->length = length;
706 self->capacity = self->chars ? length + 1 : 0;
707 }
708
709 return self;
710}
#define super(type, obj, method,...)
Object is the root Class of The Objectively Class hierarchy.
Definition Object.h:46

◆ initWithString()

String * initWithString ( String self,
const String string 
)

Initializes this String with the contents of string.

Parameters
selfThe String.
stringA String.
Returns
The initialized String, or NULL on error.

Definition at line 716 of file String.c.

716 {
717
718 self = $(self, init);
719 if (self) {
720 $(self, appendString, string);
721 }
722
723 return self;
724}
void appendString(String *self, const String *string)
Appends the specified String to this String.
Definition String.c:555

◆ initWithVaList()

String * initWithVaList ( String self,
const char *  fmt,
va_list  args 
)

Initializes this String with the specified arguments list.

Parameters
selfThe String.
fmtThe format string.
argsThe format arguments.
Returns
The initialized String, or NULL on error.
See also
vasprintf(3)

Definition at line 730 of file String.c.

730 {
731
732 self = $(self, init);
733 if (self) {
734 $(self, appendVaList, fmt, args);
735 }
736
737 return self;
738}

◆ insertCharactersAtIndex()

void insertCharactersAtIndex ( String self,
const char *  chars,
size_t  index 
)

Inserts the specified String at the given index.

Parameters
selfThe String.
charsThe null-terminated UTF-8 encoded C string to insert.
indexThe index.

Definition at line 744 of file String.c.

744 {
745
746 const Range range = { .location = index };
747
748 $(self, replaceCharactersInRange, range, chars);
749}
void replaceCharactersInRange(String *self, const Range range, const char *chars)
Replaces the characters in range with the given characters.
Definition String.c:764

◆ insertStringAtIndex()

void insertStringAtIndex ( String self,
const String string,
size_t  index 
)

Inserts the specified String at the given index.

Parameters
selfThe String.
stringThe String to insert.
indexThe index.

Definition at line 755 of file String.c.

755 {
756
757 $(self, insertCharactersAtIndex, string->chars, index);
758}
void insertCharactersAtIndex(String *self, const char *chars, size_t index)
Inserts the specified String at the given index.
Definition String.c:744

◆ lowercaseString()

String * lowercaseString ( const String self)
Parameters
selfThe String.
Returns
A lowercase representation of this String.

Definition at line 281 of file String.c.

281 {
282
284 assert(data);
285
286 const size_t codepoints = data->length / sizeof(Unicode);
287 Unicode *unicode = (Unicode *) data->bytes;
288
289 for (size_t i = 0; i < codepoints; i++, unicode++) {
290 *unicode = towlower(*unicode);
291 }
292
294
295 release(data);
296 return lowercase;
297}
@ STRING_ENCODING_WCHAR
Definition String.h:54
String * stringWithData(const Data *data, StringEncoding encoding)
Returns a new String with the the given Data.
Definition String.c:367
Data * getData(const String *self, StringEncoding encoding)
Returns a Data with this String's contents in the given encoding.
Definition String.c:226

◆ rangeOfCharacters()

Range rangeOfCharacters ( const String self,
const char *  chars,
const Range  range 
)

Finds and returns the first occurrence of chars in this String.

Parameters
selfThe String.
charsThe characters to search for.
rangeThe Range in which to search.
Returns
A Range specifying the first occurrence of chars in this String.

Definition at line 303 of file String.c.

303 {
304
305 assert(chars);
306 assert(range.location > -1);
307 assert(range.length > 0);
308 assert(range.location + range.length <= self->length);
309
310 Range match = { -1, 0 };
311 const size_t len = strlen(chars);
312
313 const char *str = self->chars + range.location;
314 for (size_t i = 0; i < range.length; i++, str++) {
315 if (strncmp(str, chars, len) == 0) {
316 match.location = range.location + i;
317 match.length = len;
318 break;
319 }
320 }
321
322 return match;
323}
OBJECTIVELY_EXPORT String * str(const char *fmt,...)
A convenience function for instantiating Strings.
Definition String.c:1084

◆ rangeOfString()

Range rangeOfString ( const String self,
const String string,
const Range  range 
)

Finds and returns the first occurrence of string in this String.

Parameters
selfThe String.
stringThe String to search for.
rangeThe Range in which to search.
Returns
A Range specifying the first occurrence of string in this String.

Definition at line 329 of file String.c.

329 {
330
331 assert(string);
332
333 return $(self, rangeOfCharacters, string->chars, range);
334}

◆ replaceCharactersInRange()

void replaceCharactersInRange ( String self,
const Range  range,
const char *  chars 
)

Replaces the characters in range with the given characters.

Parameters
selfThe String.
rangeThe Range of characters to replace.
charsThe null-terminated UTF-8 encoded C string to substitute.

Definition at line 764 of file String.c.

764 {
765
766 assert(range.location >= 0);
767 assert(range.location + range.length <= self->length);
768
769 if (self->capacity == 0) {
770 $(self, appendCharacters, chars);
771 } else {
772 char *remainder = strdup(self->chars + range.location + range.length);
773
774 self->length = range.location;
775 self->chars[range.location + 1] = '\0';
776
777 $(self, appendCharacters, chars);
778 $(self, appendCharacters, remainder);
779
780 free(remainder);
781 }
782}

◆ replaceOccurrencesOfCharacters()

void replaceOccurrencesOfCharacters ( String self,
const char *  chars,
const char *  replacement 
)

Replaces all occurrences of chars with the given replacement.

Parameters
selfThe String.
charsThe null-terminated UTF-8 encoded C string to replace.
replacementThe null-terminated UTF-8 encoded C string replacement.

Definition at line 788 of file String.c.

788 {
789 $(self, replaceOccurrencesOfCharactersInRange, chars, (Range) { .length = self->length }, replacement);
790}
void replaceOccurrencesOfCharactersInRange(String *self, const char *chars, const Range range, const char *replacement)
Replaces occurrences of chars in range with the given replacement.
Definition String.c:796

◆ replaceOccurrencesOfCharactersInRange()

void replaceOccurrencesOfCharactersInRange ( String self,
const char *  chars,
const Range  range,
const char *  replacement 
)

Replaces occurrences of chars in range with the given replacement.

Parameters
selfThe String.
charsThe null-terminated UTF-8 encoded C string to replace.
rangeThe Range in which to replace.
replacementThe null-terminated UTF-8 encoded C string replacement.

Definition at line 796 of file String.c.

796 {
797
798 assert(chars);
799 assert(replacement);
800
801 assert(range.location >= 0);
802 assert(range.location + range.length <= self->length);
803
804 Range search = range;
805 while (true) {
806
807 const Range result = $((String *) self, rangeOfCharacters, chars, search);
808 if (result.location == -1) {
809 break;
810 }
811
812 $(self, replaceCharactersInRange, result, replacement);
813
814 search.length -= (result.location - search.location);
815 search.length -= strlen(replacement);
816 search.length += ((int) strlen(replacement) - (int) strlen(chars));
817
818 search.location = result.location + strlen(replacement);
819 }
820}

◆ replaceOccurrencesOfString()

void replaceOccurrencesOfString ( String self,
const String string,
const String replacement 
)

Replaces all occurrences of string with the given replacement.

Parameters
selfThe String.
stringThe String to replace.
replacementThe String replacement.

Definition at line 826 of file String.c.

826 {
827 $(self, replaceOccurrencesOfStringInRange, string, (Range) { .length = self->length }, replacement);
828}
void replaceOccurrencesOfStringInRange(String *self, const String *string, const Range range, const String *replacement)
Replaces occurrences of string in range with the given replacement.
Definition String.c:834

◆ replaceOccurrencesOfStringInRange()

void replaceOccurrencesOfStringInRange ( String self,
const String string,
const Range  range,
const String replacement 
)

Replaces occurrences of string in range with the given replacement.

Parameters
selfThe String.
stringThe String to replace.
rangeThe Range in which to replace.
replacementThe String replacement.

Definition at line 834 of file String.c.

834 {
835
836 assert(string);
837 assert(replacement);
838
839 $(self, replaceOccurrencesOfCharactersInRange, string->chars, range, replacement->chars);
840}

◆ replaceStringInRange()

void replaceStringInRange ( String self,
const Range  range,
const String string 
)

Replaces the characters in range with the contents of string.

Parameters
selfThe String.
rangeThe Range of characters to replace.
stringThe String to substitute.

Definition at line 846 of file String.c.

846 {
847
848 $(self, replaceCharactersInRange, range, string->chars);
849}

◆ setCharacters()

void setCharacters ( String self,
const char *  chars 
)

Sets the contents of this String to chars.

Parameters
selfThe String.
charsThe characters to set, or NULL.

Definition at line 855 of file String.c.

855 {
856
857 $(self, setLength, 0);
858
859 $(self, appendCharacters, chars);
860}
void setLength(String *self, size_t length)
Sets the length of this String to length.
Definition String.c:882

◆ setFormat() [1/2]

void setFormat ( String self,
const char *  fmt 
)

Sets the contents of this String to the formatted string.

Parameters
selfThe String.
fmtThe format string.

◆ setFormat() [2/2]

void setFormat ( String self,
const char *  fmt,
  ... 
)

Definition at line 866 of file String.c.

866 {
867
868 $(self, setLength, 0);
869
870 va_list args;
871 va_start(args, fmt);
872
873 $(self, appendVaList, fmt, args);
874
875 va_end(args);
876}

◆ setLength()

void setLength ( String self,
size_t  length 
)

Sets the length of this String to length.

Parameters
selfThe String.
lengthThe length, which must be less than or equal to capacity.

Definition at line 882 of file String.c.

882 {
883
884 if (length < self->length) {
885 self->length = length;
886 self->chars[length] = '\0';
887 }
888}

◆ setString()

void setString ( String self,
const String string 
)

Sets the contents of this String to that of string.

Parameters
selfThe String.
stringThe String to set the contents from, or NULL.

Definition at line 894 of file String.c.

894 {
895
896 $(self, setLength, 0);
897
898 $(self, appendString, string);
899}

◆ string()

String * string ( void  )

Returns a new String.

Returns
The new String, or NULL on error.

Definition at line 905 of file String.c.

905 {
906 return $(alloc(String), init);
907}

◆ stringWithBytes()

String * stringWithBytes ( const uint8_t *  bytes,
size_t  length,
StringEncoding  encoding 
)

Returns a new String by decoding length of bytes to UTF-8.

Parameters
bytesThe bytes.
lengthThe length of bytes to copy.
encodingThe character encoding.
Returns
The new String, or NULL on error.

Definition at line 340 of file String.c.

340 {
341
342 return $(alloc(String), initWithBytes, bytes, length, encoding);
343}

◆ stringWithCapacity()

String * stringWithCapacity ( size_t  capacity)

Returns a new String with the given capacity.

Parameters
capacityThe desired capacity, in bytes.
Returns
The new String, or NULL on error.

Definition at line 913 of file String.c.

913 {
914 return $(alloc(String), initWithCapacity, capacity);
915}

◆ stringWithCharacters()

String * stringWithCharacters ( const char *  chars)

Returns a new String by copying chars.

Parameters
charsThe null-terminated UTF-8 encoded C string.
Returns
The new String, or NULL on error.

Definition at line 349 of file String.c.

349 {
350
352}
String * initWithCharacters(String *self, const char *chars)
Initializes this String by copying chars.
Definition String.c:638

◆ stringWithContentsOfFile()

String * stringWithContentsOfFile ( const char *  path,
StringEncoding  encoding 
)

Returns a new String with the contents of the FILE at path.

Parameters
pathA path name.
encodingThe character encoding.
Returns
The new String, or NULL on error.

Definition at line 358 of file String.c.

358 {
359
360 return $(alloc(String), initWithContentsOfFile, path, encoding);
361}
String * initWithContentsOfFile(String *self, const char *path, StringEncoding encoding)
Initializes this String with the contents of the FILE at path.
Definition String.c:652

◆ stringWithData()

String * stringWithData ( const Data data,
StringEncoding  encoding 
)

Returns a new String with the the given Data.

Parameters
dataA Data.
encodingThe character encoding.
Returns
The new String, or NULL on error.

Definition at line 367 of file String.c.

367 {
368
369 return $(alloc(String), initWithData, data, encoding);
370}

◆ stringWithFormat()

String * stringWithFormat ( const char *  fmt)

Returns a new String with the given format string.

Parameters
fmtThe format string.
Returns
The new String, or NULL on error.

◆ stringWithMemory()

String * stringWithMemory ( const ident  mem,
size_t  length 
)

Returns a new String with the given buffer.

Parameters
memA dynamically allocated, null-terminated UTF-8 encoded buffer.
lengthThe length of mem in bytes.
Returns
The new String, or NULL on error.
Remarks
The memory will be freed when the returned String is deallocated.

Definition at line 392 of file String.c.

392 {
393
394 return $(alloc(String), initWithMemory, mem, length);
395}

◆ substring()

String * substring ( const String self,
const Range  range 
)

Creates a new String from a subset of this one.

Parameters
selfThe String.
rangeThe character Range.
Returns
The new String.

Definition at line 401 of file String.c.

401 {
402
403 assert(range.location + range.length <= self->length);
404
405 ident mem = calloc(range.length + 1, sizeof(char));
406 assert(mem);
407
408 strncpy(mem, self->chars + range.location, range.length);
409
410 return $(alloc(String), initWithMemory, mem, range.length);
411}

◆ trim()

void trim ( String self)

Trims leading and trailing whitespace from this String.

Parameters
selfThe String.

Definition at line 921 of file String.c.

921 {
922
923 String *trimmed = $((String *) self, trimmedString);
924
925 $(self, replaceStringInRange, (const Range) { .length = self->length }, trimmed);
926
927 release(trimmed);
928}
String * trimmedString(const String *self)
Creates a copy of this String with leading and trailing whitespace removed.
Definition String.c:417
void replaceStringInRange(String *self, const Range range, const String *string)
Replaces the characters in range with the contents of string.
Definition String.c:846

◆ trimmedString()

String * trimmedString ( const String self)

Creates a copy of this String with leading and trailing whitespace removed.

Parameters
selfThe String.
Returns
The trimmed String.

Definition at line 417 of file String.c.

417 {
418
419 Range range = { .location = 0, .length = self->length };
420
421 while (isspace(self->chars[range.location])) {
422 range.location++;
423 range.length--;
424 }
425
426 while (range.length > 0 && isspace(self->chars[range.location + range.length - 1])) {
427 range.length--;
428 }
429
430 return $(self, substring, range);
431}

◆ uppercaseString()

String * uppercaseString ( const String self)
Parameters
selfThe String.
Returns
An uppercase representation of this String.

Definition at line 437 of file String.c.

437 {
438
440 assert(data);
441
442 const size_t codepoints = data->length / sizeof(Unicode);
443 Unicode *unicode = (Unicode *) data->bytes;
444
445 for (size_t i = 0; i < codepoints; i++, unicode++) {
446 *unicode = towupper(*unicode);
447 }
448
450
451 release(data);
452 return uppercase;
453}

◆ writeToFile()

bool writeToFile ( const String self,
const char *  path,
StringEncoding  encoding 
)

Writes this String to path.

Parameters
selfThe String.
pathThe path of the file to write.
encodingThe character encoding.
Returns
true on success, false on error.

Definition at line 459 of file String.c.

459 {
460
461 Data *data = $(self, getData, encoding);
462 assert(data);
463
464 const bool success = $(data, writeToFile, path);
465
466 release(data);
467 return success;
468}
bool writeToFile(const String *self, const char *path, StringEncoding encoding)
Writes this String to path.
Definition String.c:459

Related

◆ NameForStringEncoding()

OBJECTIVELY_EXPORT const char * NameForStringEncoding ( StringEncoding  encoding)
related
Parameters
encodingA StringEncoding.
Returns
The canonical name for the given encoding.

Definition at line 1019 of file String.c.

1019 {
1020
1021 switch (encoding) {
1023 return "ASCII";
1025 return "ISO-8859-1";
1027 return "ISO-8859-2";
1029 return "MacRoman";
1031 return "UTF-16";
1033 return "UTF-32";
1035 return "UTF-8";
1037 return "WCHAR_T";
1038 }
1039
1040 return "ASCII";
1041}
@ STRING_ENCODING_LATIN1
Definition String.h:48
@ STRING_ENCODING_UTF32
Definition String.h:52
@ STRING_ENCODING_MACROMAN
Definition String.h:50
@ STRING_ENCODING_UTF16
Definition String.h:51
@ STRING_ENCODING_ASCII
Definition String.h:47
@ STRING_ENCODING_LATIN2
Definition String.h:49

◆ str()

OBJECTIVELY_EXPORT String * str ( const char *  fmt,
  ... 
)
related

A convenience function for instantiating Strings.

Parameters
fmtThe format string.
Returns
A new String, or NULL on error.

Definition at line 1084 of file String.c.

1084 {
1085
1086 va_list args;
1087 va_start(args, fmt);
1088
1089 String *string = $(alloc(String), initWithVaList, fmt, args);
1090 assert(string);
1091
1092 va_end(args);
1093
1094 return string;
1095}
String * initWithVaList(String *self, const char *fmt, va_list args)
Initializes this String with the specified arguments list.
Definition String.c:730

◆ StringCompare()

OBJECTIVELY_EXPORT Order StringCompare ( const ident  a,
const ident  b 
)
related

A Comparator for sorting Strings.

Parameters
aA String.
bA String.
Returns
The Order of a to b.

Definition at line 1066 of file String.c.

1066 {
1067
1068 if (a) {
1069 if (b) {
1070 const int i = strcmp(((String *) a)->chars, ((String *) b)->chars);
1071 if (i == 0) {
1072 return OrderSame;
1073 }
1074 if (i > 0) {
1075 return OrderDescending;
1076 }
1077 } else {
1078 return OrderDescending;
1079 }
1080 }
1081 return OrderAscending;
1082}

◆ StringEncodingForName()

OBJECTIVELY_EXPORT StringEncoding StringEncodingForName ( const char *  name)
related
Parameters
nameThe case-insensitive name of the encoding.
Returns
The StringEncoding for the given name.

Definition at line 1043 of file String.c.

1043 {
1044
1045 if (strcasecmp("ASCII", name) == 0) {
1046 return STRING_ENCODING_ASCII;
1047 } else if (strcasecmp("ISO-8859-1", name) == 0) {
1049 } else if (strcasecmp("ISO-8859-2", name) == 0) {
1051 } else if (strcasecmp("MacRoman", name) == 0) {
1053 } else if (strcasecmp("UTF-16", name) == 0) {
1054 return STRING_ENCODING_UTF16;
1055 } else if (strcasecmp("UTF-32", name) == 0) {
1056 return STRING_ENCODING_UTF32;
1057 } else if (strcasecmp("UTF-8", name) == 0) {
1058 return STRING_ENCODING_UTF8;
1059 } else if (strcasecmp("WCHAR", name) == 0) {
1060 return STRING_ENCODING_WCHAR;
1061 }
1062
1063 return STRING_ENCODING_ASCII;
1064}

The documentation for this struct was generated from the following files: