home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 3
/
FREEWARE.BIN
/
towns_os
/
fildlg22
/
msdos.c
< prev
next >
Wrap
C/C++ Source or Header
|
1980-01-02
|
5KB
|
255 lines
/*
* msdos.c
* MS-DOSインタフェース関数群
*/
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#include "msdos.h"
/****************************************/
/* 定数定義 */
/****************************************/
#define GLOBAL
/* intdos() エラーチェック用 */
#define CarryBit 0x0001
/********************************************************/
/* Microsoft C 5.1 ランタイム・ライブラリ互換関数 */
/********************************************************/
GLOBAL void
_dos_getdrive(
unsigned *drive)
/*
* PURPOSE
* カレントドライブを通知する.
* RETURNS
* driveへ返す値は,ドライブA=1,ドライブB=2...
* REMARKS
* MSCと同一仕様
*/
{
union REGS inregs, outregs;
inregs.h.ah = 0x19; /* Get Current Disk Drive */
intdos(&inregs, &outregs);
*drive = outregs.h.al + 1;
}
/* --- _dos_getdrive() --- */
GLOBAL void
_dos_setdrive(
unsigned drive,
unsigned *maxDrive) /* 最大論理ドライブ数の通知領域 */
/*
* PURPOSE
* カレントドライブを変更し,最大論理ドライブ数を通知する.
* RETURNS
* driveへ設定する値は,ドライブA=1,ドライブB=2...
* REMARKS
* MSCと同一仕様
*/
{
union REGS inregs, outregs;
inregs.h.ah = 0x0e; /* Select Disk */
inregs.h.dl = drive - 1;
intdos(&inregs, &outregs);
*maxDrive = outregs.h.al;
}
/* --- _dos_setdrive() --- */
GLOBAL char *
getcwd(
char *path, /* フルパス通知領域 */
int n) /* pathパラメタの領域長 */
/*
* PURPOSE
* カレントディレクトリのフルパスを返す.
* ルートディレクトリを示す '\' は含まない.
* pathがNULLの場合,本関数内でmallocして必要な領域を確保する.
* RETURNS
* パス名へのポインタ
* エラー発生時は NULL
* REMARKS
* MSCと同一仕様
*/
{
union REGS inregs, outregs;
char buf[128];
int pathLen;
inregs.h.ah = 0x47; /* カレントディレクトリの取得 */
inregs.h.dl = 0; /* カレントドライブを指定 */
inregs.e.esi = (unsigned int)&buf;
intdos(&inregs, &outregs);
if (outregs.x.cflag & CarryBit) /* エラーをチェック */
return(NULL);
pathLen = strlen(buf);
if (path == NULL) {
path = (char *)malloc(pathLen);
if (path == NULL)
return(NULL);
n = pathLen;
}
else if (pathLen >= n)
return(NULL);
return(strncpy(path, buf, n));
}
/* --- getcwd() --- */
GLOBAL int
chdir(
char *path)
/*
* PURPOSE
* カレントドライブのカレントディレクトリを変更する
* RETURNS
* 0 : 正常終了
* -1 : エラー発生
* REMARKS
* MSCと同一仕様
*/
{
union REGS inregs, outregs;
inregs.h.ah = 0x3b; /* カレントディレクトリの変更 */
inregs.e.edx = (unsigned int)path;
intdos(&inregs, &outregs);
if (outregs.x.cflag & CarryBit) /* エラーをチェック */
return(-1);
return(0);
}
/* --- chdir() --- */
GLOBAL unsigned
_dos_findfirst(
char *path, /* 検索対象ファイル名 */
unsigned attr, /* 検索対象属性 */
struct find_t *buf)
/*
* PURPOSE
* 指定したファイルのファイル情報をbufで通知する.
* RETURNS
* 0 : 発見成功
* MS-DOSエラーコード : 発見失敗
* REMARKS
* MSCと同一仕様
*/
{
union REGS inregs, outregs;
inregs.h.ah = 0x1a; /* DTAアドレスの設定 */
inregs.e.edx = (unsigned int)buf;
intdos(&inregs, &outregs);
inregs.h.ah = 0x4e; /* 最初のファイルの検索 */
inregs.x.cx = attr;
inregs.e.edx = (unsigned int)path;
intdos(&inregs, &outregs);
if (outregs.x.cflag & CarryBit) /* エラーをチェック */
return(outregs.x.ax);
return(0);
}
/* --- _dos_findfirst() --- */
GLOBAL unsigned
_dos_findnext(
struct find_t *buf)
/*
* PURPOSE
* _dos_findfirst()で発見した以外のファイルの
* ファイル情報をbufで通知する.
* RETURNS
* 0 : 発見成功
* MS-DOSエラーコード : 発見失敗
* REMARKS
* MSCと同一仕様
*/
{
union REGS inregs, outregs;
inregs.h.ah = 0x1a; /* DTAアドレスの設定 */
inregs.e.edx = (unsigned int)buf;
intdos(&inregs, &outregs);
inregs.h.ah = 0x4f; /* 次のファイルの検索 */
intdos(&inregs, &outregs);
if (outregs.x.cflag & CarryBit) /* エラーをチェック */
return(outregs.x.ax);
return(0);
}
/* --- _dos_findnext() --- */
GLOBAL unsigned char *
jstrrchr(
unsigned char *str,
unsigned short c)
/*
* PURPOSE
* 文字列strの中で最も最後に現れた文字cへのポインタを返す.
* RETURNS
* not NULL : cへのポインタ
* NULL : 発見できず
* NOTICE
* 文字cは2バイト文字であってはならない.
* この点はMSC非互換である.
*/
{
unsigned short ch;
unsigned char *pFound = NULL;
if (str == NULL)
return(NULL);
while ((ch = *str++) != '\0') {
if (iskanji(ch))
str++;
else if (ch == c)
pFound = str - 1;
}
return(pFound);
}
/* --- jstrrchr() --- */
GLOBAL int
iskanji(
int c)
/*
* PURPOSE
* 文字cが2バイト文字の第一バイトであるか否かを調べる.
* RETURNS
* 1 : 第一バイトである
* 0 : 第一バイトでない
*/
{
if (c >= 0x81 && c <= 0x9f)
return(1);
if (c >= 0xe0 && c <= 0xfc)
return(1);
return(0);
}
/* --- iskanji() --- */
/****************************************/
/* その他の関数 */
/****************************************/
/* 今のところはない */
/***** msdos.c *****/