my_os2dirsrch.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) Yuri Dario & 2000-2003 MySQL AB
  2.    All the above parties has a full, independent copyright to
  3.    the following code, including the right to use the code in
  4.    any manner without any demands from the other parties.
  5.    This library is free software; you can redistribute it and/or
  6.    modify it under the terms of the GNU Library General Public
  7.    License as published by the Free Software Foundation; either
  8.    version 2 of the License, or (at your option) any later version.
  9.    This library is distributed in the hope that it will be useful,
  10.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.    Library General Public License for more details.
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17. /* Win32 directory search emulation */
  18. #if defined(OS2)
  19. long  _findfirst( char* path, struct _finddata_t* dos_file)
  20. {
  21.   HDIR   hdir = HDIR_CREATE;
  22.   APIRET   rc;
  23.   FILEFINDBUF3   buf3;
  24.   ULONG   entries = 1;
  25. #ifdef _DEBUG
  26.   printf( "_findfirst path %sn", path);
  27. #endif
  28.   memset( &buf3, 0, sizeof( buf3));
  29.   rc = DosFindFirst(
  30.     path,  /* The ASCIIZ path name of the file or subdirectory to be found. */
  31.     &hdir,   /*  The handle associated with this DosFindFirst request. */
  32.     FILE_NORMAL | FILE_DIRECTORY,  /*  Attribute value that determines the file objects to be searched for. */
  33.     &buf3,   /*  Result buffer. */
  34.     sizeof( buf3),      /*  The length, in bytes, of pfindbuf. */
  35.     &entries,  /*  Pointer to the number of entries: */
  36.     FIL_STANDARD);  /*  The level of file information required. */
  37. #ifdef _DEBUG
  38.   printf( "_findfirst rc=%d hdir=%d entries=%d->%sn", rc, hdir, entries,
  39.   buf3.achName);
  40. #endif
  41.   if (rc /* && entries == 0 */)
  42.     return -1;
  43.   if (dos_file)
  44.   {
  45.     memset( dos_file, 0, sizeof( struct _finddata_t));
  46.     strcpy( dos_file->name, buf3.achName);
  47.     dos_file->size = buf3.cbFile;
  48.     dos_file->attrib = buf3.attrFile;
  49.   }
  50.   return (ULONG) hdir;
  51. }
  52. long  _findnext( long hdir, struct _finddata_t* dos_file)
  53. {
  54.   APIRET   rc;
  55.   FILEFINDBUF3   buf3;
  56.   ULONG   entries = 1;
  57.   memset( &buf3, 0, sizeof( buf3));
  58.   rc = DosFindNext(hdir,
  59.    &buf3, /* Result buffer. */
  60.    sizeof( buf3), /* Length, in bytes, of pfindbuf. */
  61.    &entries); /* Pointer to the number of entries */
  62. #ifdef _DEBUG
  63.   printf( "_findnext rc=%d hdir=%d entries=%d->%sn", rc, hdir, entries,
  64.   buf3.achName);
  65. #endif
  66.   if (rc /* && entries == 0 */)
  67.     return -1;
  68.   if (dos_file)
  69.   {
  70.     memset( dos_file, 0, sizeof( struct _finddata_t));
  71.     strcpy( dos_file->name, buf3.achName);
  72.     dos_file->size = buf3.cbFile;
  73.     dos_file->attrib = buf3.attrFile;
  74.   }
  75.   return 0;
  76. }
  77. void  _findclose( long hdir)
  78. {
  79.    APIRET   rc;
  80.    rc = DosFindClose( hdir);
  81. #ifdef _DEBUG
  82.    printf( "_findclose rc=%d hdir=%dn", rc, hdir);
  83. #endif
  84. }
  85. DIR* opendir(char* path)
  86. {
  87.   DIR* dir = (DIR*) calloc(1, sizeof( DIR));
  88.   char buffer[260];
  89.   APIRET   rc;
  90.   ULONG   entries = 1;
  91.   strmov(strmov(buffer, path), "*.*");
  92. #ifdef _DEBUG
  93.   printf( "_findfirst path %sn", buffer);
  94. #endif
  95.   dir->hdir = HDIR_CREATE;
  96.   memset( &dir->buf3, 0, sizeof( dir->buf3));
  97.   rc = DosFindFirst(
  98.     buffer, /*  Address of the ASCIIZ path name of the file or subdirectory to be found. */
  99.     &dir->hdir,   /*  Address of the handle associated with this DosFindFirst request. */
  100.     FILE_NORMAL | FILE_DIRECTORY,  /*  Attribute value that determines the file objects to be searched for. */
  101.     &dir->buf3,     /*  Result buffer. */
  102.     sizeof( dir->buf3),   /*  The length, in bytes, of pfindbuf. */
  103.     &entries,  /*  Pointer to the number of entries: */
  104.     FIL_STANDARD);  /*  The level of file information required. */
  105. #ifdef _DEBUG
  106.   printf( "opendir rc=%d hdir=%d entries=%d->%sn", rc, dir->hdir, entries, dir->buf3.achName);
  107. #endif
  108.   if (rc /* && entries == 0 */)
  109.     return NULL;
  110.   return dir;
  111. }
  112. struct dirent* readdir( DIR* dir)
  113. {
  114.   APIRET   rc;
  115.   ULONG   entries = 1;
  116.   if (!dir->buf3.achName[0]) /* file not found on previous query */
  117.     return NULL;
  118.   /* copy last file name */
  119.   strcpy( dir->ent.d_name, dir->buf3.achName);
  120.   /* query next file */
  121.   memset( &dir->buf3, 0, sizeof( dir->buf3));
  122.   rc= DosFindNext(
  123.   dir->hdir,
  124.   &dir->buf3, /* Result buffer. */
  125.   sizeof(dir->buf3), /* Length, in bytes, of pfindbuf. */
  126.    &entries); /* Pointer to the number of entries */
  127. #ifdef _DEBUG
  128.   printf( "_findnext rc=%d hdir=%d entries=%d->%sn", rc, dir->hdir, entries,
  129.   dir->buf3.achName);
  130. #endif
  131.   if (rc /* && entries == 0 */)
  132.     *dir->buf3.achName= 0; /* reset name for next query */
  133.   return &dir->ent;
  134. }
  135. int closedir (DIR *dir)
  136. {
  137.   APIRET   rc;
  138.   rc = DosFindClose( dir->hdir);
  139. #ifdef _DEBUG
  140.   printf( "_findclose rc=%d hdir=%dn", rc, dir->hdir);
  141. #endif
  142.   free(dir);
  143.   return 0;
  144. }
  145. #endif /* OS2 */