Blame src/utils.h

Packit cb6d3d
/*
Packit cb6d3d
  Copyright (C) 2004, 2005, 2008, 2014 Rocky Bernstein <rocky@gnu.org>
Packit cb6d3d
  Copyright (C) 1998 Monty <xiphmont@mit.edu>
Packit cb6d3d
*/
Packit cb6d3d
Packit cb6d3d
#include <stdlib.h>
Packit cb6d3d
#include <stdio.h>
Packit cb6d3d
#include <string.h>
Packit cb6d3d
#include <limits.h>
Packit cb6d3d
Packit cb6d3d
#define copystring(s) (s) ? s : NULL;
Packit cb6d3d
Packit cb6d3d
static inline char *
Packit cb6d3d
catstring(char *buff, const char *s)
Packit cb6d3d
{
Packit cb6d3d
  if(s){
Packit cb6d3d
    if(buff)
Packit cb6d3d
      buff=realloc(buff,strlen(buff)+strlen(s)+1);
Packit cb6d3d
    else
Packit cb6d3d
      buff=calloc(strlen(s)+1,1);
Packit cb6d3d
    strcat(buff,s);
Packit cb6d3d
  }
Packit cb6d3d
  return(buff);
Packit cb6d3d
}
Packit cb6d3d
Packit cb6d3d
/** Returns basename(fullname) and sets path to the dirname.
Packit cb6d3d
    rename includes a trailing slash execpt when dirname is empty.
Packit cb6d3d
*/
Packit cb6d3d
static inline char *
Packit cb6d3d
split_base_dir(char *fullpath, char *path, unsigned int max)
Packit cb6d3d
{
Packit cb6d3d
  char *post         = strrchr(fullpath, '/');
Packit cb6d3d
  int   pos          = (post ? post-fullpath+1 : 0);
Packit cb6d3d
  path[0]='\0';
Packit cb6d3d
  if (pos>max) return NULL;
Packit cb6d3d
  if (fullpath[pos] == '/') pos++;
Packit cb6d3d
  if (pos) strncat(path, fullpath, pos);
Packit cb6d3d
  return fullpath + pos;
Packit cb6d3d
}
Packit cb6d3d
Packit cb6d3d
/* By renaming this to utils.c and compiling like this:
Packit cb6d3d
   gcc -DSTANDALONE -o utils utils.h
Packit cb6d3d
you can demo this code.
Packit cb6d3d
*/
Packit cb6d3d
#ifdef STANDALONE
Packit cb6d3d
int main(int argc, char **argv)
Packit cb6d3d
{
Packit cb6d3d
  int i;
Packit cb6d3d
  const char *paths[] = {"/abc/def", "hij/klm"};
Packit cb6d3d
  char path[10];
Packit cb6d3d
  for (i=0; i<2; i++) {
Packit cb6d3d
      char *fullpath = strdup(paths[i]);
Packit cb6d3d
      char *base = split_base_dir(fullpath, path, sizeof(path));
Packit cb6d3d
      printf("dirname of %s is %s; basename is %s\n", fullpath, path, base);
Packit cb6d3d
      if (fullpath) free(fullpath);
Packit cb6d3d
  }
Packit cb6d3d
}
Packit cb6d3d
#endif