This is stringstuff.c in view mode; [Download] [Up]
/* $Id: stringstuff.c,v 1.2 1995/12/19 19:30:47 eilts Exp eilts $ */
#include "bbs.h"
void rm_ae_blanks(char *str)
{
char *sp1, *sp2;
for (sp1=str; *sp1 == ' '; sp1++) ;
if (sp1 != str) {
for (sp2=str; *sp1; sp1++,sp2++) *sp2 = *sp1;
*sp2 = '\0';
}
for (sp1=str; *sp1; sp1++) ;
if (sp1 == str) return;
sp1--;
while (*sp1 == ' ') *sp1-- = '\0';
return;
}
char *splittoken(char *str, const char splitchar, const int nr)
{
int k=0;
char *sp=NULL;
sp = str;
while (k < nr && *sp) {
if (*sp == splitchar) k++;
sp++;
}
while (*sp == splitchar) sp++;
return sp;
}
char getarg(char arg[], const char *args)
{
char option, *sp;
static const char *ap;
if (arg == NULL) {
ap = args;
return '\0';
}
while (*ap == ' ') ++ap;
if (*ap == '-') {
ap++;
option = *ap;
ap++;
while (*ap == ' ') ++ap;
for (sp=arg; (*ap != '-' || *(ap-1) != ' ') && *ap; *sp++ = *ap++) ;
*sp = '\0';
while (*--sp == ' ') *sp = '\0';
}
else {
option = '\0';
strcpy(arg,ap);
}
return option;
}
char *recode(char *rstr, const char ch, const char cascii)
{
static int c_chfilter_iso_next[] = /* 000-255 */
{
0, 1, 2, 3, 4, 5, 6, 7, /* 000-007 */
8, 9, 10, 11, 12, 13, 14, 15, /* 008-015 */
16, 17, 18, 19, 20, 21, 22, 23, /* 016-023 */
24, 25, 26, 27, 28, 29, 30, 31, /* 024-031 */
32, 33, 34, 35, 36, 37, 38, 39, /* 032-039 */
40, 41, 42, 43, 44, 45, 46, 47, /* 040-047 */
48, 49, 50, 51, 52, 53, 54, 55, /* 048-055 */
56, 57, 58, 59, 60, 61, 62, 63, /* 056-063 */
64, 65, 66, 67, 68, 69, 70, 71, /* 064-071 */
72, 73, 74, 75, 76, 77, 78, 79, /* 072-079 */
80, 81, 82, 83, 84, 85, 86, 87, /* 080-087 */
88, 89, 90, 91, 92, 93, 94, 95, /* 088-095 */
96, 97, 98, 99, 100, 101, 102, 103, /* 096-103 */
104, 105, 106, 107, 108, 109, 110, 111, /* 104-111 */
112, 113, 114, 115, 116, 117, 118, 119, /* 112-119 */
120, 121, 122, 123, 124, 125, 126, 127, /* 120-127 */
164, 166, 169, 170, 172, 173, 174, 175, /* 128-135 */
178, 179, 183, 184, 185, 186, 188, 189, /* 136-143 */
193, 195, 196, 198, 199, 205, 206, 207, /* 144-151 */
208, 232, 234, 245, 248, 250, 254, 255, /* 152-159 */
128, 161, 162, 163, 168, 165, 181, 167, /* 160-167 */
200, 160, 227, 171, 190, 177, 176, 197, /* 168-175 */
202, 209, 201, 204, 194, 157, 182, 180, /* 176-183 */
203, 192, 235, 187, 210, 211, 212, 191, /* 184-191 */
129, 130, 131, 132, 133, 134, 225, 135, /* 192-199 */
136, 137, 138, 139, 140, 141, 142, 143, /* 200-207 */
144, 145, 146, 147, 148, 149, 150, 158, /* 208-215 */
233, 151, 152, 153, 154, 155, 156, 251, /* 216-223 */
213, 214, 215, 216, 217, 218, 241, 219, /* 224-231 */
220, 221, 222, 223, 224, 226, 228, 229, /* 232-239 */
230, 231, 236, 237, 238, 239, 240, 159, /* 240-247 */
249, 242, 243, 244, 246, 247, 252, 253 /* 248-255 */
};
if (cascii == 'U') {
rstr[0] = ch;
rstr[1] = '\0';
}
else if (cascii == 'N') {
rstr[0] = c_chfilter_iso_next[(int)(U_CHAR)ch];
rstr[1] = '\0';
fprintf(stderr,"%c %c\n",ch,rstr[0]);
}
else if (cascii == 'A') {
switch ((unsigned char)ch) {
case AE_U_L1:
case AE_U_IBM850:
strcpy(rstr,"Ae");
break;
case AE_L_L1:
case AE_L_IBM850:
strcpy(rstr,"ae");
break;
case OE_U_L1:
case OE_U_IBM850:
strcpy(rstr,"Oe");
break;
case OE_L_L1:
case OE_L_IBM850:
strcpy(rstr,"oe");
break;
case UE_U_L1:
case UE_U_IBM850:
strcpy(rstr,"Ue");
break;
case UE_L_L1:
case UE_L_IBM850:
strcpy(rstr,"ue");
break;
case SS_L1:
case SS_IBM850:
strcpy(rstr,"ss");
break;
case ACUTE_L1:
rstr[0] = '\'';
rstr[1] = '\0';
break;
default:
rstr[0] = ch;
rstr[1] = '\0';
}
}
return rstr;
}
SSIZE_T fstrlen(const char *fmt, ...)
{
SSIZE_T len;
va_list ap;
va_start(ap, fmt);
len = vfstrlen(fmt, ap);
va_end(ap);
return(len);
}
SSIZE_T vfstrlen(const char *fmt, va_list ap)
{
SSIZE_T len;
int saved_errno;
boolean notfound;
char *hfmtp, hfmt[S_STRLEN], str[S_STRLEN];
const char *fp;
saved_errno = errno;
len = strlen(fmt);
fp = fmt;
while(*fp!='\0' && len>=0) {
if (*fp == '%') {
hfmtp = hfmt;
*hfmtp++ = '%';
do {
*hfmtp++ = *++fp;
notfound = FALSE;
switch (*fp) {
case 's':
len += (SSIZE_T)strlen(va_arg(ap, char *)) - 2;
break;
case 'c':
case '%':
len++;
break;
case 'm':
len += (SSIZE_T)strlen(strerror(saved_errno)) - 2;
break;
case 'd':
case 'i':
case 'o':
case 'x':
case 'X':
case 'u':
case 'p':
*hfmtp = '\0';
sprintf(str,hfmt,va_arg(ap, int));
len += (SSIZE_T)strlen(str) - strlen(hfmt);
break;
case 'f':
case 'e':
case 'E':
case 'g':
case 'G':
*hfmtp = '\0';
sprintf(str,hfmt,va_arg(ap, double));
len += (SSIZE_T)strlen(str) - strlen(hfmt);
break;
case '\0':
len = -1;
break;
default:
notfound = TRUE;
}
} while (notfound);
}
fp++;
}
errno = saved_errno;
return(len);
}
void lowercases(char *str)
{
while (*str != '\0') {
*str = tolower(*str);
str++;
}
}
char *stripslashes(char *str)
{
char *sp, *sp2, *sp3;
sp = str;
while(*sp != '\0') {
while(*sp != '/' && *sp != '\0') sp++;
if (*sp != '\0' && *(++sp) == '/') {
for (sp2=sp; *sp2=='/'; ++sp2) ;
for (sp3=sp; *sp2!='\0';) *(sp3++) = *(sp2++);
*sp3 = '\0';
}
}
if (--sp > str && *sp == '/') *sp = '\0';
if (*str == '\0') strcpy(str,"/");
return(str);
}
void strprepend(char *str, const char *ps)
{
char *sp1, *sp2;
const char *csp;
sp1 = str + strlen(str)*sizeof(char);
sp2 = sp1 + strlen(ps)*sizeof(char);
*sp2 = '\0';
while (sp1 > str) {
*(--sp2) = *(--sp1);
}
csp = ps;
while (*csp != '\0') {
*(sp1++) = *(csp++);
}
}
char *strmaxcpy(char *to, const char *from, const SIZE_T count)
{
SIZE_T k;
char *dp;
const char *sp;
for (dp=to,sp=from,k=0; *sp!='\0' && k<count; k++) *dp++=*sp++;
*dp = '\0';
return(to);
}
char *strmaxcat(char *to, const char *append, const SIZE_T mlen)
{
SIZE_T n, k;
char *dp;
const char *ap;
n = strlen(to);
for (dp=&(to[n]),ap=append,k=n; *ap!='\0' && k<mlen; k++) *dp++=*ap++;
*dp = '\0';
return(to);
}
const char *basename(const char *path)
{
const char *sp;
sp = path;
while (*sp!='\0') sp++;
while (*sp!='/' && sp>path) sp--;
if (*sp == '/') sp++;
return sp;
}
void pathnamedir(const char *path, char dir[])
{
int k;
strcpy(dir,path);
k = strlen(dir) - 1;
while ((dir[k]!='/') && (k>0)) {
k--;
}
if (k > 0) {
dir[k] = '\0';
}
else {
strcpy(dir,"/");
}
}
int splitstring(char *splits[], char *str, const char splitchar,
const int maxsplits)
{
int k;
char *p;
p = str;
k = 0;
while (*p!='\0' && k<maxsplits) {
while (*p==splitchar) p++;
splits[k++] = p;
while (*p!=splitchar && *p!='\0') p++;
if (*p!='\0') {
*p = '\0';
p++;
}
}
splits[k] = (char *)NULL;
return k;
}
int splitstr_wr(char *splits[], char *str, const char splitchar,
const int maxsplits)
{
int k;
char *p;
p = str;
k = 0;
while (*p!='\0' && k<maxsplits) {
while (*p==splitchar) p++;
splits[k++] = p;
if (k == maxsplits) break;
while (*p!=splitchar && *p!='\0') p++;
if (*p!='\0') {
*p = '\0';
p++;
}
}
splits[k] = (char *)NULL;
return k;
}
char *normalizepath(char *path)
{
char olddir[PATH_MAX+1];
stripslashes(path);
getcwd(olddir,PATH_MAX);
if (chdir(path) < 0) return(NULL);
getcwd(path,PATH_MAX);
chdir(olddir);
return(path);
}
char *buildhelppath(char *helppath, const char *fname, const char *suffix,
const confrecordtyp *confrecord)
{
if (strlen(fname)+strlen(confrecord->helpdir)+strlen(suffix)+2 < PATH_MAX) {
sprintf(helppath,"%s/%s.%s",confrecord->helpdir,fname,suffix);
return(helppath);
}
return(NULL);
}
int splitparams(char *args[], char *params)
{
int k;
char *p;
p = params;
k = 0;
while (*p!='\0' && k<MAXARGS-1) {
while (*p==' ' && *p!='\0') p++;
args[k++] = p;
while (*p!=' ' && *p!='\0') p++;
if (*p==' ') {
*p = '\0';
p++;
}
}
args[k] = (char *)NULL;
return k;
}
int str2cmdparams(const char str[], char cmd[], char params[])
{
int k;
while (*str==' ' && *str!='\0') str++;
for (k=0; *str!=' ' && *str!='\0' && k<S_STRLEN; k++, str++) {
cmd[k] = *str;
}
if (k >= S_STRLEN) {
cmd[0] = '\0';
return(-1);
}
else {
cmd[k] = '\0';
if (*str != '\0') str++;
strcpy(params, str);
}
return(0);
}
void split2key_arg(char *line, char **key, char **arg)
{
char *sp3;
*key = line;
*arg = line;
while (**arg!='\0' && **arg!='#') (*arg)++;
**arg = '\0';
while ((**key==' ' || **key=='\t') && **key!='\0') (*key)++;
*arg = *key;
while (**arg!=' ' && **arg!='\t' && **arg!='\0') (*arg)++;
if (**arg != '\0') {
**arg = '\0';
(*arg)++;
while ((**arg==' ' || **arg=='\t') && **arg!='\0') (*arg)++;
sp3 = *arg;
if (**arg != '"') {
while (*sp3!=' ' && *sp3!='\t' && *sp3!='\n' && *sp3!='\0') sp3++;
}
else {
(*arg)++;
sp3++;
while (*sp3!='"' && *sp3!='\0') sp3++;
}
if (*sp3 != '\0') {
*sp3 = '\0';
}
}
}
void stringsort(char *strary[], const int anz)
{
void string_sort(char *[], const int, const int);
string_sort(strary, 0, anz-1);
return;
}
void string_sort(char *strary[], const int k1, const int k2)
{
int i, j;
char *x, *y;
i = k1; j = k2;
x = strary[(k1+k2)/2];
do {
while (strcmp(strary[i],x) < 0 && i < k2) i++;
while (strcmp(strary[j],x) > 0 && j > k1) j--;
if (i <= j) {
y = strary[i];
strary[i] = strary[j];
strary[j] = y;
i++; j--;
}
} while (i <= j);
if (k1 < j) string_sort(strary,k1,j);
if (i < k2) string_sort(strary,i,k2);
return;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.