view th_string.h @ 330:b2c4b0b4d44f

Add initial support for ll and L printf modifiers.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 23 Feb 2016 12:55:09 +0200
parents 2c87abec62db
children cda5a2aebbb6
line wrap: on
line source

/*
 * Miscellaneous string-handling related utility-functions
 * Programmed and designed by Matti 'ccr' Hamalainen
 * (C) Copyright 2002-2016 Tecnic Software productions (TNSP)
 *
 * Please read file 'COPYING' for information on license and distribution.
 */
#ifndef TH_STRING_H
#define TH_STRING_H

#include "th_util.h"
#include <stdlib.h>
#include <ctype.h>
#include <stdarg.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Macros
 */
#define th_isalnum(c)   isalnum((int)(unsigned char) c)
#define th_isalpha(c)   isalpha((int)(unsigned char) c)
#define th_isascii(c)   isascii((int)(unsigned char) c)
#define th_isblank(c)   isblank((int)(unsigned char) c)
#define th_iscntrl(c)   iscntrl((int)(unsigned char) c)
#define th_isdigit(c)   isdigit((int)(unsigned char) c)
#define th_isgraph(c)   isgraph((int)(unsigned char) c)
#define th_islower(c)   islower((int)(unsigned char) c)
#define th_isprint(c)   isprint((int)(unsigned char) c)
#define th_ispunct(c)   ispunct((int)(unsigned char) c)
#define th_isspace(c)   isspace((int)(unsigned char) c)
#define th_isupper(c)   isupper((int)(unsigned char) c)
#define th_isxdigit(c)  isxdigit((int)(unsigned char) c)
#define th_iscrlf(c)    ((c=='\r')||(c=='\n'))

#define th_isspecial(q) (((q >= 0x5b) && (q <= 0x60)) || ((q >= 0x7b) && (q <= 0x7d)))

#define th_tolower(c)   tolower((int)(unsigned char) c)
#define th_toupper(c)   toupper((int)(unsigned char) c)


enum
{
    TH_TRIM_START = 1,
    TH_TRIM_END   = 2,
    TH_TRIM_BOTH  = 3
};


enum
{
    TH_PF_NONE  = 0x0000,
    TH_PF_ALT   = 0x0001,
    TH_PF_SIGN  = 0x0002,
    TH_PF_SPACE = 0x0004,
    TH_PF_GROUP = 0x0008,

    TH_PF_ZERO  = 0x0100,
    TH_PF_LEFT  = 0x0200,

    TH_PF_LONG  = 0x1000,
    TH_PF_LONGLONG = 0x2000,
};


typedef struct
{
    char *buf;
    size_t size, pos;
    int ipos;
    void *data;
} th_printf_ctx;


typedef int (*th_printf_vputch)(th_printf_ctx *ctx, const char ch);


/* Normal NUL-terminated string functions
 */
size_t   th_strlen(const char *str);

char    *th_strdup(const char *src);
char    *th_strndup(const char *src, const size_t n);
char    *th_strdup_trim(const char *, const int flags);
char    *th_strndup_trim(const char *, const size_t n, const int flags);

int     th_strcasecmp(const char *haystack, const char *needle);
int     th_strncasecmp(const char *haystack, const char *needle, size_t n);
char    *th_strrcasecmp(char *haystack, const char *needle);
void    th_strip_ctrlchars(char *str);

int     th_vprintf_do(th_printf_ctx *ctx, th_printf_vputch vputch, const char *fmt, va_list ap);
int     th_vsnprintf(char *buf, size_t size, const char *fmt, va_list ap);
int     th_snprintf(char *buf, size_t size, const char *fmt, ...);
int     th_vfprintf(FILE *fh, const char *fmt, va_list ap);
int     th_fprintf(FILE *fh, const char *fmt, ...);


char    *th_strdup_vprintf(const char *fmt, va_list ap);
char    *th_strdup_printf(const char *fmt, ...);

void    th_pstr_vprintf(char **buf, const char *fmt, va_list ap);
void    th_pstr_printf(char **buf, const char *fmt, ...);

int     th_pstrcpy(char **pdst, const char *src);
int     th_pstrcat(char **pdst, const char *src);


/* Parsing, matching
 */
const char    *th_findnext(const char *, size_t *);
const char    *th_findsep(const char *, size_t *, char);
const char    *th_findseporspace(const char *, size_t *, char);

BOOL    th_strmatch(const char *haystack, const char *pattern);
BOOL    th_strcasematch(const char *haystack, const char *pattern);

int     th_get_hex_triplet(const char *str);
BOOL    th_get_boolean(const char *str, BOOL *value);

void    th_print_wrap(FILE *fh, const char *str, int spad, int rpad, int width);


#ifdef __cplusplus
}
#endif
#endif // TH_STRING_H