From bd1d1b70d1ab8dc0a151b377fd86b859b0da14d1 Mon Sep 17 00:00:00 2001 From: Etienne Brateau <etienne.brateau@ensiie.fr> Date: Thu, 28 Feb 2019 20:37:16 +0100 Subject: [PATCH] Move string functions into strings module --- include/utils/p2c.h | 7 -- include/utils/strings.h | 28 +++++--- src/utils/p2c.c | 156 ---------------------------------------- src/utils/strings.c | 145 +++++++++++++++++++++++++++++++++++++ src/utils/strlist.c | 1 + 5 files changed, 166 insertions(+), 171 deletions(-) diff --git a/include/utils/p2c.h b/include/utils/p2c.h index 671b8a2..171f634 100644 --- a/include/utils/p2c.h +++ b/include/utils/p2c.h @@ -90,13 +90,6 @@ void _EscIO (int); int microsleep (long); -char *strsub (char *, char *, size_t, size_t); -char *strltrim (char *); -char *strrtrim (char *); -size_t strpos2 (char *, char *, size_t); -void strmove (size_t len, char * s, size_t spos, char * d, size_t dpos); -int strcicmp (char * s1, char * s2); - int P_eof (FILE *); int P_eoln (FILE *); long *P_setunion (long *, long *, long *) DEPRECATED; diff --git a/include/utils/strings.h b/include/utils/strings.h index 5fd6bdb..f776c0e 100644 --- a/include/utils/strings.h +++ b/include/utils/strings.h @@ -10,14 +10,23 @@ */ void strsafeappend(char *s, char *s2) DEPRECATED; -//void strappendc(char *s, int ch); +/** + * Put the string in upper case + */ char *strupper (char *result, char *s); + +/** + * Put the string in lower case + */ char *strlower (char *result, char *s); + +/** + * Return a substring by the begin and end of wanted part. + * Result must be free. + */ char *strpart (char *result, char *s, long fist, long last); char *strlast (char *result, char *s, size_t num); char *strreverse (char *result, char*); -//char *strljust (char *result, char *s, long wid); -//char *strrjust (char *result, char *s, long wid); char *strcjust (char *result, char *s, size_t wid); int strbegins (char *s1, char *s2); int strends (char *s1, char *s2); @@ -28,17 +37,13 @@ int strcisubcmp (size_t n, char *s1, size_t i1, char *s2, size_t i2); void strsubst (char *repl, char *s, size_t index, size_t size); char *strint (char *result, long i); char *strint2 (char *result, long i, long w); -//char *strreal (char *result, double r); char *strchar (char *result, int ch); -//long strreadint (char *s); -//double strreadreal (char *s); size_t strposb (char *s1, char *s2, ptrdiff_t i); size_t strposc (char *s1, char ch, ptrdiff_t i); size_t strposcset (char *s1, char *s2, size_t i); size_t strposbcset (char *s1, char *s2, size_t i); size_t strcipos2 (char *s1, char *s2, size_t i); size_t strciposb (char *s1, char *s2, size_t i); -//int strcontains (char *s1, char *s2); int strsubset (char *s1, char *s2); int strcommon (char *s1, char *s2); size_t strlenv (char *s); @@ -51,7 +56,14 @@ void strcomment (char *s, char* bracket); void strcompress (char *s, char *chars, int all); void strdispose (char **sp); void strchange (char** sp, char *); -void strwordx(char *buf, char *wrd); +void strwordx (char *buf, char *wrd); +char *strsub (char *, char *, size_t, size_t); +char *strltrim (char *); +char *strrtrim (char *); +size_t strpos2 (char *, char *, size_t); +void strmove (size_t len, char * s, size_t spos, char * d, size_t dpos); +int strcicmp (char * s1, char * s2); + /** * \deprecated diff --git a/src/utils/p2c.c b/src/utils/p2c.c index 6d6cef2..73d1ca1 100644 --- a/src/utils/p2c.c +++ b/src/utils/p2c.c @@ -47,162 +47,6 @@ void PASCAL_MAIN(int argc, char **argv) bigendian = isbigendian(); } -/* Common string functions: */ - -/* Store in "ret" the substring of length "len" starting from "pos" (1-based). - Store a shorter or null string if out-of-range. Return "ret". */ - -char *strsub(char *ret, char *s, size_t pos, size_t len) -{ - char *s2; - - if (pos == 0 || len == 0) - { - *ret = '\0'; - return ret; - } - --pos; - - while (pos-- > 0) - { - if (!*s++) - { - *ret = '\0'; - return ret; - } - } - - s2 = ret; - while (len-- > 0) - { - if (!(*s2++ = *s++)) - return ret; - } - - *s2 = '\0'; - return ret; -} - - -/** Return the index of the first occurrence of "pat" as a substring of "s", - starting at index "pos" (1-based). Result is 1-based, 0 if not found. */ -size_t strpos2(char *s, char *pat, size_t pos) -{ - char *cp, ch; - ptrdiff_t slen; - - if (pos == 0) - return 0; - pos--; - slen = strlen(s) - pos; - cp = s + pos; - if (!(ch = *pat++)) - return 0; - pos = strlen(pat); - slen -= pos; - while (--slen >= 0) - { - if (*cp++ == ch && !strncmp(cp, pat, pos)) - return cp - s; - } - return 0; -} - - -/* HP and Turbo Pascal string functions: */ - -/* Trim blanks at left end of string. */ - -char *strltrim(char *s) -{ - while (isspace(*s)) - s++; - return s; -} - -/* Trim blanks at right end of string. */ - -char *strrtrim(char *s) -{ - char *s2 = s; - - if (!*s) - return s; - while (*++s2) ; - while (s2 > s && isspace(*--s2)) - *s2 = '\0'; - return s; -} - - -/* Copy the substring of length "len" from index "spos" of "s" (1-based) - to index "dpos" of "d", lengthening "d" if necessary. Length and - indices must be in-range. */ -void strmove(size_t len, char *s, size_t spos, char *d, size_t dpos) -{ - s += spos - 1; - d += dpos - 1; - while (*d && len-- > 0) - *d++ = *s++; - - while (len-- > 0) - *d++ = *s++; - *d = 0; -} - - -/* Delete the substring of length "len" at index "pos" from "s". - Delete less if out-of-range. */ - -void strdelete(char *s, size_t pos, size_t len) -{ - ptrdiff_t slen; - - if (pos == 0) - return; - --pos; - slen = strlen(s) - pos; - if (slen <= 0) - return; - s += pos; - if ((size_t)slen <= len) - { - *s = 0; - return; - } - while ((*s = s[len])) s++; -} - - -/* Insert string "src" at index "pos" of "dst". */ - -void strinsert(char *src, char *dst, size_t pos) -{ - ptrdiff_t slen, dlen; - - if (pos == 0) - return; - --pos; - dlen = strlen(dst); - dst += dlen; - dlen -= pos; - if (dlen <= 0) - { - strcpy(dst, src); - return; - } - slen = strlen(src); - - do - { - dst[slen] = *dst; - --dst; - } while (--dlen >= 0); - dst++; - while (--slen >= 0) - *dst++ = *src++; -} - /* File functions */ /* Check if at end of file, using Pascal "eof" semantics. End-of-file for diff --git a/src/utils/strings.c b/src/utils/strings.c index 48edb3e..86ded78 100644 --- a/src/utils/strings.c +++ b/src/utils/strings.c @@ -590,3 +590,148 @@ void strwordx(char *buf, char *wrd) strcpy_overlap(buf, buf + i); } +/* Store in "ret" the substring of length "len" starting from "pos" (1-based). + Store a shorter or null string if out-of-range. Return "ret". */ +char *strsub(char *ret, char *s, size_t pos, size_t len) +{ + char *s2; + + if (pos == 0 || len == 0) + { + *ret = '\0'; + return ret; + } + --pos; + + while (pos-- > 0) + { + if (!*s++) + { + *ret = '\0'; + return ret; + } + } + + s2 = ret; + while (len-- > 0) + { + if (!(*s2++ = *s++)) + return ret; + } + + *s2 = '\0'; + return ret; +} + + +/** Return the index of the first occurrence of "pat" as a substring of "s", + starting at index "pos" (1-based). Result is 1-based, 0 if not found. */ +size_t strpos2(char *s, char *pat, size_t pos) +{ + char *cp, ch; + ptrdiff_t slen; + + if (pos == 0) + return 0; + pos--; + slen = strlen(s) - pos; + cp = s + pos; + if (!(ch = *pat++)) + return 0; + pos = strlen(pat); + slen -= pos; + while (--slen >= 0) + { + if (*cp++ == ch && !strncmp(cp, pat, pos)) + return cp - s; + } + return 0; +} + + + +/* Trim blanks at left end of string. */ +char *strltrim(char *s) +{ + while (isspace(*s)) + s++; + return s; +} + +/* Trim blanks at right end of string. */ +char *strrtrim(char *s) +{ + char *s2 = s; + + if (!*s) + return s; + while (*++s2) ; + while (s2 > s && isspace(*--s2)) + *s2 = '\0'; + return s; +} + +/* Copy the substring of length "len" from index "spos" of "s" (1-based) + to index "dpos" of "d", lengthening "d" if necessary. Length and + indices must be in-range. */ +void strmove(size_t len, char *s, size_t spos, char *d, size_t dpos) +{ + s += spos - 1; + d += dpos - 1; + while (*d && len-- > 0) + *d++ = *s++; + + while (len-- > 0) + *d++ = *s++; + *d = 0; +} + +/* Delete the substring of length "len" at index "pos" from "s". + Delete less if out-of-range. */ +void strdelete(char *s, size_t pos, size_t len) +{ + ptrdiff_t slen; + + if (pos == 0) + return; + --pos; + slen = strlen(s) - pos; + if (slen <= 0) + return; + s += pos; + if ((size_t)slen <= len) + { + *s = 0; + return; + } + while ((*s = s[len])) s++; +} + +/* Insert string "src" at index "pos" of "dst". */ +void strinsert(char *src, char *dst, size_t pos) +{ + ptrdiff_t slen, dlen; + + if (pos == 0) + return; + --pos; + dlen = strlen(dst); + dst += dlen; + dlen -= pos; + if (dlen <= 0) + { + strcpy(dst, src); + return; + } + slen = strlen(src); + + do + { + dst[slen] = *dst; + --dst; + } while (--dlen >= 0); + dst++; + while (--slen >= 0) + *dst++ = *src++; +} + diff --git a/src/utils/strlist.c b/src/utils/strlist.c index 6a198fc..b59fc24 100644 --- a/src/utils/strlist.c +++ b/src/utils/strlist.c @@ -1,5 +1,6 @@ #include <utils/p2c.h> #include <utils/strlist.h> +#include <utils/strings.h> void strlist_init(strlist_t **base) { -- GitLab