1a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner/* Directory entry code for Window platforms. 2a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerCopyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 3a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner2006 Free Software Foundation, Inc. 4a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerThis file is part of GNU Make. 5a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 6a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerGNU Make is free software; you can redistribute it and/or modify it under the 7a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnerterms of the GNU General Public License as published by the Free Software 8a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerFoundation; either version 2, or (at your option) any later version. 9a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 10a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerGNU Make is distributed in the hope that it will be useful, but WITHOUT ANY 11a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerWARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR 12a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerA PARTICULAR PURPOSE. See the GNU General Public License for more details. 13a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 14a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerYou should have received a copy of the GNU General Public License along with 15a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerGNU Make; see the file COPYING. If not, write to the Free Software 16a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerFoundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ 17a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 18a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 19a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner#include <sys/types.h> 20a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner#include <sys/stat.h> 21a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner#include <errno.h> 22a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner#include <string.h> 23a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner#include <stdlib.h> 24a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner#include "dirent.h" 25a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 26a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 27a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerDIR* 28a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turneropendir(const char* pDirName) 29a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner{ 30a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner struct stat sb; 31a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner DIR* pDir; 32a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner char* pEndDirName; 33a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner int nBufferLen; 34a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 35a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* sanity checks */ 36a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if (!pDirName) { 37a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner errno = EINVAL; 38a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return NULL; 39a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner } 40a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if (stat(pDirName, &sb) != 0) { 41a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner errno = ENOENT; 42a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return NULL; 43a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner } 44a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if ((sb.st_mode & S_IFMT) != S_IFDIR) { 45a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner errno = ENOTDIR; 46a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return NULL; 47a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner } 48a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 49a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* allocate a DIR structure to return */ 50a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner pDir = (DIR *) malloc(sizeof (DIR)); 51a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 52a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if (!pDir) 53a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return NULL; 54a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 55a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* input directory name length */ 56a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner nBufferLen = strlen(pDirName); 57a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 58a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* copy input directory name to DIR buffer */ 59a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner strcpy(pDir->dir_pDirectoryName, pDirName); 60a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 61a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* point to end of the copied directory name */ 62a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner pEndDirName = &pDir->dir_pDirectoryName[nBufferLen - 1]; 63a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 64a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* if directory name did not end in '/' or '\', add '/' */ 65a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if ((*pEndDirName != '/') && (*pEndDirName != '\\')) { 66a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner pEndDirName++; 67a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner *pEndDirName = '/'; 68a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner } 69a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 70a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* now append the wildcard character to the buffer */ 71a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner pEndDirName++; 72a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner *pEndDirName = '*'; 73a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner pEndDirName++; 74a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner *pEndDirName = '\0'; 75a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 76a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* other values defaulted */ 77a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner pDir->dir_nNumFiles = 0; 78a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner pDir->dir_hDirHandle = INVALID_HANDLE_VALUE; 79a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner pDir->dir_ulCookie = __DIRENT_COOKIE; 80a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 81a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return pDir; 82a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner} 83a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 84a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnervoid 85a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnerclosedir(DIR *pDir) 86a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner{ 87a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* got a valid pointer? */ 88a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if (!pDir) { 89a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner errno = EINVAL; 90a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return; 91a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner } 92a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 93a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* sanity check that this is a DIR pointer */ 94a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if (pDir->dir_ulCookie != __DIRENT_COOKIE) { 95a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner errno = EINVAL; 96a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return; 97a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner } 98a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 99a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* close the WINDOWS32 directory handle */ 100a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if (pDir->dir_hDirHandle != INVALID_HANDLE_VALUE) 101a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner FindClose(pDir->dir_hDirHandle); 102a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 103a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner free(pDir); 104a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 105a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return; 106a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner} 107a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 108a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnerstruct dirent * 109a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnerreaddir(DIR* pDir) 110a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner{ 111a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner WIN32_FIND_DATA wfdFindData; 112a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 113a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if (!pDir) { 114a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner errno = EINVAL; 115a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return NULL; 116a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner } 117a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 118a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* sanity check that this is a DIR pointer */ 119a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if (pDir->dir_ulCookie != __DIRENT_COOKIE) { 120a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner errno = EINVAL; 121a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return NULL; 122a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner } 123a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 124a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if (pDir->dir_nNumFiles == 0) { 125a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner pDir->dir_hDirHandle = FindFirstFile(pDir->dir_pDirectoryName, &wfdFindData); 126a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if (pDir->dir_hDirHandle == INVALID_HANDLE_VALUE) 127a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return NULL; 128a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner } else if (!FindNextFile(pDir->dir_hDirHandle, &wfdFindData)) 129a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return NULL; 130a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 131a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* bump count for next call to readdir() or telldir() */ 132a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner pDir->dir_nNumFiles++; 133a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 134a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* fill in struct dirent values */ 135a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner pDir->dir_sdReturn.d_ino = -1; 136a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner strcpy(pDir->dir_sdReturn.d_name, wfdFindData.cFileName); 137a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 138a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return &pDir->dir_sdReturn; 139a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner} 140a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 141a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnervoid 142a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnerrewinddir(DIR* pDir) 143a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner{ 144a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if (!pDir) { 145a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner errno = EINVAL; 146a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return; 147a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner } 148a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 149a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* sanity check that this is a DIR pointer */ 150a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if (pDir->dir_ulCookie != __DIRENT_COOKIE) { 151a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner errno = EINVAL; 152a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return; 153a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner } 154a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 155a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* close the WINDOWS32 directory handle */ 156a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if (pDir->dir_hDirHandle != INVALID_HANDLE_VALUE) 157a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if (!FindClose(pDir->dir_hDirHandle)) 158a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner errno = EBADF; 159a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 160a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* reset members which control readdir() */ 161a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner pDir->dir_hDirHandle = INVALID_HANDLE_VALUE; 162a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner pDir->dir_nNumFiles = 0; 163a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 164a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return; 165a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner} 166a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 167a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnerint 168a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnertelldir(DIR* pDir) 169a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner{ 170a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if (!pDir) { 171a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner errno = EINVAL; 172a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return -1; 173a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner } 174a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 175a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* sanity check that this is a DIR pointer */ 176a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if (pDir->dir_ulCookie != __DIRENT_COOKIE) { 177a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner errno = EINVAL; 178a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return -1; 179a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner } 180a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 181a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* return number of times readdir() called */ 182a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return pDir->dir_nNumFiles; 183a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner} 184a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 185a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnervoid 186a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnerseekdir(DIR* pDir, long nPosition) 187a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner{ 188a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if (!pDir) 189a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return; 190a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 191a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* sanity check that this is a DIR pointer */ 192a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if (pDir->dir_ulCookie != __DIRENT_COOKIE) 193a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return; 194a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 195a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* go back to beginning of directory */ 196a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner rewinddir(pDir); 197a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 198a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* loop until we have found position we care about */ 199a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner for (--nPosition; nPosition && readdir(pDir); nPosition--); 200a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 201a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner /* flag invalid nPosition value */ 202a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner if (nPosition) 203a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner errno = EINVAL; 204a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner 205a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner return; 206a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner} 207