/* al_findnext: * Retrieves the next file from a directory search. */ int al_findnext(struct al_ffblk *info) { struct FF_DATA *ff_data = (struct FF_DATA *) info->ff_data; if (get_filename_encoding() != U_UNICODE) { do { if (_findnext(ff_data->handle, &ff_data->data.a) != 0) { *allegro_errno = errno; return -1; } } while (ff_data->data.a.attrib & ~ff_data->attrib); } else { do { if (_wfindnext(ff_data->handle, &ff_data->data.w) != 0) { *allegro_errno = errno; return -1; } } while (ff_data->data.w.attrib & ~ff_data->attrib); } fill_ffblk(info); return 0; }
/* al_findnext: * Retrieves the next file from a directory search. */ int al_findnext(struct al_ffblk *info) { struct FF_DATA *ff_data = (struct FF_DATA *) info->ff_data; if (!_al_win_unicode_filenames) { do { if (_findnext(ff_data->handle, &ff_data->data.a) != 0) { *allegro_errno = errno; return -1; } } while (ff_data->data.a.attrib & ~ff_data->attrib); } else { do { if (_wfindnext(ff_data->handle, &ff_data->data.w) != 0) { *allegro_errno = errno; return -1; } } while (ff_data->data.w.attrib & ~ff_data->attrib); } fill_ffblk(info); return 0; }
/* al_findfirst: * Initiates a directory search. */ int al_findfirst(AL_CONST char *pattern, struct al_ffblk *info, int attrib) { struct FF_DATA *ff_data; char tmp[1024]; /* allocate ff_data structure */ ff_data = _AL_MALLOC(sizeof(struct FF_DATA)); if (!ff_data) { *allegro_errno = ENOMEM; return -1; } /* attach it to the info structure */ info->ff_data = (void *) ff_data; /* Windows defines specific flags for NTFS permissions: * FA_TEMPORARY 0x0100 * FA_SPARSE_FILE 0x0200 * FA_REPARSE_POINT 0x0400 * FA_COMPRESSED 0x0800 * FA_OFFLINE 0x1000 * FA_NOT_CONTENT_INDEXED 0x2000 * FA_ENCRYPTED 0x4000 * so we must set them in the mask by default; moreover, * in order to avoid problems with flags added in the * future, we simply set all bits past the first byte. */ ff_data->attrib = attrib | 0xFFFFFF00; /* start the search */ errno = *allegro_errno = 0; if (get_filename_encoding() != U_UNICODE) { ff_data->handle = _findfirst(uconvert(pattern, U_CURRENT, tmp, U_ASCII, sizeof(tmp)), &ff_data->data.a); if (ff_data->handle < 0) { *allegro_errno = errno; _AL_FREE(ff_data); info->ff_data = NULL; return -1; } if (ff_data->data.a.attrib & ~ff_data->attrib) { if (al_findnext(info) != 0) { al_findclose(info); return -1; } else return 0; } } else { ff_data->handle = _wfindfirst((wchar_t*)uconvert(pattern, U_CURRENT, tmp, U_UNICODE, sizeof(tmp)), &ff_data->data.w); if (ff_data->handle < 0) { *allegro_errno = errno; _AL_FREE(ff_data); info->ff_data = NULL; return -1; } if (ff_data->data.w.attrib & ~ff_data->attrib) { if (al_findnext(info) != 0) { al_findclose(info); return -1; } else return 0; } } fill_ffblk(info); return 0; }