/*

MercuryInstaller for MS-DOS
汎用下請けモジュール

*/

#include<stdio.h>
#include<dos.h>
#include<farstr.h>
#include<string.h>
#include<jctype.h>
#include<stdarg.h>

#include"mercury.h"
/*----------------------------far文字列の出力--------------------------------*/
extern	int	far_fputs(char far *p,FILE *fp)
{
	char	buf[256];

	far_strcpy(buf,p);

	return fputs(buf,fp);
}
/*--------------------------- 一定字数への切り詰め --------------------------*/
/* ○sの内容がnバイトを超える場合、nバイト以内になるように修正する。このとき */
/* 　もし全角文字の泣き別れが発生した場合は上位バイトも同時に削除する。      */
/* ○sで示される領域を直接書き換え、sを返り値として返す。                    */
/*---------------------------------------------------------------------------*/
extern	char	*strchop(char *s,size_t n)
{
	if	(strlen(s)>n)
	{
		if	(nthctype(s,n-1)==CT_KJ1)
			s[n-1] = '\0';
		else
			s[n]   = '\0';
	}

	return s;
}
/*----------------------画面最下行へのメッセージの出力-----------------------*/
extern	int	putmessage(char	*s,...)
{
	va_list	ap;
	int	c;

	va_start(ap,s);

	printf("\033[%d;1f\033[33m",CON_YWIDTH);
	vprintf(s,ap);
	printf("\033[0m");
	va_end(ap);

	c = ds_getch();

	printf("\033[%d;1f\033[2K",CON_YWIDTH);

	return c;
}
/*-----------------------カーソルの表示の有無を決定--------------------------*/
extern	void	showcursor(int f)
{
	printf("\033[%d;1f",CON_YWIDTH);

	if	(f)
		printf("\033[0v\033[>5l");
	else
		printf("\033[1v\033[>5h");

	printf("\033[2K");
}
/*--------------------------高速farメモリ獲得関数----------------------------*/
/* 標準のfarmalloc/_dos_allocmemは非常に遅く、read_idxfile()内の大部分の時間 */
/* を消費しているため高速版を用意する                                        */
/*---------------------------------------------------------------------------*/
extern void far *far_sbrk(size_t require)
{
	static unsigned	addr = 0;	/* 現在使用中のﾒﾓﾘﾌﾞﾛｯｸのｱﾄﾞﾚｽ */
	static	long	size = 0;	/* addrのサイズ(バイト単位)    */
	static	long	pos = 0;	/* これまでに使用したバイト数  */

	char	far	*ret;

	if	(pos+require>size)
	{
		if	(addr!=0)
		{
			unsigned	dummy;

			_dos_setblock((pos+15)>>4,addr,&dummy);
		}
		if	(_dos_allocmem(0x1000,&addr))
		{
			size = addr*16L;
			_dos_allocmem(addr,&addr);

			if	(size>require)
				return NULL;
		}
		else
			size = 0x10000;

		pos = 0;
	}

	ret = (char far *)MK_FP(addr,0) + pos;
	pos += require;

#if	0
	printf("far_sbrk(0x%03X)==%Fp-%Fp\n",require,ret,ret+require-1L);
#endif

	return ret;
}
/*---------------------------far_strdup バグ訂正版---------------------------*/
/* 標準のfar_strdup()はnearmalloc()でメモリを確保するらしい                  */
/*---------------------------------------------------------------------------*/
extern char far *far_strdup(const char far *s)
{
	char	far	*p = farmalloc(far_strlen(s)+1);

	if	(p==NULL)
		return NULL;
	else
		return far_strcpy(p,s);
}
/*----------------------------End of mcstdlib.c------------------------------*/
