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; }
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; }