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