add .prompt and .title file handling - lchat - A line oriented chat front end for ii.
 (HTM) git clone git://git.suckless.org/lchat
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
 (DIR) commit 3a2446ff8f1e0d30bf3b1ee02617e15020bc829a
 (DIR) parent 595d8b5e4d763305139cbd482a8c469f9e926494
 (HTM) Author: Jan Klemkow <j.klemkow@wemelug.de>
       Date:   Mon, 11 Jan 2016 21:49:31 +0100
       
       add .prompt and .title file handling
       
       add the possibility to set prompt and window title by file.
       
       Diffstat:
         M lchat.1                             |       6 +++++-
         M lchat.c                             |      52 +++++++++++++++++++++++++++----
       
       2 files changed, 51 insertions(+), 7 deletions(-)
       ---
 (DIR) diff --git a/lchat.1 b/lchat.1
       @@ -49,7 +49,7 @@ as prompt for the input line.
        .It Fl t Ar title
        Use
        .Ar title
       -as title terminal window.
       +as title for the terminal window.
        In a
        .Xr tmux 1
        or
       @@ -84,6 +84,10 @@ If this file exists and has executable permissions, it is used as a filter
        program for the output lines.
        This program should read raw lines from stdin and outputs filtered or
        transformed lines to stdout.
       +.It .prompt
       +contains the prompt string.
       +.It .title
       +contains the terminal window title.
        .El
        .Sh SEE ALSO
        .Xr tail 1 ,
 (DIR) diff --git a/lchat.c b/lchat.c
       @@ -51,6 +51,35 @@ exit_handler(void)
                        err(EXIT_FAILURE, "tcsetattr");
        }
        
       +static char *
       +read_file_line(const char *file)
       +{
       +        FILE *fh;
       +        char buf[BUFSIZ];
       +        char *line = NULL;
       +        char *nl = NULL;
       +
       +        if (access(file, R_OK) == -1)
       +                return NULL;
       +
       +        if ((fh = fopen(file, "r")) == NULL)
       +                err(EXIT_FAILURE, "fopen");
       +
       +        if (fgets(buf, sizeof buf, fh) == NULL)
       +                err(EXIT_FAILURE, "fgets");
       +
       +        if (fclose(fh) == EOF)
       +                err(EXIT_FAILURE, "fclose");
       +
       +        if ((nl = strchr(buf, '\n')) != NULL)        /* delete new line */
       +                *nl = '\0';
       +
       +        if ((line = strdup(buf)) == NULL)
       +                err(EXIT_FAILURE ,"strdup");
       +
       +        return line;
       +}
       +
        static bool
        bell_match(const char *str, const char *regex_file)
        {
       @@ -114,7 +143,12 @@ main(int argc, char *argv[])
                bool bell_flag = true;
                char *bell_file = ".bellmatch";
                size_t history_len = 5;
       -        char *prompt = ">";
       +        char *prompt = read_file_line(".prompt");
       +        char *title = read_file_line(".title");
       +
       +        if (prompt == NULL)        /* set default prompt */
       +                prompt = ">";
       +
                size_t prompt_len = strlen(prompt);
                size_t loverhang = 0;
                char *dir = ".";
       @@ -149,11 +183,9 @@ main(int argc, char *argv[])
                                        err(EXIT_FAILURE, "strdup");
                                prompt_len = strlen(prompt);
                                break;
       -                case 't':        /* set optarg to terminal's window title */
       -                        if (strcmp(getenv("TERM"), "screen") == 0)
       -                                printf("\033k%s\033\\", optarg);
       -                        else
       -                                printf("\033]0;%s\a", optarg);
       +                case 't':
       +                        if ((title = strdup(optarg)) == NULL)
       +                                err(EXIT_FAILURE, "strdup");
                                break;
                        case 'h':
                        default:
       @@ -182,6 +214,14 @@ main(int argc, char *argv[])
                if (isatty(fd) == 0)
                        err(EXIT_FAILURE, "isatty");
        
       +        /* set optarg to terminal's window title */
       +        if (title != NULL) {
       +                if (strcmp(getenv("TERM"), "screen") == 0)
       +                        printf("\033k%s\033\\", title);
       +                else
       +                        printf("\033]0;%s\a", title);
       +        }
       +
                /* preprate terminal reset on exit */
                if (tcgetattr(fd, &origin_term) == -1)
                        err(EXIT_FAILURE, "tcgetattr");