From ffa25716611e1af39cf5cd4f6a1248d208040374 Mon Sep 17 00:00:00 2001
From: Jerome Duval <jerome.duval@gmail.com>
Date: Wed, 3 Sep 2014 15:09:24 +0000
Subject: haiku patch


diff --git a/cmdbuf.c b/cmdbuf.c
index 69d7414..6686cdf 100644
--- a/cmdbuf.c
+++ b/cmdbuf.c
@@ -74,16 +74,16 @@ struct mlist
 /*
  * These are the various command histories that exist.
  */
-struct mlist mlist_search =  
+struct mlist mlist_search =
 	{ &mlist_search,  &mlist_search,  &mlist_search,  NULL, 0 };
 public void * constant ml_search = (void *) &mlist_search;
 
-struct mlist mlist_examine = 
+struct mlist mlist_examine =
 	{ &mlist_examine, &mlist_examine, &mlist_examine, NULL, 0 };
 public void * constant ml_examine = (void *) &mlist_examine;
 
 #if SHELL_ESCAPE || PIPEC
-struct mlist mlist_shell =   
+struct mlist mlist_shell =
 	{ &mlist_shell,   &mlist_shell,   &mlist_shell,   NULL, 0 };
 public void * constant ml_shell = (void *) &mlist_shell;
 #endif
@@ -420,7 +420,7 @@ cmd_right()
 	char *pr;
 	char *ncp;
 	int width;
-	
+
 	if (*cp == '\0')
 	{
 		/* Already at the end of the line. */
@@ -454,7 +454,7 @@ cmd_left()
 {
 	char *ncp;
 	int width, bswidth;
-	
+
 	if (cp <= cmdbuf)
 	{
 		/* Already at the beginning of the line */
@@ -485,14 +485,14 @@ cmd_ichar(cs, clen)
 	int clen;
 {
 	char *s;
-	
+
 	if (strlen(cmdbuf) + clen >= sizeof(cmdbuf)-1)
 	{
 		/* No room in the command buffer for another char. */
 		bell();
 		return (CC_ERROR);
 	}
-		
+
 	/*
 	 * Make room for the new character (shift the tail of the buffer right).
 	 */
@@ -552,7 +552,7 @@ cmd_erase()
 	 */
 	updown_match = -1;
 	cmd_repaint(cp);
-	
+
 	/*
 	 * We say that erasing the entire command string causes us
 	 * to abort the current command, if CF_QUIT_ON_ERASE is set.
@@ -689,7 +689,7 @@ cmd_updown(action)
 {
 	char *s;
 	struct mlist *ml;
-	
+
 	if (curr_mlist == NULL)
 	{
 		/*
@@ -754,7 +754,7 @@ cmd_addhist(mlist, cmd, modified)
 {
 #if CMD_HISTORY
 	struct mlist *ml;
-	
+
 	/*
 	 * Don't save a trivial command.
 	 */
@@ -826,7 +826,7 @@ cmd_edit(c)
 #else
 #define	not_in_completion()
 #endif
-	
+
 	/*
 	 * See if the char is indeed a line-editing command.
 	 */
@@ -937,7 +937,7 @@ cmd_istr(str)
 	char *s;
 	int action;
 	char *endline = str + strlen(str);
-	
+
 	for (s = str;  *s != '\0';  )
 	{
 		char *os = s;
@@ -969,7 +969,7 @@ delimit_word()
 	char *esc = get_meta_escape();
 	int esclen = (int) strlen(esc);
 #endif
-	
+
 	/*
 	 * Move cursor to end of word.
 	 */
@@ -1042,7 +1042,7 @@ delimit_word()
 
 /*
  * Set things up to enter completion mode.
- * Expand the word under the cursor into a list of filenames 
+ * Expand the word under the cursor into a list of filenames
  * which start with that word, and set tk_text to that list.
  */
 	static void
@@ -1050,7 +1050,7 @@ init_compl()
 {
 	char *word;
 	char c;
-	
+
 	/*
 	 * Get rid of any previous tk_text.
 	 */
@@ -1139,8 +1139,8 @@ cmd_complete(action)
 	if (!in_completion || action == EC_EXPAND)
 	{
 		/*
-		 * Expand the word under the cursor and 
-		 * use the first word in the expansion 
+		 * Expand the word under the cursor and
+		 * use the first word in the expansion
 		 * (or the entire expansion if we're doing EC_EXPAND).
 		 */
 		init_compl();
@@ -1172,13 +1172,13 @@ cmd_complete(action)
 		 */
 		tk_trial = next_compl(action, tk_trial);
 	}
-	
+
   	/*
   	 * Remove the original word, or the previous trial completion.
   	 */
 	while (cp > tk_ipoint)
 		(void) cmd_erase();
-	
+
 	if (tk_trial == NULL)
 	{
 		/*
@@ -1209,9 +1209,9 @@ cmd_complete(action)
 				goto fail;
 		}
 	}
-	
+
 	return (CC_OK);
-	
+
 fail:
 	in_completion = 0;
 	bell();
@@ -1292,7 +1292,7 @@ cmd_char(c)
 		literal = 0;
 		return (cmd_ichar(cmd_mbc_buf, len));
 	}
-		
+
 	/*
 	 * See if it is a line-editing character.
 	 */
@@ -1308,7 +1308,7 @@ cmd_char(c)
 			break;
 		}
 	}
-	
+
 	/*
 	 * Insert the char into the command buffer.
 	 */
@@ -1378,10 +1378,14 @@ mlist_size(ml)
 	static char *
 histfile_name()
 {
+#ifdef __HAIKU__
+	char home[B_PATH_NAME_LENGTH+B_FILE_NAME_LENGTH];
+#else
 	char *home;
+#endif
 	char *name;
 	int len;
-	
+
 	/* See if filename is explicitly specified by $LESSHISTFILE. */
 	name = lgetenv("LESSHISTFILE");
 	if (name != NULL && *name != '\0')
@@ -1396,6 +1400,13 @@ histfile_name()
 	if (strcmp(LESSHISTFILE, "") == 0 || strcmp(LESSHISTFILE, "-") == 0)
 		return (NULL);
 
+#ifdef __HAIKU__
+	{
+	dev_t volume = dev_for_path("/boot");
+	if (find_directory(B_USER_SETTINGS_DIRECTORY, volume, true, home, sizeof(home)) != B_OK)
+		return (NULL);
+	}
+#else
 	/* Otherwise, file is in $HOME. */
 	home = lgetenv("HOME");
 	if (home == NULL || *home == '\0')
@@ -1406,6 +1417,7 @@ histfile_name()
 #endif
 			return (NULL);
 	}
+#endif
 	len = (int) (strlen(home) + strlen(LESSHISTFILE) + 2);
 	name = (char *) ecalloc(len, sizeof(char));
 	SNPRINTF2(name, len, "%s/%s", home, LESSHISTFILE);
diff --git a/configure.ac b/configure.ac
index 4ac9a35..d9e299a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -596,10 +596,17 @@ AH_TOP([
  * LESSHISTFILE is the filename of the history file
  * (in the HOME directory).
  */
-#define	LESSKEYFILE		".less"
-#define	LESSKEYFILE_SYS		SYSDIR "/sysless"
-#define	DEF_LESSKEYINFILE	".lesskey"
-#define LESSHISTFILE		".lesshst"
+#ifdef __HAIKU__
+# define	LESSKEYFILE		"less"
+# define	LESSKEYFILE_SYS		SYSDIR "/sysless"
+# define	DEF_LESSKEYINFILE	"lesskey"
+# define LESSHISTFILE		"lesshst"
+#else
+# define	LESSKEYFILE		".less"
+# define	LESSKEYFILE_SYS		SYSDIR "/sysless"
+# define	DEF_LESSKEYINFILE	".lesskey"
+# define LESSHISTFILE		".lesshst"
+#endif
 
 
 /* Settings always true on Unix.  */
diff --git a/filename.c b/filename.c
index 9631f1c..dc13a96 100644
--- a/filename.c
+++ b/filename.c
@@ -266,12 +266,23 @@ homefile(filename)
 {
 	register char *pathname;
 
+#ifdef __HAIKU__
+	char path[B_PATH_NAME_LENGTH+B_FILE_NAME_LENGTH];
+	dev_t volume = dev_for_path("/boot");
+	if (find_directory(B_USER_SETTINGS_DIRECTORY, volume, true, path, sizeof(path)) != B_OK)
+		return (NULL);
+
+	pathname = dirfile(&path, filename);
+	if (pathname != NULL)
+		return (pathname);
+#else
 	/*
 	 * Try $HOME/filename.
 	 */
 	pathname = dirfile(lgetenv("HOME"), filename);
 	if (pathname != NULL)
 		return (pathname);
+#endif
 #if OS2
 	/*
 	 * Try $INIT/filename.
diff --git a/less.h b/less.h
index f57fb1e..17159dd 100644
--- a/less.h
+++ b/less.h
@@ -93,6 +93,11 @@
 #include <floss.h>
 #endif
 
+#ifdef __HAIKU__
+#include <FindDirectory.h>
+#include <StorageDefs.h>
+#endif
+
 #if MSDOS_COMPILER==WIN32C || OS2
 #include <io.h>
 #endif
diff --git a/lesskey.c b/lesskey.c
index 298748b..fa4c05b 100644
--- a/lesskey.c
+++ b/lesskey.c
@@ -246,8 +246,19 @@ homefile(filename)
 	char *p;
 	char *pathname;
 
+#ifdef __HAIKU__
+	char path[B_PATH_NAME_LENGTH+B_FILE_NAME_LENGTH];
+	dev_t volume = dev_for_path("/boot");
+	if (find_directory(B_USER_SETTINGS_DIRECTORY, volume, true, path, sizeof(path)) != B_OK)
+		return (NULL);
+
+	pathname = mkpathname(&path, filename);
+	if (pathname != NULL)
+		return (pathname);
+#else
 	if ((p = getenv("HOME")) != NULL && *p != '\0')
 		pathname = mkpathname(p, filename);
+#endif
 #if OS2
 	else if ((p = getenv("INIT")) != NULL && *p != '\0')
 		pathname = mkpathname(p, filename);
-- 
2.2.2

