Logo Search packages:      
Sourcecode: inkscape version File versions  Download package

char* inkscape_rel2abs ( const char *  path,
const char *  base,
char *  result,
const size_t  size 
)

Convert a relative path name into absolute. If path is already absolute, does nothing except copying path to result.

Parameters:
path relative path
base base directory (must be absolute path)
result result buffer
size size of result buffer
Returns:
!= NULL: absolute path == NULL: error
based on functions by Shigio Yamaguchi. FIXME:TODO: force it to also do path normalization of the entire resulting path, i.e. get rid of any .. and . in any place, even if 'path' is already absolute (now it returns it unchanged in this case)

Definition at line 98 of file dir-util.cpp.

{
  const char *pp, *bp;
  /* endp points the last position which is safe in the result buffer. */
  const char *endp = result + size - 1;
  char *rp;
  int length;
  if (*path == G_DIR_SEPARATOR)
    {
      if (strlen (path) >= size)
      goto erange;
      strcpy (result, path);
      goto finish;
    }
  else if (*base != G_DIR_SEPARATOR || !size)
    {
      errno = EINVAL;
      return (NULL);
    }
  else if (size == 1)
    goto erange;
  if (!strcmp (path, ".") || !strcmp (path, current))
    {
      if (strlen (base) >= size)
      goto erange;
      strcpy (result, base);
      /* rp points the last char. */
      rp = result + strlen (base) - 1;
      if (*rp == G_DIR_SEPARATOR)
      *rp = 0;
      else
      rp++;
      /* rp point NULL char */
      if (*++path == G_DIR_SEPARATOR)
      {
        /* Append G_DIR_SEPARATOR to the tail of path name. */
        *rp++ = G_DIR_SEPARATOR;
        if (rp > endp)
          goto erange;
        *rp = 0;
      }
      goto finish;
    }
  bp = base + strlen (base);
  if (*(bp - 1) == G_DIR_SEPARATOR)
    --bp;
  /* up to root. */
  for (pp = path; *pp && *pp == '.';)
    {
      if (!strncmp (pp, parent, 3))
      {
        pp += 3;
        while (bp > base && *--bp != G_DIR_SEPARATOR)
          ;
      }
      else if (!strncmp (pp, current, 2))
      {
        pp += 2;
      }
      else if (!strncmp (pp, "..\0", 3))
      {
        pp += 2;
        while (bp > base && *--bp != G_DIR_SEPARATOR)
          ;
      }
      else
      break;
    }
  /* down to leaf. */
  length = bp - base;
  if (length >= static_cast<int>(size))
    goto erange;
  strncpy (result, base, length);
  rp = result + length;
  if (*pp || *(pp - 1) == G_DIR_SEPARATOR || length == 0)
    *rp++ = G_DIR_SEPARATOR;
  if (rp + strlen (pp) > endp)
    goto erange;
  strcpy (rp, pp);
finish:
  return result;
erange:
  errno = ERANGE;
  return (NULL);
}


Generated by  Doxygen 1.6.0   Back to index