home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 3 / FREEWARE.BIN / towns_os / fildlg22 / msdos.c < prev    next >
C/C++ Source or Header  |  1980-01-02  |  5KB  |  255 lines

  1. /*
  2.  *    msdos.c
  3.  *        MS-DOSインタフェース関数群
  4.  */
  5.  
  6. #include    <stdlib.h>
  7. #include    <string.h>
  8. #include    <dos.h>
  9. #include    "msdos.h"
  10.  
  11.  
  12. /****************************************/
  13. /*        定数定義        */
  14. /****************************************/
  15.  
  16. #define        GLOBAL
  17.  
  18. /*    intdos() エラーチェック用    */
  19. #define        CarryBit    0x0001
  20.  
  21.  
  22. /********************************************************/
  23. /*    Microsoft C 5.1 ランタイム・ライブラリ互換関数    */
  24. /********************************************************/
  25.  
  26. GLOBAL    void
  27. _dos_getdrive(
  28.     unsigned    *drive)
  29. /*
  30.  *    PURPOSE
  31.  *        カレントドライブを通知する.
  32.  *    RETURNS
  33.  *        driveへ返す値は,ドライブA=1,ドライブB=2...
  34.  *    REMARKS
  35.  *        MSCと同一仕様
  36.  */
  37. {
  38.     union    REGS    inregs, outregs;
  39.     
  40.     inregs.h.ah = 0x19;        /* Get Current Disk Drive */
  41.     intdos(&inregs, &outregs);
  42.     *drive = outregs.h.al + 1;
  43. }
  44. /* ---    _dos_getdrive()  --- */
  45.  
  46.  
  47. GLOBAL    void
  48. _dos_setdrive(
  49.     unsigned    drive,
  50.     unsigned    *maxDrive)    /* 最大論理ドライブ数の通知領域 */
  51. /*
  52.  *    PURPOSE
  53.  *        カレントドライブを変更し,最大論理ドライブ数を通知する.
  54.  *    RETURNS
  55.  *        driveへ設定する値は,ドライブA=1,ドライブB=2...
  56.  *    REMARKS
  57.  *        MSCと同一仕様
  58.  */
  59. {
  60.     union    REGS    inregs, outregs;
  61.     
  62.     inregs.h.ah = 0x0e;        /* Select Disk */
  63.     inregs.h.dl = drive - 1;
  64.     intdos(&inregs, &outregs);
  65.     *maxDrive = outregs.h.al;
  66. }
  67. /* ---    _dos_setdrive()  --- */
  68.  
  69.  
  70. GLOBAL    char    *
  71. getcwd(
  72.     char    *path,        /* フルパス通知領域 */
  73.     int    n)        /* pathパラメタの領域長 */
  74. /*
  75.  *    PURPOSE
  76.  *        カレントディレクトリのフルパスを返す.
  77.  *        ルートディレクトリを示す '\' は含まない.
  78.  *        pathがNULLの場合,本関数内でmallocして必要な領域を確保する.
  79.  *    RETURNS
  80.  *        パス名へのポインタ
  81.  *        エラー発生時は NULL
  82.  *    REMARKS
  83.  *        MSCと同一仕様
  84.  */
  85. {
  86.     union REGS    inregs, outregs;
  87.     char        buf[128];
  88.     int        pathLen;
  89.     
  90.     inregs.h.ah = 0x47;    /* カレントディレクトリの取得 */
  91.     inregs.h.dl = 0;    /* カレントドライブを指定 */
  92.     inregs.e.esi = (unsigned int)&buf;
  93.     intdos(&inregs, &outregs);
  94.     if (outregs.x.cflag & CarryBit)        /* エラーをチェック */
  95.         return(NULL);
  96.     pathLen = strlen(buf);
  97.     if (path == NULL) {
  98.         path = (char *)malloc(pathLen);
  99.         if (path == NULL)
  100.             return(NULL);
  101.         n = pathLen;
  102.     }
  103.     else if (pathLen >= n)
  104.         return(NULL);
  105.     return(strncpy(path, buf, n));
  106. }
  107. /* ---    getcwd()  --- */
  108.  
  109.  
  110. GLOBAL    int
  111. chdir(
  112.     char    *path)
  113. /*
  114.  *    PURPOSE
  115.  *        カレントドライブのカレントディレクトリを変更する
  116.  *    RETURNS
  117.  *        0    : 正常終了
  118.  *        -1    : エラー発生
  119.  *    REMARKS
  120.  *        MSCと同一仕様
  121.  */
  122. {
  123.     union REGS    inregs, outregs;
  124.     
  125.     inregs.h.ah = 0x3b;        /* カレントディレクトリの変更 */
  126.     inregs.e.edx = (unsigned int)path;
  127.     intdos(&inregs, &outregs);
  128.     if (outregs.x.cflag & CarryBit)        /* エラーをチェック */
  129.         return(-1);
  130.     return(0);
  131. }
  132. /* ---    chdir()  --- */
  133.  
  134.  
  135. GLOBAL    unsigned
  136. _dos_findfirst(
  137.     char        *path,        /* 検索対象ファイル名 */
  138.     unsigned    attr,        /* 検索対象属性 */
  139.     struct find_t    *buf)
  140. /*
  141.  *    PURPOSE
  142.  *        指定したファイルのファイル情報をbufで通知する.
  143.  *    RETURNS
  144.  *        0            : 発見成功
  145.  *        MS-DOSエラーコード    : 発見失敗
  146.  *    REMARKS
  147.  *        MSCと同一仕様
  148.  */
  149. {
  150.     union REGS    inregs, outregs;
  151.     
  152.     inregs.h.ah = 0x1a;            /* DTAアドレスの設定 */
  153.     inregs.e.edx = (unsigned int)buf;
  154.     intdos(&inregs, &outregs);
  155.     
  156.     inregs.h.ah = 0x4e;            /* 最初のファイルの検索 */
  157.     inregs.x.cx = attr;
  158.     inregs.e.edx = (unsigned int)path;
  159.     intdos(&inregs, &outregs);
  160.     if (outregs.x.cflag & CarryBit)        /* エラーをチェック */
  161.         return(outregs.x.ax);
  162.     return(0);
  163. }
  164. /* ---    _dos_findfirst()  --- */
  165.  
  166.  
  167. GLOBAL    unsigned
  168. _dos_findnext(
  169.     struct find_t    *buf)
  170. /*
  171.  *    PURPOSE
  172.  *        _dos_findfirst()で発見した以外のファイルの
  173.  *        ファイル情報をbufで通知する.
  174.  *    RETURNS
  175.  *        0            : 発見成功
  176.  *        MS-DOSエラーコード    : 発見失敗
  177.  *    REMARKS
  178.  *        MSCと同一仕様
  179.  */
  180. {
  181.     union REGS    inregs, outregs;
  182.     
  183.     inregs.h.ah = 0x1a;            /* DTAアドレスの設定 */
  184.     inregs.e.edx = (unsigned int)buf;
  185.     intdos(&inregs, &outregs);
  186.     
  187.     inregs.h.ah = 0x4f;            /* 次のファイルの検索 */
  188.     intdos(&inregs, &outregs);
  189.     if (outregs.x.cflag & CarryBit)        /* エラーをチェック */
  190.         return(outregs.x.ax);
  191.     return(0);
  192. }
  193. /* ---    _dos_findnext()  --- */
  194.  
  195.  
  196. GLOBAL    unsigned char *
  197. jstrrchr(
  198.     unsigned char    *str,
  199.     unsigned short    c)
  200. /*
  201.  *    PURPOSE
  202.  *        文字列strの中で最も最後に現れた文字cへのポインタを返す.
  203.  *    RETURNS
  204.  *        not NULL    : cへのポインタ
  205.  *        NULL        : 発見できず
  206.  *    NOTICE
  207.  *        文字cは2バイト文字であってはならない.
  208.  *        この点はMSC非互換である.
  209.  */
  210. {
  211.     unsigned short    ch;
  212.     unsigned char    *pFound = NULL;
  213.     
  214.     if (str == NULL)
  215.         return(NULL);
  216.     
  217.     while ((ch = *str++) != '\0') {
  218.         if (iskanji(ch))
  219.             str++;
  220.         else if (ch == c)
  221.             pFound = str - 1;
  222.     }
  223.     return(pFound);
  224. }
  225. /* ---    jstrrchr()  --- */
  226.  
  227.  
  228. GLOBAL    int
  229. iskanji(
  230.     int    c)
  231. /*
  232.  *    PURPOSE
  233.  *        文字cが2バイト文字の第一バイトであるか否かを調べる.
  234.  *    RETURNS
  235.  *        1    : 第一バイトである
  236.  *        0    : 第一バイトでない
  237.  */
  238. {
  239.     if (c >= 0x81 && c <= 0x9f)
  240.         return(1);
  241.     if (c >= 0xe0 && c <= 0xfc)
  242.         return(1);
  243.     return(0);
  244. }
  245. /* ---    iskanji()  --- */
  246.  
  247.  
  248. /****************************************/
  249. /*        その他の関数        */
  250. /****************************************/
  251.  
  252. /*    今のところはない    */
  253.  
  254. /*****    msdos.c  *****/
  255.