119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright 2003 by MIT Student Information Processing Board 319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Permission to use, copy, modify, and distribute this software and 519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * its documentation for any purpose is hereby granted, provided that 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * the names of M.I.T. and the M.I.T. S.I.P.B. not be used in 719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * advertising or publicity pertaining to distribution of the software 819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * without specific, written prior permission. M.I.T. and the 919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * M.I.T. S.I.P.B. make no representations about the suitability of 1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * this software for any purpose. It is provided "as is" without 1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * express or implied warranty. 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAS_STDLIB_H 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdlib.h> 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ss_internal.h" 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define size sizeof(ss_data *) 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_DLOPEN 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <dlfcn.h> 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void ss_release_readline(ss_data *info) 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_DLOPEN 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!info->readline_handle) 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 283984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project info->readline = 0; 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project info->add_history = 0; 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project info->redisplay = 0; 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project info->rl_completion_matches = 0; 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project dlclose(info->readline_handle); 3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project info->readline_handle = 0; 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Libraries we will try to use for readline/editline functionality */ 393984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#define DEFAULT_LIBPATH "libreadline.so.6:libreadline.so.5:libreadline.so.4:libreadline.so:libedit.so.2:libedit.so:libeditline.so.0:libeditline.so" 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid ss_get_readline(int sci_idx) 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_DLOPEN 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project void *handle = NULL; 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ss_data *info = ss_info(sci_idx); 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char **t, *libpath = 0; 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *tmp, *cp, *next; 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char **(**completion_func)(const char *, int, int); 493984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (info->readline_handle) 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project libpath = ss_safe_getenv("SS_READLINE_PATH"); 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!libpath) 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project libpath = DEFAULT_LIBPATH; 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*libpath == 0 || !strcmp(libpath, "none")) 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 583984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project tmp = malloc(strlen(libpath)+1); 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!tmp) 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project strcpy(tmp, libpath); 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (cp = tmp; cp; cp = next) { 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project next = strchr(cp, ':'); 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (next) 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *next++ = 0; 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*cp == 0) 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project continue; 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((handle = dlopen(cp, RTLD_NOW))) { 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* printf("Using %s for readline library\n", cp); */ 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project free(tmp); 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!handle) 7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project info->readline_handle = handle; 7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project info->readline = (char *(*)(const char *)) 8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project dlsym(handle, "readline"); 8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project info->add_history = (void (*)(const char *)) 8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project dlsym(handle, "add_history"); 8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project info->redisplay = (void (*)(void)) 8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project dlsym(handle, "rl_forced_update_display"); 8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project info->rl_completion_matches = (char **(*)(const char *, 8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *(*)(const char *, int))) 8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project dlsym(handle, "rl_completion_matches"); 8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((t = dlsym(handle, "rl_readline_name")) != NULL) 8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *t = info->subsystem_name; 9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((completion_func = 9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project dlsym(handle, "rl_attempted_completion_function")) != NULL) 9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *completion_func = ss_rl_completion; 9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project info->readline_shutdown = ss_release_readline; 9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 973984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 98