Пример #1
0
CHAR8 *
strrchra(IN const CHAR8 *s, const INTN c)
{
  CHAR8 *found, *p, ch = (CHAR8)c;

  /* Since strchr is fast, we use it rather than the obvious loop.  */

  if (ch == '\0') return strchra(s, '\0');

  found = NULL;
  while ((p = strchra(s, ch)) != NULL)
    {
      found = p;
      s = p + 1;
    }

  return (CHAR8 *) found;
}
Пример #2
0
CHAR8 *
strtok_simple(CHAR8 *in, CHAR8 c)
{
	static CHAR8 *last;
	CHAR8 *tmp;

	if (in == NULL) in = last;

	if (in == NULL) return NULL;

	if (*in == c) in++;

	tmp = strchra(in, c);
	if (tmp) {
		*tmp = '\0';
		last = tmp+1;
	} else {
		last = NULL;
	}
	return in;
}
Пример #3
0
VOID CopyPathRelative(CHAR8 *dest, CHAR8 *src, INTN len)
{
	CHAR8* o = dest;
	CHAR8* p = src;

	*o = '\0';

	while(*p && *p == PATH_CHAR) ++p;
	for(; len && *p;)
	{
		src = p;
		p = strchra(src, PATH_CHAR);
		if(!p) p = src+strlena(src);

		/* . => skip */
		if(p-src == 1 && *src == '.' )
		{
			if(*p) src = ++p;
		}
		/* .. => pop one */
		else if(p-src == 2 && *src == '.' && src[1] == '.')
		{
			if(o != dest)
			{
				CHAR8* tmp;
				*o = '\0';
				tmp = strrchra(dest, PATH_CHAR);
				if(!tmp)
				{
					len += o-dest;
					o = dest;
					if(*p) ++p;
				}
				else
				{
					len += o-tmp;
					o = tmp;
					if(*p) ++p;
				}
			}
			else /* nothing to pop */
				if(*p) ++p;
		}
		else
		{
			INTN copy;
			if(o != dest)
			{
				--len;
				*o++ = PATH_CHAR;
			}
			copy = MIN(p-src,len);
			CopyMem(o, src, copy);
			len -= copy;
			src += copy;
			o += copy;
			if(*p) ++p;
		}
		while(*p && *p == PATH_CHAR) ++p;
	}
	o[len?0:-1] = '\0';
}