ftp.nice.ch/pub/next/unix/communication/ft_bbs.1.0.s.tar.gz#/ft_bbs-1.0/stringstuff.c

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.