1/*
2Open Tracker License
3
4Terms and Conditions
5
6Copyright (c) 1991-2001, Be Incorporated. All rights reserved.
7
8Permission is hereby granted, free of charge, to any person obtaining a copy of
9this software and associated documentation files (the "Software"), to deal in
10the Software without restriction, including without limitation the rights to
11use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
12of the Software, and to permit persons to whom the Software is furnished to do
13so, subject to the following conditions:
14
15The above copyright notice and this permission notice applies to all licensees
16and shall be included in all copies or substantial portions of the Software.
17
18THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF TITLE, MERCHANTABILITY,
20FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21BE INCORPORATED BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION
23WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
25Except as contained in this notice, the name of Be Incorporated shall not be
26used in advertising or otherwise to promote the sale, use or other dealings in
27this Software without prior written authorization from Be Incorporated.
28
29BeMail(TM), Tracker(TM), Be(R), BeOS(R), and BeIA(TM) are trademarks or registered trademarks
30of Be Incorporated in the United States and other countries. Other brand product
31names are registered trademarks or trademarks of their respective holders.
32All rights reserved.
33*/
34
35
36#include "Utilities.h"
37
38#include <fs_attr.h>
39#include <Node.h>
40#include <String.h>
41#include <TypeConstants.h>
42
43#include <stdio.h>
44#include <stdlib.h>
45#include <string.h>
46
47
48status_t
49WriteAttrString(BNode* node, const char* attr, const char* value)
50{
51	if (!value)
52		value = B_EMPTY_STRING;
53
54	ssize_t size = node->WriteAttr(attr, B_STRING_TYPE, 0, value,
55		strlen(value) + 1);
56
57	return size >= 0 ? B_OK : size;
58}
59
60
61//====================================================================
62// case-insensitive version of strcmp
63//
64
65int32
66cistrcmp(const char* str1, const char* str2)
67{
68	char	c1;
69	char	c2;
70	int32	len;
71	int32	loop;
72
73	len = strlen(str1) + 1;
74	for (loop = 0; loop < len; loop++) {
75		c1 = str1[loop];
76		if (c1 >= 'A' && c1 <= 'Z')
77			c1 += 'a' - 'A';
78		c2 = str2[loop];
79		if (c2 >= 'A' && c2 <= 'Z')
80			c2 += 'a' - 'A';
81		if (c1 == c2) {
82		} else if (c1 < c2) {
83			return -1;
84		} else if (c1 > c2 || !c2) {
85			return 1;
86		}
87	}
88	return 0;
89}
90
91
92//====================================================================
93// case-insensitive version of strncmp
94//
95
96int32
97cistrncmp(const char* str1, const char* str2, int32 max)
98{
99	char		c1;
100	char		c2;
101	int32		loop;
102
103	for (loop = 0; loop < max; loop++) {
104		c1 = *str1++;
105		if (c1 >= 'A' && c1 <= 'Z')
106			c1 += 'a' - 'A';
107		c2 = *str2++;
108		if (c2 >= 'A' && c2 <= 'Z')
109			c2 += 'a' - 'A';
110		if (c1 == c2) {
111		} else if (c1 < c2) {
112			return -1;
113		} else if (c1 > c2 || !c2) {
114			return 1;
115		}
116	}
117	return 0;
118}
119
120
121//--------------------------------------------------------------------
122// case-insensitive version of strstr
123//
124
125char*
126cistrstr(const char* cs, const char* ct)
127{
128	char		c1;
129	char		c2;
130	int32		cs_len;
131	int32		ct_len;
132	int32		loop1;
133	int32		loop2;
134
135	cs_len = strlen(cs);
136	ct_len = strlen(ct);
137	for (loop1 = 0; loop1 < cs_len; loop1++) {
138		if (cs_len - loop1 < ct_len)
139			return NULL;
140
141		for (loop2 = 0; loop2 < ct_len; loop2++) {
142			c1 = cs[loop1 + loop2];
143			if ((c1 >= 'A') && (c1 <= 'Z'))
144				c1 += ('a' - 'A');
145			c2 = ct[loop2];
146			if ((c2 >= 'A') && (c2 <= 'Z'))
147				c2 += ('a' - 'A');
148			if (c1 != c2)
149				goto next;
150		}
151		return const_cast<char*>(&cs[loop1]);
152next:
153		// label must be followed by a statement
154		;
155	}
156	return NULL;
157}
158
159
160//--------------------------------------------------------------------
161// return length of \n terminated line
162//
163
164int32
165linelen(char* str, int32 len, bool header)
166{
167	int32		loop;
168
169	for (loop = 0; loop < len; loop++) {
170		if (str[loop] == '\n') {
171			if (!header || loop < 2
172				|| (header && str[loop + 1] != ' ' && str[loop + 1] != '\t'))
173				return loop + 1;
174		}
175	}
176	return len;
177}
178
179