File: string.h

package info (click to toggle)
yodl 4.04.00-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 4,720 kB
  • sloc: ansic: 7,803; perl: 683; cpp: 570; sh: 411; xml: 190; makefile: 164
file content (129 lines) | stat: -rw-r--r-- 4,885 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#ifndef INCLUDED_STRING_H_
#define INCLUDED_STRING_H_

/*
    String stores ascii-Z strings. Char * args may be NULL.

    string_format() assumes C99 is active (see the snprintf() manpage)
*/

#include "../root/root.h"

#include <stdarg.h>
#include <string.h>

typedef struct
{
    size_t d_size;        /* buffer size of d_str        */
    size_t d_length;      /* length not counting ascii-Z */
    char *d_str;
}
String;

static inline void  string_construct(String *s, char const *str);
           String  *string_new(char const *str);            /* allocates */

           String  *string_move(char *str); /* grabs str                    */
                                            /* (must have been allocated)   */

                                                        /* only free d_str  */
static inline void  string_destruct(register String *sp);

              void  string_delete(register String **sp);    /* delete *sp   */
                                                            /* *sp = 0      */


void        string_add(String *dest, String *src);
void        string_addchar(String *sp, int c);      /* actually: c is a char */
void        string_addcharOnce(String *sp, int c);  /* not if already there */
void        string_additerators(String *string, char const *begin,
                                                char const *end);
void        string_addstr(String *sp, char const *str);
void        string_assign(String *sp, char const *str);
void        string_copy(String *dest, String *src);
size_t      string_count(String *sp, char needle);
void        string_fill(String *s, size_t length, int fill);
                                            /* FAILED if no such character */
size_t      string_find_first_of(String *sp, char const *accept);
size_t      string_find_first_not_of(String *sp, int (*fun)(int));
char       *string_firstword(char **str);           /* returns new string   */
                                                    /* or NULL if none      */
                                                    /* *str points beyond   */
                                            /* assigns new contents         */
void        string_format(String *sp, char const *fmt, ...)
            ATTRIBUTE_FORMAT_PRINTF(2, 3);
char        string_popfront(String *sp);
char       *string_release(String *sp);     /* returns internal str          */
                                            /* reassigning text OK          */

char       *string_grab(String **sp);       /* returns internal str          */
                                            /* *sp = 0             .        */

void        string_replace(String *sp, char const *srch, char const *replace);
                                            /* allocates and formats        */
                                            /* returned string. size (incl. */
                                            /* ascii-Z) in n                */
char       *string_str_replace(char const *cp,
                                    char const *srch, char const *replace);
                                            /* allocates and formats        */
                                            /* returned string. size (incl. */
                                            /* ascii-Z) in n                */
                                            /* return (empty) substring     */
char       *string_substr(String const *sp, size_t offset, size_t length);
char       *string_vformat(size_t *n, char const *fmt, va_list list)
            ATTRIBUTE_FORMAT_PRINTF(2, 0);

void        string_swallow(String *dest, String *src);  /* dest eats src    */
                                            /* following string_swallow     */
                                            /* src is invalid               */
char const *string_short (char const *s);
char       *string_strip(char **str);       /* returns *str as stripped str */

/* 
    Internal String use only. Not used outside of this directory, needed here
    to allow proper compilation of the static inline functions below
*/

#include <stdlib.h>

extern char const s_stringEmpty[];
void s_init(String *sp, char const *txt);       /* disregards sp's contents */


/*  public interface continues from here */


static inline char const *string_str(register String const *sp)
{
    return sp->d_str;
}

static inline void string_destruct(register String *sp)
{
    free(sp->d_str);
}

static inline size_t string_length(register String const *sp)
{
    return sp->d_length;
}

static inline void string_erase(String *sp)     /* resets to "" */
{
    string_assign(sp, 0);
}

static inline void string_construct(String *s, char const *str)
{
    s_init(s, str ? str : s_stringEmpty);       
}

static inline int string_last(String const *sp)
{
    return sp->d_length == 0 ? 0 : sp->d_str[sp->d_length - 1];
}

#endif