/*	       DOS specific routines

 */

#include <HTUtils.h>
#include <LYUtils.h>
#include <HTDOS.h>
#include <LYStrings.h>

#include <LYLeaks.h>

/*
 * Make a copy of the source argument in the result, allowing some extra
 * space so we can append directly onto the result without reallocating.
 */
PRIVATE char * copy_plus ARGS2(char **, result, CONST char *, source)
{
    int length = strlen(source);
    HTSprintf0(result, "%-*s", length+10, source);
    (*result)[length] = 0;
    return (*result);
}

/* PUBLIC							HTDOS_wwwName()
**		CONVERTS DOS Name into WWW Name
** ON ENTRY:
**	dosname		DOS file specification (NO NODE)
**
** ON EXIT:
**	returns		WWW file specification
**
*/
char * HTDOS_wwwName ARGS1(CONST char *, dosname)
{
    static char *wwwname = NULL;
    char *cp_url = copy_plus(&wwwname, dosname);
    int wwwname_len;

#ifdef SH_EX
    char ch;

    while ((ch = *dosname) != '\0') {
	switch (ch) {
	case '\\':
	/* convert dos backslash to unix-style */
	    *cp_url++ = '/';
	    break;
	case ' ':
	    *cp_url++ = '%';
	    *cp_url++ = '2';
	    *cp_url++ = '0';
	    break;
      default:
	    *cp_url++ = ch;
	    break;
      }
      dosname++;
    }
    *cp_url = '\0';
#else
    for ( ; *cp_url != '\0' ; cp_url++)
	if(*cp_url == '\\')
	    *cp_url = '/';   /* convert dos backslash to unix-style */
#endif

    wwwname_len = strlen(wwwname);
    if (wwwname_len > 1)
	cp_url--;	/* point last char */

    if (wwwname_len > 3 && *cp_url == '/') {
	cp_url++;
	*cp_url = '\0';
    }
    return(wwwname);
}


/*
 * Convert slashes from Unix to DOS
 */
char * HTDOS_slashes ARGS1(char *, path)
{
    char *s;

    for (s = path; *s != '\0'; ++s)	{
	if (*s == '/')	{
	    *s = '\\';
	}
    }
    return path;
}

/* PUBLIC							HTDOS_name()
**		CONVERTS WWW name into a DOS name
** ON ENTRY:
**	wwwname		WWW file name
**
** ON EXIT:
**	returns		DOS file specification
*/
char * HTDOS_name ARGS1(char *, wwwname)
{
#ifdef _WINDOWS	/* 1998/04/02 (Thu) 08:47:20 */
    extern char windows_drive[];
    char temp_buff[LY_MAXPATH];
#endif
    static char *result = NULL;
    int joe;

    copy_plus(&result, wwwname);
#ifdef __DJGPP__
    if (result[0] == '/'
     && result[1] == 'd'
     && result[2] == 'e'
     && result[3] == 'v'
     && result[4] == '/'
     && isalpha(result[5])) {
	return(result);
    }
#endif /* __DJGPP__ */

    (void) HTDOS_slashes(result);

    /* pesky leading slash, rudiment from file://localhost/  */
    /* the rest of path may be with or without drive letter  */
    if((result[1] != '\\') && (result[0]  == '\\')) {
	for (joe = 0; (result[joe] = result[joe+1]) != 0; joe++)
	    ;
    }

#ifdef _WINDOWS	/* 1998/04/02 (Thu) 08:59:48 */
    if (LYLastPathSep(result) != NULL
     && !LYIsDosDrive(result)) {
	sprintf(temp_buff, "%.3s\\%.*s", windows_drive,
		(int)(sizeof(temp_buff) - 5), result);
	StrAllocCopy(result, temp_buff);
    }
#endif
    /*
     * If we have only a device, add a trailing slash.  Otherwise it just
     * refers to the current directory on the given device.
     */
    if (LYLastPathSep(result) == NULL
     && LYIsDosDrive(result))
	LYAddPathSep0(result);

    CTRACE((tfp, "HTDOS_name changed `%s' to `%s'\n", wwwname, result));
    return (result);
}

#ifdef WIN_EX
PUBLIC char *HTDOS_short_name(char *path)
{
    static char sbuf[LY_MAXPATH];
    char *ret;
    DWORD r;

    if (strchr(path, '/'))
	path = HTDOS_name(path);
    r = GetShortPathName(path, sbuf, sizeof sbuf);
    if (r >= sizeof(sbuf) || r == 0) {
	ret = LYstrncpy(sbuf, path, sizeof(sbuf));
    } else {
	ret = sbuf;
    }
    return ret;
}
#endif

#if defined(DJGPP) && defined(DJGPP_KEYHANDLER)
/* PUBLIC       getxkey()
**              Replaces libc's getxkey() with polling of tcp/ip
**              library (WatTcp or Watt-32). This is required to
**              be able to finish off dead sockets, answer pings etc.
**
** ON EXIT:
**      returns extended keypress.
*/

/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
#include <pc.h>
#include <dpmi.h>
#include <libc/farptrgs.h>
#include <go32.h>

int getxkey (void)
{
    __dpmi_regs r;

    /* poll tcp/ip lib and yield to DPMI-host while nothing in
     * keyboard buffer (head = tail) (simpler than kbhit).
     */
    while (_farpeekw(_dos_ds, 0x41a) == _farpeekw(_dos_ds, 0x41c))
    {
	tcp_tick (NULL);
	__dpmi_yield();
    }

    r.h.ah = 0x10;
    __dpmi_int(0x16, &r);

    if (r.h.al == 0x00)
	return 0x0100 | r.h.ah;
    if (r.h.al == 0xe0)
	return 0x0200 | r.h.ah;
    return r.h.al;
}
#endif /* DJGPP && DJGPP_KEYHANDLER */

