Ejemplo n.º 1
0
void do_getabsolute(char* result, const char* value, const char* relative_to)
{
	int i;
	char* ch;
	char* prev;
	char buffer[0x4000] = { '\0' };

	/* if the path is not already absolute, base it on working dir */
	if (!do_isabsolute(value)) {
		if (relative_to) {
			strcpy(buffer, relative_to);
		}
		else {
			do_getcwd(buffer, 0x4000);
		}
		strcat(buffer, "/");
	}

	/* normalize the path */
	strcat(buffer, value);
	do_translate(buffer, '/');

	/* process it part by part */
	result[0] = '\0';
	if (buffer[0] == '/') {
		strcat(result, "/");
	}

	prev = NULL;
	ch = strtok(buffer, "/");
	while (ch) {
		/* remove ".." where I can */
		if (strcmp(ch, "..") == 0 && (prev == NULL || (prev[0] != '$' && prev[0] != '%' && strcmp(prev, "..") != 0))) {
			i = strlen(result) - 2;
			while (i >= 0 && result[i] != '/') {
				--i;
			}
			if (i >= 0) {
				result[i + 1] = '\0';
			}
			ch = NULL;
		}

		/* allow everything except "." */
		else if (strcmp(ch, ".") != 0) {
			strcat(result, ch);
			strcat(result, "/");
		}

		prev = ch;
		ch = strtok(NULL, "/");
	}

	/* remove trailing slash */
	i = strlen(result) - 1;
	if (result[i] == '/') {
		result[i] = '\0';
	}
}
Ejemplo n.º 2
0
int do_getcwd(char* buffer, size_t size)
{
	int result;

#if PLATFORM_WINDOWS
	result = (GetCurrentDirectory(size, buffer) != 0);
	if (result) {
		do_translate(buffer, '/');
	}
#else
	result = (getcwd(buffer, size) != 0);
#endif

	return result;
}
Ejemplo n.º 3
0
int SIO_WriteBuffer(SIO_INFO *s,char *buf,int len)
{
#ifndef __palmos__ 
  int ret;
#endif

  if (s!=NULL) {
    do_translate(s,buf,len,1);
#ifdef WINDOWS
    {
      DWORD got,err;
    
      sio_init_overlapped(s);
      if (WriteFile(s->fd,buf,len,&got,s->overlapped)) {
	ret=got;
      } else {
	/* handle overlapped stuff */
	err=GetLastError();
        if (err==ERROR_IO_PENDING) {
	  /* TODO: write timeout should be handled differently! */
	  if (sio_wait_overlapped(s,s->read_timeout)) 
	    ret=len;
	  else
	    ret=(-1);
	} else {
	  /* some error other than overlapped I/O not yet
	   * complete is a real error
	   */
	  ret=(-1);
	}
      }
    }
    return(ret);

#elif defined( __palmos__ )
    if( SerSend10( s->fd, buf, (ULong)len )==0 ) {
        if( SerSendWait( s->fd, -1 )==0 ) return( len );
        else return(-2);
    } else return(-3);

#else /* !WINDOWS && !__palmos__ */
    ret=write(s->fd,buf,len);
    return(ret);
#endif /* WINDOWS */
  } 
  return(-1);
}
Ejemplo n.º 4
0
static void normalize(char* buffer, const char* path)
{
	char* src;
	char* dst;
	char last;

	strcpy(buffer, path);
	do_translate(buffer, '/');

	/* remove any duplicate slashes within the path */
	src = buffer;
	dst = buffer;
	last = '\0';

	while (*src != '\0') {
		/* if I don't have consecutive slashes, keep the char */
		if (*src != '/' || last != '/') {
			*(dst++) = *src;
		}

		/* Allow double-slash at the start of the string, so absolute
		 * UNC paths can be expressed, but nowhere else */
		if (src != buffer) {
			last = (*src);
		}

		/* check the next one */
		++src;
	}

    /* remove any trailing slashes */
    for (--src; src > buffer && *src == '/'; --src) {
         *src = '\0';
    }

	*dst = '\0';
}
Ejemplo n.º 5
0
int path_getrelative(lua_State* L)
{
    int i, last, count;
    char src[0x4000];
    char dst[0x4000];

    const char* p1 = luaL_checkstring(L, 1);
    const char* p2 = luaL_checkstring(L, 2);

    /* normalize the paths */
    strcpy(src, p1);
    do_translate(src, '/');
    strcpy(dst, p2);
    do_translate(dst, '/');

    /* same directory? */
    if (strcmp(src, dst) == 0) {
        lua_pushstring(L, ".");
        return 1;
    }

    /* dollar macro? Can't tell what the real path might be, so treat
     * as absolute. This enables paths like $(SDK_ROOT)/include to
     * work as expected. */
    if (dst[0] == '$') {
        lua_pushstring(L, dst);
        return 1;
    }

    /* find the common leading directories */
    strcat(src, "/");
    strcat(dst, "/");

    last = -1;
    i = 0;
    while (src[i] && dst[i] && src[i] == dst[i]) {
        if (src[i] == '/') {
            last = i;
        }
        ++i;
    }

    /* if they have nothing in common return absolute path */
    if (last <= 0) {
        dst[strlen(dst) - 1] = '\0';
        lua_pushstring(L, dst);
        return 1;
    }

    /* count remaining levels in src */
    count = 0;
    for (i = last + 1; src[i] != '\0'; ++i) {
        if (src[i] == '/') {
            ++count;
        }
    }

    /* start my result by backing out that many levels */
    src[0] = '\0';
    for (i = 0; i < count; ++i) {
        strcat(src, "../");
    }

    /* append what's left */
    strcat(src, dst + last + 1);

    /* remove trailing slash and done */
    src[strlen(src) - 1] = '\0';
    lua_pushstring(L, src);
    return 1;
}
Ejemplo n.º 6
0
static void translate(char* result, const char* value, const char sep)
{
	strcpy(result, value);
	do_translate(result, sep);
}
Ejemplo n.º 7
0
inline char* Allocator::translate(ref_type ref) const noexcept
{
    return do_translate(ref);
}
Ejemplo n.º 8
0
int SIO_ReadChar(SIO_INFO *s)
{
  unsigned char ch;

  if (s!=NULL) {
#ifdef WINDOWS
    if (SIO_WaitForData(s,s->read_timeout)>0) {
      DWORD got,err;

      sio_init_overlapped(s);
      if (!ReadFile(s->fd,&ch,1,&got,s->overlapped)) {
        /* handle overlapped stuff */
        err=GetLastError();
        if (err==ERROR_IO_PENDING) {
	  if (!sio_wait_overlapped(s,s->read_timeout)) {
	    got=0;
	  }
	} else return(-1);
      }
      if (got==0)
	return(-1);
#elif defined( __palmos__ )
    Long timeout;

    timeout = (( s->read_timeout * sysTicksPerSecond ) / 1000000 ) + 1;
    if( SerReceive10( s->fd, &ch, 1, timeout )==0 ) {

#else /* !WINDOWS && !__palmos__ */
    if (SIO_WaitForData(s,s->read_timeout)>0) {
      if (read(s->fd,&ch,1)!=1)
        return (-1);
#endif /* WINDOWS */
      do_translate(s,&ch,1,0);
      return (ch);
    }
  }
  return(-1);
}

int SIO_ReadBuffer(SIO_INFO *s,char *buf,int len)
{
  int i,ch;

  /* the following simply calls into SIO_ReadChar and works
   * fine ... I've changed to this as the Win32 stuff wasn't
   * behaving the way I expected for multiple chars and at
   * the moment I don't want to think too hard about it
   */
  /* Also fine for PalmOS 1 compatibility.
   */
  for(i=0;i<len;i++) {
    ch=SIO_ReadChar(s);
    if (ch==-1) 
      break;
    buf[i]=ch & 0xff;
  }
  if (i==0)
    return(-1);
  else
    return (i);
}

int SIO_WriteChar(SIO_INFO *s,int data)
{
#ifndef __palmos__ 
  int ret;
#endif
  unsigned char ch;

  if (s!=NULL) {
    ch=data & 0xff;
    do_translate(s,&ch,1,1);
#ifdef WINDOWS
    {
      DWORD got,err;
    
      sio_init_overlapped(s);
      if (WriteFile(s->fd,&ch,1,&got,s->overlapped)) {
	ret=got;
      } else {
	/* handle overlapped stuff */
	err=GetLastError();
        if (err==ERROR_IO_PENDING) {
	  /* TODO: write timeout should be handled differently! */
	  if (sio_wait_overlapped(s,s->read_timeout)) 
	    ret=1;	
	  else
	    ret=(-1);
	} else {
	  /* some error other than overlapped I/O not yet
	   * complete is a real error
	   */
	  ret=(-1);
	}
      }
    }
    return(ret);

#elif defined( __palmos__ )
    if( SerSend10( s->fd, &ch, 1 )==0 )
        if( SerSendWait( s->fd, -1 )==0 ) return( 1 );

#else /* !WINDOWS && !__palmos__ */
    ret=write(s->fd,&ch,1);
    return(ret);
#endif /* WINDOWS */
  } 
  return(-1);
}
Ejemplo n.º 9
0
inline void SpatialSceneBuilder::translate(double x, double y, double z)
{
    do_translate(math::Vec3(x,y,z));
}
Ejemplo n.º 10
0
inline void SpatialSceneBuilder::translate(math::Vec3 v)
{
    do_translate(v);
}