| 
									
										
										
										
											2008-03-27 00:41:33 +00:00
										 |  |  | /*  $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 <windows.h>
 | 
					
						
							|  |  |  | #include <tchar.h>
 | 
					
						
							|  |  |  | #include "console.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-20 13:41:12 +01:00
										 |  |  | #ifndef __TCHAR_DEFINED
 | 
					
						
							| 
									
										
										
										
											2008-03-27 00:41:33 +00:00
										 |  |  | typedef wint_t _TINT; | 
					
						
							| 
									
										
										
										
											2010-07-20 13:41:12 +01:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-03-27 00:41:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #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; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |