char* lrs(char* s){
    int size = strlen(s);
    if(size == 0 || size == 1) return s;
    char *arr[size];
    for(int i=0; i<size; i++)
        arr[i] = &s[i];
    std::sort(arr,arr+size,comp());
    char* res = new char[size];
    char* temp = new char[size];
    int max = INT_MIN;
    for(int i=0; i<size-1; i++){
        char* a = arr[i];
        char* b = arr[i+1];
        int x = get_longest_prefix(a,b,temp);
        if(x>max){
            max = x;
            strcpy(res,temp);
        }
    }
    delete temp;
    return res;
}
Ejemplo n.º 2
0
char* complete(char *s, int len, int flags){
	char *search;
	char **results;
	char *ret=NULL;
	char **paths;
	char *path;
	int i;
	int newlen;
	int path_len=0;

	if(flags&COMPLETE_COM){
		char *t;
		path=get_variable("PATH");
		path_len=strlen(path);
		INIT_MEM(t,path_len+3);
		strcpy(t,".:");
		strcpy(t+2,path);
		path=t;
		paths=split_colons(t);
		for(i=0;paths[i];i++){
			newlen=strlen(paths[i]);
			path_len=maximum(newlen,path_len);
		}
		path_len++;
	}

	INIT_MEM(search,path_len+len+2);
	memcpy(search,s,len);

	newlen=strip_quotes(search,len);

	search[newlen]='*';
	search[newlen+1]=0;

	if(flags&COMPLETE_COM){
		char *base=search;
		for(i=0;paths[i];i++){
			path_len=strlen(paths[i]);
			memmove(search+path_len+1,base,newlen+2);
			search[path_len]='/';
			base=search+path_len+1;
			memcpy(search,paths[i],path_len);
			results=simple_glob(search,GLOB_MARK);
			ret=get_longest_prefix(results);
			if(ret){
				base=strdup(ret+(base-search));
				free(ret);
				ret=base;
				break;
			}
		}
	}

	if(!ret && flags&COMPLETE_FILE){
		results=simple_glob(search,GLOB_TILDE|GLOB_NOCHECK|GLOB_MARK);
		ret=get_longest_prefix(results);
	}

	free(search);
	for(i=0;results[i];i++)free(results[i]);
	free(results);

	return ret;
}