You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
4.1 KiB
126 lines
4.1 KiB
/*************
|
|
* Header file for string.c
|
|
* 1999 E. Rouat
|
|
************/
|
|
|
|
#ifndef ngspice_STRINGUTIL_H
|
|
#define ngspice_STRINGUTIL_H
|
|
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
|
|
#include "ngspice/config.h"
|
|
#include "ngspice/bool.h"
|
|
|
|
|
|
#ifdef __GNUC__
|
|
#define ATTR_TPRINTF __attribute__ ((format (__printf__, 1, 2)))
|
|
#else
|
|
#define ATTR_TPRINTF
|
|
#endif
|
|
|
|
|
|
/* Structure for storing state to find substring matches in a string */
|
|
struct substring_match_info {
|
|
/* Input data */
|
|
size_t n_char_pattern; /* length of pattern being located */
|
|
const char *p_pattern; /* pattern to find */
|
|
size_t n_char_string; /* length of string to search */
|
|
const char *p_string; /* String to search. Final null not required */
|
|
bool f_overlap; /* flag that substring matches can overlap */
|
|
|
|
/* Intermediate results */
|
|
size_t n_char_pattern_1; /* length of pattern being located - 1 */
|
|
size_t msb_factor; /* constant related to updating hash */
|
|
size_t h_pattern; /* hash value of pattern */
|
|
size_t h_string; /* current hash value of string */
|
|
const char *p_last; /* last possible substring match location */
|
|
bool f_done; /* flag that last match was found */
|
|
};
|
|
|
|
void appendc(char *s, char c);
|
|
int cieq(const char *p, const char *s);
|
|
int cieqn(const char *p, const char *s, size_t n);
|
|
int ciprefix(const char *p, const char *s);
|
|
char *dup_string(const char *str, size_t n_char);
|
|
char *find_first_of(const char *haystack,
|
|
unsigned int n_needle, const char *p_needle);
|
|
int get_comma_separated_values(char *values[], char *str);
|
|
int get_int_n(const char *str, size_t n, int *p_value);
|
|
#ifdef COMPILE_UNUSED_FUNCTIONS
|
|
size_t get_substring_matches(size_t n_char_pattern, const char *p_pattern,
|
|
size_t n_char_string, const char *p_string,
|
|
size_t n_elem_buf, char *p_match_buf, bool f_overlap);
|
|
#endif
|
|
char *gettok(char **s);
|
|
char *gettok_char(char **s, char p, bool inc_p, bool nested);
|
|
char *gettok_instance(char **);
|
|
bool has_escape_or_quote(size_t n, const char *str);
|
|
bool is_arith_char(char c);
|
|
bool isquote(char ch);
|
|
int model_name_match(const char *token, const char *model_name);
|
|
int prefix(const char *p, const char *s);
|
|
int prefix_n(size_t n_char_prefix, const char *prefix,
|
|
size_t n_char_string, const char *string);
|
|
int scannum_adv(char **p_str);
|
|
bool str_has_arith_char(char *s);
|
|
char *stripWhiteSpacesInsideParens(const char *str);
|
|
void strtolower(char *str);
|
|
void strtoupper(char *str);
|
|
void substring_match_init(size_t n_char_pattern, const char *p_pattern,
|
|
size_t n_char_string, const char *p_string, bool f_overlap,
|
|
struct substring_match_info *p_scan_state);
|
|
char *substring_match_next(struct substring_match_info *p_scan_state);
|
|
int substring_n(size_t n_char_pattern, const char *p_pattern,
|
|
size_t n_char_str, const char *p_str);
|
|
char *tprintf(const char *fmt, ...) ATTR_TPRINTF;
|
|
char *tvprintf(const char *fmt, va_list args);
|
|
|
|
|
|
|
|
/* Allocate and create a copy of a string if the argument is not null or
|
|
* returns null if it is. */
|
|
inline char *copy(const char *str)
|
|
{
|
|
return str == (char *) NULL ?
|
|
(char *) NULL : dup_string(str, strlen(str));
|
|
} /* end of function copy */
|
|
|
|
|
|
|
|
/* Allocate a buffer and copy a substring, from 'str' to 'end'
|
|
* including *str, excluding *end
|
|
*/
|
|
inline char *copy_substring(const char *str, const char *end)
|
|
{
|
|
return dup_string(str, (size_t) (end - str));
|
|
} /* end of function copy_substring */
|
|
|
|
|
|
|
|
/* Try to identify an unsigned integer that begins a string. Stop when a
|
|
* non- numeric character is reached. There is no way to distinguish
|
|
* between a value of 0 and a string that does not contain a numeric
|
|
* value. */
|
|
inline int scannum(const char *str)
|
|
{
|
|
return scannum_adv((char **) &str);
|
|
} /* end of function scannum */
|
|
|
|
|
|
|
|
/* Determine whether sub is a substring of str. */
|
|
inline int substring(const char *sub, const char *str)
|
|
{
|
|
return strstr(str, sub) != (char *) NULL;
|
|
} /* end of function substring */
|
|
|
|
#ifdef CIDER
|
|
/* cider integration */
|
|
|
|
int cinprefix(register char *p, register char *s, register int n);
|
|
int cimatch(register char *p, register char *s);
|
|
#endif
|
|
|
|
|
|
#endif /* include guard */
|