Rev 495 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
259 | daniel-mar | 1 | /* |
268 | daniel-mar | 2 | This file is part of a common library |
259 | daniel-mar | 3 | Copyright (C) 2002-6 Toby Thain, toby@telegraphics.com.au |
4 | |||
5 | This program is free software; you can redistribute it and/or modify |
||
6 | it under the terms of the GNU General Public License as published by |
||
7 | the Free Software Foundation; either version 2 of the License, or |
||
8 | (at your option) any later version. |
||
9 | |||
10 | This program is distributed in the hope that it will be useful, |
||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
13 | GNU General Public License for more details. |
||
14 | |||
15 | You should have received a copy of the GNU General Public License |
||
16 | along with this program; if not, write to the Free Software |
||
17 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||
18 | */ |
||
19 | |||
20 | #include <string.h> |
||
21 | #include <stdlib.h> |
||
22 | |||
444 | daniel-mar | 23 | #ifdef WIN_ENV |
24 | #include <windows.h> |
||
25 | #endif |
||
26 | |||
259 | daniel-mar | 27 | #include "str.h" |
28 | #include "sprintf_tiny.h" |
||
29 | |||
495 | daniel-mar | 30 | |
31 | void strcpy_advance(TCHAR** str, TCHAR* append) { |
||
32 | xstrcpy(*str, append); |
||
33 | *str += xstrlen(append); |
||
34 | } |
||
35 | |||
36 | void strcpy_advance_a(TCHAR** str, char* append) { |
||
444 | daniel-mar | 37 | #ifdef UNICODE |
495 | daniel-mar | 38 | mbstowcs(*str, append, 1000); |
39 | *str += strlen(append); |
||
40 | #else |
||
41 | strcpy_advance(str, append); |
||
42 | #endif |
||
43 | } |
||
44 | |||
45 | #ifdef UNICODE |
||
444 | daniel-mar | 46 | size_t xstrlen(wchar_t* s) { |
47 | return lstrlen(s); |
||
48 | } |
||
49 | wchar_t* xstrcpy(wchar_t* dst, wchar_t* src) { |
||
50 | return lstrcpy(dst, src); |
||
51 | } |
||
52 | wchar_t* xstrcat(wchar_t* dst, const wchar_t* src) { |
||
53 | return lstrcat(dst, src); |
||
54 | } |
||
55 | wchar_t* xstrrchr(wchar_t* const _Str, const int _Ch) { |
||
56 | return wcsrchr(_Str, _Ch); |
||
57 | } |
||
58 | int xstrcasecmp(const wchar_t* a, const wchar_t* b) { |
||
59 | return _wcsicmp(a, b); |
||
60 | } |
||
460 | daniel-mar | 61 | int xstrcmp(const wchar_t* a, const wchar_t* b) { |
62 | return lstrcmpW(a, b); |
||
63 | } |
||
444 | daniel-mar | 64 | #else |
65 | size_t xstrlen(char* s) { |
||
66 | return strlen(s); |
||
67 | } |
||
68 | char* xstrcpy(char* dst, char* src) { |
||
69 | return strcpy(dst, src); |
||
70 | } |
||
71 | char* xstrcat(char* dst, const char* src) { |
||
72 | return strcat(dst, src); |
||
73 | } |
||
74 | char* xstrrchr(char* const _Str, const int _Ch) { |
||
75 | return strrchr(_Str, _Ch); |
||
76 | } |
||
77 | int xstrcasecmp(const char* a, const char* b) { |
||
78 | //return strcasecmp(a, b); |
||
79 | return _stricmp(a, b); |
||
80 | } |
||
460 | daniel-mar | 81 | int xstrcmp(const char* a, const char* b) { |
82 | return strcmp(a, b); |
||
83 | } |
||
444 | daniel-mar | 84 | #endif |
85 | |||
259 | daniel-mar | 86 | // convert C (null-terminated) to Pascal (length byte) string |
87 | // no bounds checking |
||
88 | unsigned char *myc2pstr(char *s){ |
||
89 | size_t n = strlen(s); |
||
90 | memmove(s+1,s,n); |
||
91 | *s = (unsigned char)n; |
||
92 | return (unsigned char*)s; |
||
93 | } |
||
94 | |||
95 | // convert Pascal string to C string |
||
96 | // no bounds checking |
||
97 | char *myp2cstr(unsigned char *s){ |
||
98 | int n = *s; |
||
99 | memmove(s,s+1,n); |
||
100 | s[n] = 0; |
||
101 | return (char*)s; |
||
102 | } |
||
103 | |||
104 | // copy Pascal string to C string |
||
105 | // no bounds checking |
||
106 | char *myp2cstrcpy(char *dst,const unsigned char *src){ |
||
107 | memcpy(dst,src+1,src[0]); |
||
108 | dst[src[0]] = 0; |
||
109 | return dst; |
||
110 | } |
||
366 | daniel-mar | 111 | |
112 | // copy C string to Pascal string |
||
259 | daniel-mar | 113 | unsigned char *myc2pstrcpy(unsigned char *dst,const char *src){ |
114 | size_t n = strlen(src); |
||
115 | *dst = n <= 255 ? (unsigned char)n : 255; |
||
116 | memcpy(dst+1,src,*dst); |
||
117 | return dst; |
||
118 | } |
||
119 | |||
120 | // copy null-terminated string; |
||
121 | // returns pointer after last character copied |
||
122 | char *cat(char *d,char *s){ |
||
123 | while( (*d = *s++) ) |
||
124 | d++; |
||
125 | return d; |
||
126 | } |
||
127 | |||
355 | daniel-mar | 128 | /* |
259 | daniel-mar | 129 | void *my_memset(void *dst, int val, size_t len){ |
130 | char *p; |
||
131 | for(p=(char*)dst;len--;) |
||
132 | *p++ = val; |
||
133 | return dst; |
||
134 | } |
||
355 | daniel-mar | 135 | */ |
136 | |||
137 | // my_strdup() is like _strdup(), with the difference that it accepts "char*" instead of "const char*" as argument |
||
259 | daniel-mar | 138 | char *my_strdup(char *s){ |
139 | size_t n = strlen(s); |
||
140 | char *p = (char*)malloc(n+1); |
||
141 | if(p) |
||
142 | memcpy(p,s,n+1); |
||
143 | return p; |
||
144 | } |
||
145 | |||
440 | daniel-mar | 146 | // DM 03.12.2021 removed, because it is not used in Filter Foundry |
147 | /* |
||
259 | daniel-mar | 148 | unsigned char *PLcstrcpy(unsigned char *s1,const char *s2){ |
149 | size_t n = strlen(s2); |
||
150 | if(n>255) |
||
151 | n = 255; |
||
152 | memcpy(s1+1,s2,n); |
||
153 | *s1 = (unsigned char)n; |
||
154 | return s1; |
||
155 | } |
||
440 | daniel-mar | 156 | */ |
259 | daniel-mar | 157 | |
440 | daniel-mar | 158 | // DM 03.12.2021 removed, because it is not used in Filter Foundry |
159 | /* |
||
259 | daniel-mar | 160 | unsigned char *PLcstrcat(unsigned char * str1,const char * s2){ |
161 | size_t n = strlen(s2); |
||
162 | if(str1[0]+n > 255) |
||
163 | n = 255 - str1[0]; |
||
164 | memcpy(str1+1+str1[0],s2,n); |
||
165 | str1[0] += (unsigned char)n; |
||
166 | return str1; |
||
167 | } |
||
440 | daniel-mar | 168 | */ |
512 | daniel-mar | 169 | |
170 | void strcpy_win_replace_ampersand(char* dst, char* src) { |
||
171 | size_t i; |
||
172 | for (i = 0; i < strlen(src); i++) { |
||
173 | #ifdef WIN_ENV |
||
174 | // & needs to be replaced to && in: |
||
175 | // - Labels (SETCTLTEXT) |
||
176 | // - Menu items (i.e. PIPL) |
||
177 | // It is not required in: |
||
178 | // - Filedialog FileName |
||
179 | // - MessageBox title or content |
||
180 | // - Window titles |
||
181 | // - Input boxes, e.g. import+export of an existing filter |
||
182 | if (src[i] == '&') { |
||
183 | *dst++ = src[i]; |
||
184 | } |
||
185 | #endif |
||
186 | * dst++ = src[i]; |
||
187 | } |
||
188 | *dst++ = '\0'; |
||
189 | } |