X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=libcitadel%2Flib%2Ftools.c;h=8971b30e69a5761a29f413250e0926e844f6649a;hb=6957096b74edcaa677c056cff53cdd7e974cc605;hp=14e43071a1761d6c02ed248ae6fdc6e70d82c7c7;hpb=9571de81331e169c042c630800bff1bde499c8a9;p=citadel.git diff --git a/libcitadel/lib/tools.c b/libcitadel/lib/tools.c index 14e43071a..8971b30e6 100644 --- a/libcitadel/lib/tools.c +++ b/libcitadel/lib/tools.c @@ -1,24 +1,10 @@ -/* - * A basic toolset containing miscellaneous functions for string manipluation, - * encoding/decoding, and a bunch of other stuff. - * - * Copyright (c) 1987-2011 by the citadel.org team - * - * This program is open source software; you can redistribute it 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - +// A basic toolset containing miscellaneous functions for string manipluation, +// encoding/decoding, and a bunch of other stuff. +// +// Copyright (c) 1987-2022 by the citadel.org team +// +// This program is open source software. Use, duplication, or disclosure +// is subject to the terms of the GNU General Public License, version 3. #include #include @@ -30,8 +16,6 @@ #include #include #include -#include "b64/cencode.h" -#include "b64/cdecode.h" #if TIME_WITH_SYS_TIME # include @@ -52,20 +36,18 @@ typedef unsigned char byte; /* Byte type */ -/* - * copy a string into a buffer of a known size. abort if we exceed the limits - * - * dest the targetbuffer - * src the source string - * n the size od dest - * - * returns the number of characters copied if dest is big enough, -n if not. - */ -int safestrncpy(char *dest, const char *src, size_t n) -{ +// copy a string into a buffer of a known size. abort if we exceed the limits +// +// dest the targetbuffer +// src the source string +// n the size od dest +// +// returns the number of characters copied if dest is big enough, -n if not. +int safestrncpy(char *dest, const char *src, size_t n) { int i = 0; - if (dest == NULL || src == NULL) { + if (dest == NULL || src == NULL) + { fprintf(stderr, "safestrncpy: NULL argument\n"); abort(); } @@ -80,12 +62,8 @@ int safestrncpy(char *dest, const char *src, size_t n) } - -/* - * num_tokens() - discover number of parameters/tokens in a string - */ -int num_tokens(const char *source, char tok) -{ +// num_tokens() - discover number of parameters/tokens in a string +int num_tokens(const char *source, char tok) { int count = 1; const char *ptr = source; @@ -102,18 +80,13 @@ int num_tokens(const char *source, char tok) return (count); } -//extern void cit_backtrace(void); - -/* - * extract_token() - a string tokenizer - * returns -1 if not found, or length of token. - */ -long extract_token(char *dest, const char *source, int parmnum, char separator, int maxlen) -{ - const char *s; //* source * / - int len = 0; //* running total length of extracted string * / - int current_token = 0; //* token currently being processed * / +// extract_token() - a string tokenizer +// returns -1 if not found, or length of token. +long extract_token(char *dest, const char *source, int parmnum, char separator, int maxlen) { + const char *s; // source + int len = 0; // running total length of extracted string + int current_token = 0; // token currently being processed s = source; @@ -121,8 +94,6 @@ long extract_token(char *dest, const char *source, int parmnum, char separator, return(-1); } - //cit_backtrace(); - //lprintf (CTDL_DEBUG, "test >: n: %d sep: %c source: %s \n willi \n", parmnum, separator, source); dest[0] = 0; if (s == NULL) { @@ -135,9 +106,7 @@ long extract_token(char *dest, const char *source, int parmnum, char separator, if (*s == separator) { ++current_token; } - if ( (current_token == parmnum) && - (*s != separator) && - (len < maxlen) ) { + if ( (current_token == parmnum) && (*s != separator) && (len < maxlen) ) { dest[len] = *s; ++len; } @@ -149,70 +118,21 @@ long extract_token(char *dest, const char *source, int parmnum, char separator, dest[len] = '\0'; if (current_token < parmnum) { - //lprintf (CTDL_DEBUG,"test : n: %d sep: %c source: %s \n willi \n", parmnum, separator, source); - strcpy(dest, ""); - - // Locate desired parameter - s = source; - while (count < parmnum) { - // End of string, bail! - if (!*s) { - s = NULL; - break; - } - if (*s == separator) { - count++; - } - s++; - } - if (!s) { - //lprintf (CTDL_DEBUG,"test 0) @@ -259,11 +170,9 @@ int extract_int(const char *source, int parmnum) return 0; } -/* - * extract_long() - extract an long parm w/o supplying a buffer - */ -long extract_long(const char *source, int parmnum) -{ + +// extract_long() - extract an long parm without supplying a buffer +long extract_long(const char *source, int parmnum) { char buf[32]; if (extract_token(buf, source, parmnum, '|', sizeof buf) > 0) @@ -273,11 +182,8 @@ long extract_long(const char *source, int parmnum) } -/* - * extract_unsigned_long() - extract an unsigned long parm - */ -unsigned long extract_unsigned_long(const char *source, int parmnum) -{ +// extract_unsigned_long() - extract an unsigned long parm +unsigned long extract_unsigned_long(const char *source, int parmnum) { char buf[32]; if (extract_token(buf, source, parmnum, '|', sizeof buf) > 0) @@ -286,71 +192,9 @@ unsigned long extract_unsigned_long(const char *source, int parmnum) return 0; } -size_t CtdlEncodeBase64(char *dest, const char *source, size_t sourcelen, int linebreaks) -{ - // linebreaks at 70 are ugly for base64, since 3 bytes in makes 4 bytes out - int breaklength = 68; - int readlength = 3 * breaklength / 4; - - int destoffset; - int sourceoffset; - int sourceremaining; - - base64_encodestate _state; - - base64_init_encodestate(&_state); - - if (linebreaks) { - sourceremaining = sourcelen; - destoffset = 0; - sourceoffset = 0; - - while (sourceremaining > 0) { - destoffset += base64_encode_block( - &(source[sourceoffset]), - (readlength > sourceremaining ? sourceremaining : readlength), - &(dest[destoffset]), - &_state); - sourceoffset += readlength; - sourceremaining -= readlength; - dest[destoffset++] = '\r'; - dest[destoffset++] = '\n'; - } - - destoffset += base64_encode_blockend(&(dest[destoffset]), &_state); - } - else { - destoffset = base64_encode_block(source, sourcelen, dest, &_state); - - destoffset += base64_encode_blockend(&(dest[destoffset]), &_state); - } - dest[destoffset] = 0; - return destoffset; -} - -/* - * Convert base64-encoded to binary. Returns the length of the decoded data. - * It will stop after reading 'length' bytes. - */ -int CtdlDecodeBase64(char *dest, const char *source, size_t length) -{ - base64_decodestate _state; - int len; - - base64_init_decodestate(&_state); - - len = base64_decode_block(source, length, dest, &_state); - dest[len] = '\0'; - return len; -} - - -/* - * if we send out non ascii subjects, we encode it this way. - */ -char *rfc2047encode(const char *line, long length) -{ +// if we send out non ascii subjects, we encode it this way. +char *rfc2047encode(const char *line, long length) { const char *AlreadyEncoded; char *result; long end; @@ -358,16 +202,13 @@ char *rfc2047encode(const char *line, long length) /* check if we're already done */ AlreadyEncoded = strstr(line, "=?"); - if ((AlreadyEncoded != NULL) && - ((strstr(AlreadyEncoded, "?B?") != NULL)|| - (strstr(AlreadyEncoded, "?Q?") != NULL))) - { + if ((AlreadyEncoded != NULL) && ((strstr(AlreadyEncoded, "?B?") != NULL)|| (strstr(AlreadyEncoded, "?Q?") != NULL))) { return strdup(line); } result = (char*) malloc(sizeof(UTF8_HEADER) + 4 + length * 2); strncpy (result, UTF8_HEADER, strlen (UTF8_HEADER)); - CtdlEncodeBase64(result + strlen(UTF8_HEADER), line, length, 0); + CtdlEncodeBase64(result + strlen(UTF8_HEADER), line, length, BASE64_NO_LINEBREAKS); end = strlen (result); result[end]='?'; result[end+1]='='; @@ -375,12 +216,9 @@ char *rfc2047encode(const char *line, long length) return result; } -/* - * removes double slashes from pathnames - * allows / disallows trailing slashes - */ -void StripSlashes(char *Dir, int TrailingSlash) -{ +// removes double slashes from pathnames +// allows / disallows trailing slashes +void StripSlashes(char *Dir, int TrailingSlash) { char *a, *b; a = b = Dir; @@ -405,10 +243,9 @@ void StripSlashes(char *Dir, int TrailingSlash) } -/* - * Strip leading and trailing spaces from a string - */ -size_t striplt(char *buf) { + +// Strip leading and trailing spaces from a string +size_t string_trim(char *buf) { char *first_nonspace = NULL; char *last_nonspace = NULL; char *ptr; @@ -439,14 +276,13 @@ size_t striplt(char *buf) { } -/** - * \brief check for the presence of a character within a string (returns count) - * \param st the string to examine - * \param ch the char to search - * \return the number of times ch appears in st +/* + * check for the presence of a character within a string (returns count) + * st the string to examine + * ch the char to search + * returns the number of times ch appears in st */ -int haschar(const char *st, int ch) -{ +int haschar(const char *st, int ch) { const char *ptr; int b; b = 0; @@ -461,32 +297,6 @@ int haschar(const char *st, int ch) } - - - -/* - * Format a date/time stamp for output - * seconds is whether to print the seconds - */ -void fmt_date(char *buf, size_t n, time_t thetime, int seconds) { - struct tm tm; - char *teh_format = NULL; - - *buf = '\0'; - localtime_r(&thetime, &tm); - - if (seconds) { - teh_format = "%F %R:%S"; - } - else { - teh_format = "%F %R"; - } - - strftime(buf, n, teh_format, &tm); -} - - - /* * Determine whether the specified message number is contained within the * specified sequence set. @@ -502,13 +312,16 @@ int is_msg_in_sequence_set(const char *mset, long msgnum) { extract_token(setstr, mset, s, ',', sizeof setstr); extract_token(lostr, setstr, 0, ':', sizeof lostr); - if (num_tokens(setstr, ':') >= 2) { + if (num_tokens(setstr, ':') >= 2) + { extract_token(histr, setstr, 1, ':', sizeof histr); - if (!strcmp(histr, "*")) { + if (!strcmp(histr, "*")) + { snprintf(histr, sizeof histr, "%ld", LONG_MAX); } } - else { + else + { strcpy(histr, lostr); } lo = atol(lostr); @@ -520,18 +333,17 @@ int is_msg_in_sequence_set(const char *mset, long msgnum) { return(0); } -/** - * \brief Utility function to "readline" from memory - * \param start Location in memory from which we are reading. - * \param buf the buffer to place the string in. - * \param maxlen Size of string buffer - * \return Pointer to the source memory right after we stopped reading. +/* + * Utility function to "readline" from memory + * start Location in memory from which we are reading. + * buf the buffer to place the string in. + * maxlen Size of string buffer + * returns pointer to the source memory right after we stopped reading. */ -char *memreadline(char *start, char *buf, int maxlen) -{ +char *memreadline(char *start, char *buf, int maxlen) { char ch; char *ptr; - int len = 0; /**< tally our own length to avoid strlen() delays */ + int len = 0; /* tally our own length to avoid strlen() delays */ ptr = start; @@ -548,28 +360,30 @@ char *memreadline(char *start, char *buf, int maxlen) } -/** - * \brief Utility function to "readline" from memory - * \param start Location in memory from which we are reading. - * \param buf the buffer to place the string in. - * \param maxlen Size of string buffer - * \param retlen the length of the returned string - * \return Pointer to the source memory right after we stopped reading. - */ -char *memreadlinelen(char *start, char *buf, int maxlen, int *retlen) -{ +/* + * Utility function to "readline" from memory + * start Location in memory from which we are reading. + * buf the buffer to place the string in. + * maxlen Size of string buffer + * retlen the length of the returned string + * returns a pointer to the source memory right after we stopped reading. + */ +char *memreadlinelen(char *start, char *buf, int maxlen, int *retlen) { char ch; char *ptr; - int len = 0; /**< tally our own length to avoid strlen() delays */ + int len = 0; /* tally our own length to avoid strlen() delays */ ptr = start; - while (1) { + while (1) + { ch = *ptr++; - if ((len + 1 < (maxlen)) && (ch != 13) && (ch != 10)) { + if ((len + 1 < (maxlen)) && (ch != 13) && (ch != 10)) + { buf[len++] = ch; } - if ((ch == 10) || (ch == 0)) { + if ((ch == 10) || (ch == 0)) + { buf[len] = 0; *retlen = len; return ptr; @@ -636,8 +450,6 @@ const char *cmemreadlinelen(const char *start, char *buf, int maxlen, int *retle } - - /* * Strip a boundarized substring out of a string (for example, remove * parentheses and anything inside them). @@ -852,6 +664,7 @@ inline static char *_bmstrcasestr_len(char *text, size_t textlen, const char *pa return (NULL); } + /* * bmstrcasestr() -- case-insensitive substring search * @@ -877,8 +690,6 @@ char *bmstrcasestr_len(char *text, size_t textlen, const char *pattern, size_t p } - - /* * bmstrcasestr() -- case-insensitive substring search * @@ -937,6 +748,7 @@ inline static const char *_cbmstrcasestr_len(const char *text, size_t textlen, c return (NULL); } + /* * bmstrcasestr() -- case-insensitive substring search * @@ -957,10 +769,12 @@ const char *cbmstrcasestr(const char *text, const char *pattern) { return _cbmstrcasestr_len(text, textlen, pattern, patlen); } + const char *cbmstrcasestr_len(const char *text, size_t textlen, const char *pattern, size_t patlen) { return _cbmstrcasestr_len(text, textlen, pattern, patlen); } + /* * Local replacement for controversial C library function that generates * names for temporary files. Included to shut up compiler warnings. @@ -980,7 +794,6 @@ void CtdlMakeTempFileName(char *name, int len) { } - /* * Determine whether the specified message number is contained within the specified set. * Returns nonzero if the specified message number is in the specified message set string. @@ -988,12 +801,10 @@ void CtdlMakeTempFileName(char *name, int len) { int is_msg_in_mset(const char *mset, long msgnum) { int num_sets; int s; - char setstr[SIZ], lostr[SIZ], histr[SIZ]; /* was 1024 */ + char setstr[SIZ], lostr[SIZ], histr[SIZ]; long lo, hi; - /* - * Now set it for all specified messages. - */ + // Now set it for all specified messages. num_sets = num_tokens(mset, ','); for (s=0; s delta) && (isspace(buf[delta]))){ @@ -1061,8 +868,7 @@ void stripltlen(char *buf, int *len) /* * Convert all whitespace characters in a supplied string to underscores */ -void convert_spaces_to_underscores(char *str) -{ +void convert_spaces_to_underscores(char *str) { int len; int i; @@ -1080,8 +886,7 @@ void convert_spaces_to_underscores(char *str) /* * check whether the provided string needs to be qp encoded or not */ -int CheckEncode(const char *pch, long len, const char *pche) -{ +int CheckEncode(const char *pch, long len, const char *pche) { if (pche == NULL) pche = pch + len; while (pch < pche) {