]>
git.saurik.com Git - apt.git/blob - apt-pkg/contrib/strutl.cc
1 // -*- mode: cpp; mode: fold -*-
3 // $Id: strutl.cc,v 1.1 1998/07/07 04:17:16 jgg Exp $
4 /* ######################################################################
6 String Util - Some usefull string functions.
8 strstrip - Remove whitespace from the front and end of a line.
10 This source is placed in the Public Domain, do with it what you will
11 It was originally written by Jason Gunthorpe <jgg@gpu.srv.ualberta.ca>
13 ##################################################################### */
22 // strstrip - Remove white space from the front and back of a string /*{{{*/
23 // ---------------------------------------------------------------------
24 /* This is handy to use when parsing a file. It also removes \n's left
25 over from fgets and company */
26 char *_strstrip(char *String
)
28 for (;*String
!= 0 && (*String
== ' ' || *String
== '\t'); String
++);
33 char *End
= String
+ strlen(String
) - 1;
34 for (;End
!= String
- 1 && (*End
== ' ' || *End
== '\t' || *End
== '\n' ||
35 *End
== '\r'); End
--);
41 // strtabexpand - Converts tabs into 8 spaces /*{{{*/
42 // ---------------------------------------------------------------------
44 char *_strtabexpand(char *String
,size_t Len
)
46 for (char *I
= String
; I
!= I
+ Len
&& *I
!= 0; I
++)
50 if (I
+ 8 > String
+ Len
)
56 /* Assume the start of the string is 0 and find the next 8 char
62 Len
= 8 - ((String
- I
) % 8);
70 memmove(I
+ Len
,I
+ 1,strlen(I
) + 1);
71 for (char *J
= I
; J
+ Len
!= I
; *I
= ' ', I
++);
76 // ParseQuoteWord - Parse a single word out of a string /*{{{*/
77 // ---------------------------------------------------------------------
78 /* This grabs a single word, converts any % escaped characters to their
79 proper values and advances the pointer. Double quotes are understood
80 and striped out as well. */
81 bool ParseQuoteWord(const char *&String
,string
&Res
)
83 // Skip leading whitespace
84 const char *C
= String
;
85 for (;*C
!= 0 && *C
== ' '; C
++);
89 // Jump to the next word
90 for (;*C
!= 0 && *C
!= ' '; C
++)
94 for (C
++;*C
!= 0 && *C
!= '"'; C
++);
100 // Now de-quote characters
103 const char *Start
= String
;
105 for (I
= Buffer
; I
< Buffer
+ sizeof(Buffer
) && Start
!= C
; I
++)
107 if (*Start
== '%' && Start
+ 2 < C
)
112 *I
= (char)strtol(Tmp
,0,16);
125 // Skip ending white space
126 for (;*C
!= 0 && *C
== ' '; C
++);
131 // QuoteString - Convert a string into quoted from /*{{{*/
132 // ---------------------------------------------------------------------
134 string
QuoteString(string Str
,const char *Bad
)
137 for (string::iterator I
= Str
.begin(); I
!= Str
.end(); I
++)
139 if (strchr(Bad
,*I
) != 0 || isprint(*I
) == 0 ||
140 *I
<= 0x20 || *I
>= 0x7F)
143 sprintf(Buf
,"%%%02x",(int)*I
);
152 // SizeToStr - Convert a long into a human readable size /*{{{*/
153 // ---------------------------------------------------------------------
154 /* A max of 4 digits are shown before conversion to the next highest unit. The
155 max length of the string will be 5 chars unless the size is > 10
157 string
SizeToStr(double Size
)
166 /* bytes, KiloBytes, MegaBytes, GigaBytes, TeraBytes, PetaBytes,
167 ExaBytes, ZettaBytes, YottaBytes */
168 char Ext
[] = {'b','k','M','G','T','P','E','Z','Y'};
172 if (ASize
< 100 && I
!= 0)
174 sprintf(S
,"%.1f%c",ASize
,Ext
[I
]);
180 sprintf(S
,"%.0f%c",ASize
,Ext
[I
]);
190 // TimeToStr - Convert the time into a string /*{{{*/
191 // ---------------------------------------------------------------------
192 /* Converts a number of seconds to a hms format */
193 string
TimeToStr(unsigned long Sec
)
201 sprintf(S
,"%lid %lih%lim%lis",Sec
/60/60/24,(Sec
/60/60) % 24,(Sec
/60) % 60,Sec
% 60);
207 sprintf(S
,"%lih%lim%lis",Sec
/60/60,(Sec
/60) % 60,Sec
% 60);
213 sprintf(S
,"%lim%lis",Sec
/60,Sec
% 60);
217 sprintf(S
,"%lis",Sec
);
224 // SubstVar - Substitute a string for another string /*{{{*/
225 // ---------------------------------------------------------------------
226 /* This replaces all occurances of Subst with Contents in Str. */
227 string
SubstVar(string Str
,string Subst
,string Contents
)
229 string::size_type Pos
;
230 string::size_type OldPos
= 0;
233 while (OldPos
< Str
.length() &&
234 (Pos
= Str
.find(Subst
,OldPos
)) != string::npos
)
236 Temp
+= string(Str
,OldPos
,Pos
) + Contents
;
237 OldPos
= Pos
+ Subst
.length();
243 return Temp
+ string(Str
,OldPos
);
246 // Base64Encode - Base64 Encoding routine for short strings /*{{{*/
247 // ---------------------------------------------------------------------
248 /* This routine performs a base64 transformation on a string. It was ripped
249 from wget and then patched and bug fixed.
251 This spec can be found in rfc2045 */
252 string
Base64Encode(string S
)
255 static char tbl
[64] = {'A','B','C','D','E','F','G','H',
256 'I','J','K','L','M','N','O','P',
257 'Q','R','S','T','U','V','W','X',
258 'Y','Z','a','b','c','d','e','f',
259 'g','h','i','j','k','l','m','n',
260 'o','p','q','r','s','t','u','v',
261 'w','x','y','z','0','1','2','3',
262 '4','5','6','7','8','9','+','/'};
264 // Pre-allocate some space
266 Final
.reserve((4*S
.length() + 2)/3 + 2);
268 /* Transform the 3x8 bits to 4x6 bits, as required by
270 for (string::const_iterator I
= S
.begin(); I
< S
.end(); I
+= 3)
272 char Bits
[3] = {0,0,0};
279 Final
+= tbl
[Bits
[0] >> 2];
280 Final
+= tbl
[((Bits
[0] & 3) << 4) + (Bits
[1] >> 4)];
282 if (I
+ 1 >= S
.end())
285 Final
+= tbl
[((Bits
[1] & 0xf) << 2) + (Bits
[2] >> 6)];
287 if (I
+ 2 >= S
.end())
290 Final
+= tbl
[Bits
[2] & 0x3f];
293 /* Apply the padding elements, this tells how many bytes the remote
294 end should discard */
295 if (S
.length() % 3 == 2)
297 if (S
.length() % 3 == 1)
303 // stringcmp - Arbitary string compare /*{{{*/
304 // ---------------------------------------------------------------------
305 /* This safely compares two non-null terminated strings of arbitary
307 int stringcmp(const char *A
,const char *AEnd
,const char *B
,const char *BEnd
)
309 for (; A
!= AEnd
&& B
!= BEnd
; A
++, B
++)
313 if (A
== AEnd
&& B
== BEnd
)
324 // stringcasecmp - Arbitary case insensitive string compare /*{{{*/
325 // ---------------------------------------------------------------------
327 int stringcasecmp(const char *A
,const char *AEnd
,const char *B
,const char *BEnd
)
329 for (; A
!= AEnd
&& B
!= BEnd
; A
++, B
++)
330 if (toupper(*A
) != toupper(*B
))
333 if (A
== AEnd
&& B
== BEnd
)
339 if (toupper(*A
) < toupper(*B
))