From 71d9447316133c8e447ca7538d9533e1ef61e0eb Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Fri, 10 Apr 2009 14:32:16 +0200 Subject: Goodbye readline "It's too big and too slow." -- man readline --- src/ui.c | 69 ++++++++++++++++------------------------------------------------ 1 file changed, 17 insertions(+), 52 deletions(-) (limited to 'src/ui.c') diff --git a/src/ui.c b/src/ui.c index 6154371..91860cf 100644 --- a/src/ui.c +++ b/src/ui.c @@ -36,6 +36,7 @@ THE SOFTWARE. #include #include "ui.h" +#include "ui_readline.h" /* output message and flush stdout * @param message @@ -90,41 +91,6 @@ inline PianoReturn_t BarUiPrintPianoStatus (PianoReturn_t ret) { return ret; } -/* check if all characters of string are numeric - * @param the string - * @return 1 = yes, 0 = not numeric - */ -char BarIsNumericStr (const char *str) { - while (*str != '\0') { - if (isdigit (*str) == 0) { - return 0; - } - str++; - } - return 1; -} - -/* use readline to get integer value - * @param prompt or NULL - * @param returns integer - * @return 1 = success, 0 = failure (not an integer, ...) - */ -char BarReadlineInt (const char *prompt, int *retVal) { - char *buf; - char ret = 0; - - BarUiMsg (MSG_QUESTION, prompt); - if ((buf = readline (NULL)) != NULL && strlen (buf) > 0 && - BarIsNumericStr (buf)) { - *retVal = atoi (buf); - ret = 1; - } - if (buf != NULL) { - free (buf); - } - return ret; -} - /* sort linked list (station) * @param stations * @return NULL-terminated array with sorted stations @@ -200,7 +166,8 @@ PianoStation_t *BarUiSelectStation (PianoHandle_t *ph, const char *prompt) { i++; } - if (!BarReadlineInt (prompt, &i)) { + BarUiMsg (MSG_QUESTION, prompt); + if (BarReadlineInt (&i) == 0) { free (ss); return NULL; } @@ -230,7 +197,8 @@ PianoSong_t *BarUiSelectSong (PianoSong_t *startSong) { i++; tmpSong = tmpSong->next; } - if (!BarReadlineInt ("Select song: ", &i)) { + BarUiMsg (MSG_QUESTION, "Select song: "); + if (BarReadlineInt (&i) == 0) { return NULL; } tmpSong = startSong; @@ -256,7 +224,8 @@ PianoArtist_t *BarUiSelectArtist (PianoArtist_t *startArtist) { i++; tmpArtist = tmpArtist->next; } - if (!BarReadlineInt ("Select artist: ", &i)) { + BarUiMsg (MSG_QUESTION, "Select artist: "); + if (BarReadlineInt (&i) == 0) { return NULL; } tmpArtist = startArtist; @@ -272,19 +241,17 @@ PianoArtist_t *BarUiSelectArtist (PianoArtist_t *startArtist) { * @return musicId or NULL on abort/error */ char *BarUiSelectMusicId (const PianoHandle_t *ph) { - char *musicId = NULL, *lineBuf; - char yesnoBuf; + char *musicId = NULL; + char lineBuf[100], selectBuf[2]; PianoSearchResult_t searchResult; PianoArtist_t *tmpArtist; PianoSong_t *tmpSong; BarUiMsg (MSG_QUESTION, "Search for artist/title: "); - lineBuf = readline (NULL); - if (lineBuf != NULL && strlen (lineBuf) > 0) { + if (BarReadlineStr (lineBuf, sizeof (lineBuf), 0) > 0) { BarUiMsg (MSG_INFO, "Searching... "); if (BarUiPrintPianoStatus (PianoSearchMusic (ph, lineBuf, &searchResult)) != PIANO_RET_OK) { - free (lineBuf); return NULL; } BarUiMsg (MSG_NONE, "\r"); @@ -292,14 +259,13 @@ char *BarUiSelectMusicId (const PianoHandle_t *ph) { /* songs and artists found */ BarUiMsg (MSG_QUESTION, "Is this an [a]rtist or [t]rack name? " "Press c to abort. "); - read (fileno (stdin), &yesnoBuf, sizeof (yesnoBuf)); - BarUiMsg (MSG_NONE, "\n"); - if (yesnoBuf == 'a') { + BarReadline (selectBuf, sizeof (selectBuf), "atc", 1, 0); + if (*selectBuf == 'a') { tmpArtist = BarUiSelectArtist (searchResult.artists); if (tmpArtist != NULL) { musicId = strdup (tmpArtist->musicId); } - } else if (yesnoBuf == 't') { + } else if (*selectBuf == 't') { tmpSong = BarUiSelectSong (searchResult.songs); if (tmpSong != NULL) { musicId = strdup (tmpSong->musicId); @@ -322,9 +288,6 @@ char *BarUiSelectMusicId (const PianoHandle_t *ph) { } PianoDestroySearchResult (&searchResult); } - if (lineBuf != NULL) { - free (lineBuf); - } return musicId; } @@ -355,7 +318,8 @@ void BarStationFromGenre (PianoHandle_t *ph) { curCat = curCat->next; } /* select category or exit */ - if (!BarReadlineInt ("Select category: ", &i)) { + BarUiMsg (MSG_QUESTION, "Select category: "); + if (BarReadlineInt (&i) == 0) { return; } curCat = ph->genreStations; @@ -372,7 +336,8 @@ void BarStationFromGenre (PianoHandle_t *ph) { i++; curStation = curStation->next; } - if (!BarReadlineInt ("Select genre: ", &i)) { + BarUiMsg (MSG_QUESTION, "Select genre: "); + if (BarReadlineInt (&i) == 0) { return; } curStation = curCat->stations; -- cgit v1.2.3