/* $Id: complete.c,v 1.1 2008-03-27 00:41:33 vsc Exp $ Part of SWI-Prolog Author: Jan Wielemaker E-mail: jan@swi.psy.uva.nl WWW: http://www.swi-prolog.org Copyright (C): 1985-2002, University of Amsterdam This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include "console.h" #ifndef __TCHAR_DEFINED typedef wint_t _TINT; #endif #ifndef EOS #define EOS 0 #endif static TCHAR *completion_chars = TEXT("~:\\/-."); static size_t complete_scan_backwards(Line ln, size_t from) { while( from > 0 ) { _TINT c = ln->data[from-1]; if ( rlc_is_word_char(c) || _tcschr(completion_chars, c) ) from--; else break; } return from; } static __inline int close_quote(int c) { return (c == '\'' || c == '"') ? c : 0; } int rlc_complete_file_function(RlcCompleteData data) { Line ln = data->line; WIN32_FIND_DATA fdata; switch(data->call_type) { case COMPLETE_INIT: { size_t start = complete_scan_backwards(ln, ln->point); TCHAR *pattern = data->buf_handle; TCHAR *s = pattern; size_t n = start; size_t ld = start; HANDLE h; if ( ln->point - start > 200 ) return FALSE; for( ; n < ln->point; n++) { int c = ln->data[n]; if ( c == '/' ) c = '\\'; if ( c == '\\' ) ld = n + 1; *s++ = c; } *s++ = '*'; *s = EOS; if ( (h=FindFirstFile(pattern, &fdata)) != INVALID_HANDLE_VALUE ) { data->replace_from = (int)ld; if ( start > 0 && !(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) data->quote = close_quote(ln->data[start-1]); _tcscpy(data->candidate, fdata.cFileName); data->ptr_handle = h; data->case_insensitive = TRUE; data->function = rlc_complete_file_function; return TRUE; } return FALSE; } case COMPLETE_ENUMERATE: { if ( FindNextFile(data->ptr_handle, &fdata) ) { _tcscpy(data->candidate, fdata.cFileName); return TRUE; } return FALSE; } case COMPLETE_CLOSE: { FindClose(data->ptr_handle); return FALSE; } default: return FALSE; } }