From 014f0e14a3c6a044d99a67c8f4e1c4065452479e Mon Sep 17 00:00:00 2001 From: Didier Raboud Date: Sun, 23 May 2010 00:05:04 +0200 Subject: Imported Upstream version 4.0-20090301 --- util.h | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 util.h (limited to 'util.h') diff --git a/util.h b/util.h new file mode 100644 index 0000000..90e2596 --- /dev/null +++ b/util.h @@ -0,0 +1,177 @@ + +#ifndef util_h +#define util_h + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include +#include + + +extern const char* shellescapes; + +int isempty(const char *string); +int prefixcmp(const char *str, const char *prefix); +int prefixcasecmp(const char *str, const char *prefix); + +int startswith(const char *str, const char *prefix); +int endswith(const char *str, const char *postfix); + +const char * skip_whitespace(const char *str); + +void strlower(char *dest, size_t destlen, const char *src); + +/* + * Like strncpy, but omits characters for which omit_func returns true + * It also assures that dest is zero terminated. + * Returns a pointer to the position in 'src' right after the last byte that has been copied. + */ +const char * strncpy_omit(char* dest, const char* src, size_t n, int (*omit_func)(int)); + +int omit_unprintables(int c); +int omit_shellescapes(int c); +int omit_specialchars(int c); +int omit_whitespace(int c); + +/* TODO check for platforms which already have strlcpy and strlcat */ + +/* Copy at most size-1 characters from src to dest + dest will always be \0 terminated (unless size == 0) + returns strlen(src) */ +size_t strlcpy(char *dest, const char *src, size_t size); +size_t strlcat(char *dest, const char *src, size_t size); + +/* Replace all occurences of each of the characters in 'chars' by 'repl' */ +void strrepl(char *str, const char *chars, char repl); + +/* Replace all occurences of each of the characters in 'chars' by 'repl', + but do not allow consecutive 'repl' chars */ +void strrepl_nodups(char *str, const char *chars, char repl); + +/* clears 'str' with \0s */ +void strclr(char *str); + +char * strnchr(const char *str, int c, size_t n); + +void escapechars(char *dest, size_t size, const char *src, const char *esc_chars); + +/* copies characters from 'src' to 'dest', until 'src' contains a character from 'stopchars' + will not copy more than 'max' chars + dest will be zero terminated in either case + returns a pointer to the position right after the last byte that has been copied +*/ +const char * strncpy_tochar(char *dest, const char *src, size_t max, const char *stopchars); + +/* 'paths' is a colon seperated list of paths (like $PATH) + * 'found_in' may be NULL if it is not needed */ +int find_in_path(const char *progname, const char *paths, char *found_in); + +/* extracts the base name of 'path', i.e. only the filename, without path or extension */ +void file_basename(char *dest, const char *path, size_t dest_size); + +/* if 'path' is relative, prepend cwd */ +void make_absolute_path(char *path, int len); + +int is_true_string(const char *str); /* "1", "Yes", "On", "True" */ +int is_false_string(const char *str); /* "0", "No", "Off", "False", "None" */ + +int digit(char c); /* returns 0-9 if c is a digit, otherwise -1 */ + +int line_count(const char *str); + +/* returns the index of the beginning of the line_number'th line in str */ +int line_start(const char *str, int line_number); + +/* Replace hex notation for unprintable characters in PPD files + by the actual characters ex: "<0A>" --> chr(hex("0A")) */ +void unhexify(char *dest, size_t size, const char *src); + +void extract_command(size_t *start, size_t *end, const char *cmdline, const char *cmd); + +char ** argv_split(const char *string, const char *separators, int *cntp); +size_t argv_count(char **argv); +void argv_free(char **argv); + +/* + * Returns non-zero if 'cmdline' calls 'cmd' in some way + */ +int contains_command(const char *cmdline, const char *cmd); + +int copy_file(FILE *dest, FILE *src, const char *alreadyread, size_t alreadyread_len); + +/* Dynamic string */ +typedef struct dstr { + char *data; + size_t len; + size_t alloc; +} dstr_t; + +dstr_t * create_dstr(); +void free_dstr(dstr_t *ds); +void dstrclear(dstr_t *ds); +void dstrassure(dstr_t *ds, size_t alloc); +void dstrcpy(dstr_t *ds, const char *src); +void dstrncpy(dstr_t *ds, const char *src, size_t n); +void dstrncat(dstr_t *ds, const char *src, size_t n); +void dstrcpyf(dstr_t *ds, const char *src, ...); +void dstrcat(dstr_t *ds, const char *src); +void dstrcatf(dstr_t *ds, const char *src, ...); +void dstrputc(dstr_t *ds, int c); +size_t fgetdstr(dstr_t *ds, FILE *stream); /* returns number of characters read */ +int dstrreplace(dstr_t *ds, const char *find, const char *repl, int start); +void dstrprepend(dstr_t *ds, const char *str); +void dstrinsert(dstr_t *ds, int idx, const char *str); +void dstrinsertf(dstr_t *ds, int idx, const char *str, ...); +void dstrremove(dstr_t *ds, int idx, size_t count); +void dstrcatline(dstr_t *ds, const char *str); /* appends the first line from str to ds (incl. \n) */ + +int dstrendswith(dstr_t *ds, const char *str); +void dstrfixnewlines(dstr_t *ds); +void dstrremovenewline(dstr_t *ds); +void dstrtrim(dstr_t *ds); +void dstrtrim_right(dstr_t *ds); + + +/* Doubly linked list of void pointers */ +typedef struct listitem_s { + void *data; + struct listitem_s *prev, *next; +} listitem_t; + +typedef struct { + listitem_t *first, *last; +} list_t; + +list_t * list_create(); +list_t * list_create_from_array(int count, void ** data); /* array values are NOT copied */ +void list_free(list_t *list); + +size_t list_item_count(list_t *list); + +list_t * list_copy(list_t *list); + +void list_prepend(list_t *list, void *data); +void list_append(list_t *list, void *data); +void list_remove(list_t *list, listitem_t *item); + +listitem_t * list_get(list_t *list, int idx); + + +/* Argument values may be seperated from their keys in the following ways: + - with whitespace (i.e. it is in the next list entry) + - with a '=' + - not at all +*/ +listitem_t * arglist_find(list_t *list, const char *name); +listitem_t * arglist_find_prefix(list_t *list, const char *name); + +char * arglist_get_value(list_t *list, const char *name); +char * arglist_get(list_t *list, int idx); + +int arglist_remove(list_t *list, const char *name); +int arglist_remove_flag(list_t *list, const char *name); + +#endif + -- cgit v1.2.3