//
// $Id: str.cc,v 1.1.1.1 2000/11/29 13:21:08 dredd Exp $
//
// $Source: /cvsroot/hammerhead/hammerhead/utils/str.cc,v $
// $Revision: 1.1.1.1 $
// $Date: 2000/11/29 13:21:08 $
// $State: Exp $
//
// Author: Geoff Wong
//
/*
* Some string support routines
*/
#include <stdio.h>
#include <stdlib.h>
#include "str.h"
#define MAXTMP 256
char * string_copy(const char * s)
{
char * ret;
ret = new char[strlen(s)+1];
strcpy(ret,s);
return ret;
}
/* 256 should be long enough for any integer we're printing! */
String itoa(int x)
{
char tmp[MAXTMP];
sprintf(tmp, "%d", x);
String out(tmp);
return out;
}
/* 256 should be long enough for any integer we're printing! */
String itodot(int x)
{
/* assume that x is in network order. */
char tmp[MAXTMP];
int a,b,c,d;
a = x & 0xff000000;
b = x & 0x00ff0000;
c = x & 0x0000ff00;
d = x & 0x000000ff;
sprintf(tmp, "%d.%d.%d.%d", a,b,c,d);
String out(tmp);
return out;
}
// itoa - same except pad it to a certain width with '0's.
String itoa(int x, int width, char pad)
{
char tmp[MAXTMP];
int i, l;
if (width > MAXTMP) width = MAXTMP;
sprintf(tmp, "%*d", width, x);
l = strlen(tmp);
for (i = 0; i < l; i++)
{
if (tmp[i] == ' ') tmp[i] = pad;
}
String out(tmp);
return out;
}
String randomstr(int width)
{
char tmp[width];
memset(tmp, width, sizeof(char));
String ret(tmp, width);
for (int i = 0; i < width; i++)
{
ret[i] = (char)(random()%254 + 1);
}
return ret;
}
int split(String instr, String * outarr, int max, String sep)
{
int i = -1, oldi = -1;
int count = 0;
while ((i = instr.find(sep, i+1)) != -1 && count < max)
{
outarr[count++] = instr.substr(oldi+1, i);
oldi = i;
}
outarr[count++] = instr.substr(oldi+1, instr.length());
return count;
}
int gsub(String& str, const String& pat, const String& repl)
{
#ifdef FreeBSD
return str.gsub(pat, repl);
#else
int x = 0;
int count = 0;
while (x != -1)
{
x = str.find(pat, x+1);
str.replace(x, pat.length(), repl);
count++;
}
return count;
#endif
}
int reggsub(String& str, const String& regpat, const String& repl)
{
#ifdef FreeBSD
Regex rstr = regpat.c_str();
return str.gsub(rstr, repl);
#else
int count = 0;
int status;
int len;
int x = 0;
regex_t re;
regmatch_t pmatch[1];
const char * cstr;
if (regcomp(&re, regpat.c_str(), REG_EXTENDED) != 0)
{
/* report error? */
return(0);
}
cstr = str.c_str();
while (1)
{
status = regexec(&re, &(cstr[x]), (size_t) 1, pmatch, 0);
if (status != 0)
{
break;
}
if (pmatch[0].rm_so == -1) break;
len = pmatch[0].rm_eo - pmatch[0].rm_so;
str.replace(pmatch[0].rm_eo, len, repl);
x = pmatch[0].rm_so + 1;
count++;
}
regfree(&re);
return count;
#endif
}
int regfind(const String& str, const String& pat)
{
int status;
regex_t re;
regmatch_t pmatch[1];
const char * cstr;
if (regcomp(&re, pat.c_str(), REG_EXTENDED) != 0)
{
/* report error? */
return -1;
}
cstr = str.c_str();
status = regexec(&re, cstr, (size_t) 1, pmatch, 0);
if (status != 0)
{
return -1;
}
return pmatch[0].rm_so;
}
#if 0
// Testing shit.
main()
{
String x;
x = itoa(7,2, ' ');
printf("random:#%s#\n", randomstr(20).c_str());
}
#endif
syntax highlighted by Code2HTML, v. 0.9.1