123 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			123 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*  $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"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef wint_t _TINT;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#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;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |