unixff.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:7k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer and/or licensor of the Original Code and owns the copyrights 
  21.  * in the portions it created.  
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. /* Parts of pmatch() are copyright: */
  36. /*-
  37.  * Copyright (c) 1991, 1993
  38.  * The Regents of the University of California.  All rights reserved.
  39.  *
  40.  * This code is derived from software contributed to Berkeley by
  41.  * Kenneth Almquist.
  42.  *
  43.  * Redistribution and use in source and binary forms, with or without
  44.  * modification, are permitted provided that the following conditions
  45.  * are met:
  46.  * 1. Redistributions of source code must retain the above copyright
  47.  *    notice, this list of conditions and the following disclaimer.
  48.  * 2. Redistributions in binary form must reproduce the above copyright
  49.  *    notice, this list of conditions and the following disclaimer in the
  50.  *    documentation and/or other materials provided with the distribution.
  51.  * 3. All advertising materials mentioning features or use of this software
  52.  *    must display the following acknowledgement:
  53.  * This product includes software developed by the University of
  54.  * California, Berkeley and its contributors.
  55.  * 4. Neither the name of the University nor the names of its contributors
  56.  *    may be used to endorse or promote products derived from this software
  57.  *    without specific prior written permission.
  58.  *
  59.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  60.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  61.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  62.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  63.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  64.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  65.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  66.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  67.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  68.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  69.  * SUCH DAMAGE.
  70.  *
  71.  */
  72. #include <stdlib.h>
  73. #include <string.h>
  74. #include "findfile.h"
  75. #include "platform/unix/unixff.h"
  76. CUnixFindFile::CUnixFindFile (   const char *path,
  77. const char *delimiter,
  78. const char *pattern) : 
  79.     CFindFile (path, delimiter, pattern)
  80. {
  81.     // initialize platform-specific variables 
  82.     m_dirHandle = NULL;
  83.     m_dirEntry = NULL;
  84. }
  85. CUnixFindFile::~CUnixFindFile()
  86. {
  87.     if (m_dirHandle != NULL)
  88.     {
  89.         OS_CloseDirectory();
  90.     }
  91. }
  92. //
  93. // Open the directory; initialize the directory handle.
  94. // Return FALSE if the directory couldn't be opened.
  95. //
  96. BOOL CUnixFindFile::OS_OpenDirectory (const char *dirname)
  97. {
  98.     // don't call this before calling CloseDirectory()!
  99.     if (m_dirHandle != NULL)
  100. return FALSE;
  101.     m_dirHandle = opendir (dirname);
  102.     return (m_dirHandle == NULL ? FALSE:TRUE);
  103. }
  104. //
  105. // Get the next file in the directory.  This *does not*
  106. // filter out based on the pattern; every file is returned.
  107. //
  108. char* CUnixFindFile::OS_GetNextFile()
  109. {
  110.     if (!m_dirHandle)
  111. return NULL;
  112.     m_dirEntry = readdir (m_dirHandle);
  113.     if (m_dirEntry != NULL)
  114. return (m_dirEntry->d_name);
  115.     else
  116. return NULL;
  117. }
  118. //
  119. // release the directory
  120. //
  121. void CUnixFindFile::OS_CloseDirectory ()
  122. {
  123.     if (m_dirHandle)
  124. closedir (m_dirHandle);
  125.     m_dirHandle = NULL;
  126. }
  127. BOOL CUnixFindFile::OS_InitPattern ()
  128. {
  129.     return (TRUE);
  130. }
  131. static int
  132. pmatch(const char* pattern, const char* string)
  133. {
  134.     const char *p, *q;
  135.     char c;
  136.     p = pattern;
  137.     q = string;
  138.     for (;;) {
  139. switch (c = *p++) {
  140. case '':
  141.     goto breakloop;
  142. case '?':
  143.     if (*q++ == '')
  144. return 0;
  145. break;
  146. case '*':
  147.     c = *p;
  148.     if (c != '?' && c != '*' && c != '[') {
  149. while (*q != c) {
  150.     if (*q == '')
  151. return 0;
  152.     q++;
  153. }
  154.     }
  155.     do {
  156. if (pmatch(p, q))
  157.     return 1;
  158.     } while (*q++ != '');
  159. return 0;
  160. case '[': {
  161. const char *endp;
  162. int invert, found;
  163. char chr;
  164. endp = p;
  165. if (*endp == '!')
  166. endp++;
  167. for (;;) {
  168. if (*endp == '')
  169. goto dft; /* no matching ] */
  170. if (*++endp == ']')
  171. break;
  172. }
  173. invert = 0;
  174. if (*p == '!') {
  175. invert++;
  176. p++;
  177. }
  178. found = 0;
  179. chr = *q++;
  180. if (chr == '')
  181. return 0;
  182. c = *p++;
  183. do {
  184.     if (*p == '-' && p[1] != ']') {
  185. p++;
  186. #if 0
  187. if (   collate_range_cmp(chr, c) >= 0
  188.     && collate_range_cmp(chr, *p) <= 0
  189.    )
  190.     found = 1;
  191. #endif
  192. p++;
  193.     } else {
  194. if (chr == c)
  195.     found = 1;
  196.     }
  197. } while ((c = *p++) != ']');
  198. if (found == invert)
  199.     return 0;
  200. break;
  201.     }
  202.     dft:
  203.     default:
  204. if (*q++ != c)
  205.     return 0;
  206.     break;
  207. }
  208.     }
  209. breakloop:
  210.     if (*q != '')
  211. return 0;
  212.     return 1;
  213. }
  214. BOOL CUnixFindFile::OS_FileMatchesPattern (const char * fname)
  215. {
  216.     return pmatch(m_pattern, fname);
  217. }
  218. void CUnixFindFile::OS_FreePattern ()
  219. {
  220. }