improve WIN32 support and installation
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@2170 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
122
LGPL/swi_console/complete.c
Normal file
122
LGPL/swi_console/complete.c
Normal file
@@ -0,0 +1,122 @@
|
||||
/* $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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user