blob: 634d1f1815ae4c442610db945848c2063dd87d79 [file] [log] [blame]
Jim Cownie5e8470a2013-09-27 10:38:44 +00001/*
2 * kmp_str.h -- String manipulation routines.
3 * $Revision: 42613 $
4 * $Date: 2013-08-23 13:29:50 -0500 (Fri, 23 Aug 2013) $
5 */
6
7
8//===----------------------------------------------------------------------===//
9//
10// The LLVM Compiler Infrastructure
11//
12// This file is dual licensed under the MIT and the University of Illinois Open
13// Source Licenses. See LICENSE.txt for details.
14//
15//===----------------------------------------------------------------------===//
16
17
18#ifndef KMP_STR_H
19#define KMP_STR_H
20
21#include <string.h>
22#include <stdarg.h>
23
24#include "kmp_os.h"
25
26#ifdef __cplusplus
27 extern "C" {
28#endif // __cplusplus
29
30#if KMP_OS_WINDOWS
31 #define strdup _strdup
32 #define snprintf _snprintf
33 #define vsnprintf _vsnprintf
34#endif
35
36/* some macros to replace ctype.h functions */
37#define TOLOWER(c) ((((c) >= 'A') && ((c) <= 'Z')) ? ((c) + 'a' - 'A') : (c))
38
39struct kmp_str_buf {
40 char * str; // Pointer to buffer content, read only.
41 unsigned int size; // Do not change this field!
42 int used; // Number of characters printed to buffer, read only.
43 char bulk[ 512 ]; // Do not use this field!
44}; // struct kmp_str_buf
45typedef struct kmp_str_buf kmp_str_buf_t;
46
47#define __kmp_str_buf_init( b ) { (b)->str = (b)->bulk; (b)->size = sizeof( (b)->bulk ); (b)->used = 0; (b)->bulk[ 0 ] = 0; }
48
49void __kmp_str_buf_clear( kmp_str_buf_t * buffer );
50void __kmp_str_buf_reserve( kmp_str_buf_t * buffer, int size );
51void __kmp_str_buf_detach( kmp_str_buf_t * buffer );
52void __kmp_str_buf_free( kmp_str_buf_t * buffer );
53void __kmp_str_buf_cat( kmp_str_buf_t * buffer, char const * str, int len );
54void __kmp_str_buf_vprint( kmp_str_buf_t * buffer, char const * format, va_list args );
55void __kmp_str_buf_print( kmp_str_buf_t * buffer, char const * format, ... );
56void __kmp_str_buf_print_size( kmp_str_buf_t * buffer, size_t size );
57
58/*
59 File name parser. Usage:
60
61 kmp_str_fname_t fname = __kmp_str_fname_init( path );
62 // Use fname.path (copy of original path ), fname.dir, fname.base.
63 // Note fname.dir concatenated with fname.base gives exact copy of path.
64 __kmp_str_fname_free( & fname );
65
66*/
67struct kmp_str_fname {
68 char * path;
69 char * dir;
70 char * base;
71}; // struct kmp_str_fname
72typedef struct kmp_str_fname kmp_str_fname_t;
73void __kmp_str_fname_init( kmp_str_fname_t * fname, char const * path );
74void __kmp_str_fname_free( kmp_str_fname_t * fname );
75// Compares file name with specified patern. If pattern is NULL, any fname matched.
76int __kmp_str_fname_match( kmp_str_fname_t const * fname, char const * pattern );
77
78/*
79 The compiler provides source locations in string form ";file;func;line;col;;". It not not
80 convenient for manupulation. These structure keeps source location in more convenient form.
81 Usage:
82
83 kmp_str_loc_t loc = __kmp_str_loc_init( ident->psource, 0 );
84 // use loc.file, loc.func, loc.line, loc.col.
85 // loc.fname is available if the second argument of __kmp_str_loc_init is true.
86 __kmp_str_loc_free( & loc );
87
88 If psource is NULL or does not follow format above, file and/or func may be NULL pointers.
89*/
90struct kmp_str_loc {
91 char * _bulk; // Do not use thid field.
92 kmp_str_fname_t fname; // Will be initialized if init_fname is true.
93 char * file;
94 char * func;
95 int line;
96 int col;
97}; // struct kmp_str_loc
98typedef struct kmp_str_loc kmp_str_loc_t;
99kmp_str_loc_t __kmp_str_loc_init( char const * psource, int init_fname );
100void __kmp_str_loc_free( kmp_str_loc_t * loc );
101
102int __kmp_str_eqf( char const * lhs, char const * rhs );
103char * __kmp_str_format( char const * format, ... );
104void __kmp_str_free( char const * * str );
105int __kmp_str_match( char const * target, int len, char const * data );
106int __kmp_str_match_false( char const * data );
107int __kmp_str_match_true( char const * data );
108void __kmp_str_replace( char * str, char search_for, char replace_with );
109void __kmp_str_split( char * str, char delim, char ** head, char ** tail );
110char * __kmp_str_token( char * str, char const * delim, char ** buf );
111int __kmp_str_to_int( char const * str, char sentinel );
112
113void __kmp_str_to_size( char const * str, size_t * out, size_t dfactor, char const * * error );
114void __kmp_str_to_uint( char const * str, kmp_uint64 * out, char const * * error );
115
116#ifdef __cplusplus
117 } // extern "C"
118#endif // __cplusplus
119
120#endif // KMP_STR_H
121
122// end of file //
123