e0522e60dd015a2e719a3d623057a85303877cca
[blender.git] / source / blender / blenlib / intern / string.c
1 /* util.c
2  *
3  * various string, file, list operations.
4  *
5  *
6  * $Id: util.c 17433 2008-11-12 21:16:53Z blendix $
7  *
8  * ***** BEGIN GPL LICENSE BLOCK *****
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software Foundation,
22  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23  *
24  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
25  * All rights reserved.
26  *
27  * The Original Code is: all of this file.
28  *
29  * Contributor(s): none yet.
30  *
31  * ***** END GPL LICENSE BLOCK *****
32  * 
33  */
34
35 #include <stdio.h>
36 #include <string.h>
37 #include <stdlib.h>
38 #include <stdarg.h>
39 #include <ctype.h>
40
41 #include "MEM_guardedalloc.h"
42
43 #include "BLI_string.h"
44
45 char *BLI_strdupn(const char *str, int len) {
46         char *n= MEM_mallocN(len+1, "strdup");
47         memcpy(n, str, len);
48         n[len]= '\0';
49         
50         return n;
51 }
52 char *BLI_strdup(const char *str) {
53         return BLI_strdupn(str, strlen(str));
54 }
55
56 char *BLI_strncpy(char *dst, const char *src, int maxncpy) {
57         int srclen= strlen(src);
58         int cpylen= (srclen>(maxncpy-1))?(maxncpy-1):srclen;
59         
60         memcpy(dst, src, cpylen);
61         dst[cpylen]= '\0';
62         
63         return dst;
64 }
65
66 int BLI_snprintf(char *buffer, size_t count, const char *format, ...)
67 {
68         int n;
69         va_list arg;
70
71         va_start(arg, format);
72         n = vsnprintf(buffer, count, format, arg);
73         
74         if (n != -1 && n < count) {
75                 buffer[n] = '\0';
76         } else {
77                 buffer[count-1] = '\0';
78         }
79         
80         va_end(arg);
81         return n;
82 }
83
84 int BLI_streq(char *a, char *b) {
85         return (strcmp(a, b)==0);
86 }
87 int BLI_strcaseeq(char *a, char *b) {
88         return (BLI_strcasecmp(a, b)==0);
89 }
90
91 /* strcasestr not available in MSVC */
92 char *BLI_strcasestr(const char *s, const char *find)
93 {
94     register char c, sc;
95     register size_t len;
96         
97     if ((c = *find++) != 0) {
98                 c= tolower(c);
99                 len = strlen(find);
100                 do {
101                         do {
102                                 if ((sc = *s++) == 0)
103                                         return (NULL);
104                                 sc= tolower(sc);
105                         } while (sc != c);
106                 } while (BLI_strncasecmp(s, find, len) != 0);
107                 s--;
108     }
109     return ((char *) s);
110 }
111
112
113 int BLI_strcasecmp(const char *s1, const char *s2) {
114         int i;
115
116         for (i=0; ; i++) {
117                 char c1 = tolower(s1[i]);
118                 char c2 = tolower(s2[i]);
119
120                 if (c1<c2) {
121                         return -1;
122                 } else if (c1>c2) {
123                         return 1;
124                 } else if (c1==0) {
125                         break;
126                 }
127         }
128
129         return 0;
130 }
131
132 int BLI_strncasecmp(const char *s1, const char *s2, int n) {
133         int i;
134
135         for (i=0; i<n; i++) {
136                 char c1 = tolower(s1[i]);
137                 char c2 = tolower(s2[i]);
138
139                 if (c1<c2) {
140                         return -1;
141                 } else if (c1>c2) {
142                         return 1;
143                 } else if (c1==0) {
144                         break;
145                 }
146         }
147
148         return 0;
149 }
150
151 void BLI_timestr(double _time, char *str)
152 {
153         /* format 00:00:00.00 (hr:min:sec) string has to be 12 long */
154         int  hr= ( (int)  _time) / (60*60);
155         int min= (((int)  _time) / 60 ) % 60;
156         int sec= ( (int) (_time)) % 60;
157         int hun= ( (int) (_time   * 100.0)) % 100;
158         
159         if (hr) {
160                 sprintf(str, "%.2d:%.2d:%.2d.%.2d",hr,min,sec,hun);
161         } else {
162                 sprintf(str, "%.2d:%.2d.%.2d",min,sec,hun);
163         }
164         
165         str[11]=0;
166 }