spmenu/libs/stream.c

200 lines
4.8 KiB
C
Raw Normal View History

2023-05-14 00:21:16 +02:00
/* See LICENSE file for copyright and license details. */
void readstdin(void) {
char *line = NULL;
size_t i, junk, size = 0;
ssize_t len;
#if USEIMAGE
int oneitem = 0;
#endif
if (passwd) { // -P: No items should be displayed
2023-06-23 03:38:21 +02:00
sp.inputw = lines = 0;
2023-05-08 23:00:45 +02:00
return;
}
if (listfile) { // -lf: List file is used so no need to read stdin
2023-05-08 17:33:55 +02:00
readfile();
return;
}
/* read each line from stdin and add it to the item list */
for (i = 0; (len = getline(&line, &junk, stdin)) != -1; i++, line = NULL) {
if (i + 1 >= size / sizeof *items)
if (!(items = realloc(items, (size += BUFSIZ))))
die("cannot realloc %zu bytes:", size);
if (line[len - 1] == '\n')
line[len - 1] = '\0';
items[i].text = line;
items[i].index = i;
items[i].hp = arrayhas(hpitems, hplength, items[i].text);
2023-05-07 02:11:16 +02:00
if (parsemarkup(i)) {
#if USEIMAGE
oneitem = 1;
#endif
}
}
free(line);
if (items) {
items[i].text = NULL;
2023-05-08 23:00:45 +02:00
#if USEIMAGE
items[i].image = NULL;
2023-05-08 23:00:45 +02:00
#endif
}
2023-05-07 02:11:16 +02:00
2023-05-08 23:00:45 +02:00
#if USEIMAGE
2023-07-19 01:58:56 +02:00
if (!oneitem) {
img.longestedge = img.imagegaps = 0;
}
#endif
lines = MIN(lines, i);
}
void readfile(void) {
if (passwd){
2023-06-23 03:38:21 +02:00
sp.inputw = lines = 0;
2023-05-08 23:00:45 +02:00
return;
}
2023-05-08 23:00:45 +02:00
size_t len;
2023-05-08 18:16:50 +02:00
static size_t c = 0;
char *l;
FILE *lf = fopen(listfile, "r");
if (!lf) return;
items = NULL;
listsize = 0;
for (;;) {
l = NULL;
len = 0;
if (-1 == getline(&l, &len, lf)) {
if (ferror(lf)) die("spmenu: failed to read file\n");
free(l);
break;
}
2023-05-08 18:16:50 +02:00
if (c == listsize) {
c += 64 * sizeof(char*);
list = realloc(list, c);
if (!list) die("spmenu: failed to realloc memory");
}
strtok(l, "\n");
list[listsize] = l;
listsize++;
}
if (fclose(lf)) {
die("spmenu: failed to close file %s\n", listfile);
}
if (!list_items) {
list_items = items;
items = calloc(listsize + 1, sizeof(struct item));
if (!items) die("spmenu: cannot alloc memory\n");
int i = 0;
2023-05-07 02:11:16 +02:00
int o = 0;
for (i = 0; i < listsize; i++) {
items[i].text = list[i];
2023-05-07 02:11:16 +02:00
if (parsemarkup(i)) {
2023-05-07 02:11:16 +02:00
o = 1;
}
2023-05-08 23:00:45 +02:00
#if !USEIMAGE
if (o) {
;
}
2023-05-08 23:00:45 +02:00
#endif
}
2023-05-08 23:00:45 +02:00
lines = columns == 1 ? i : MIN(i, lines); // i = number of items
2023-05-07 15:35:41 +02:00
2023-05-08 23:00:45 +02:00
#if USEIMAGE
if (!o) img.longestedge = img.imagegaps = 0;
2023-05-08 23:00:45 +02:00
#endif
2023-05-07 02:11:16 +02:00
2023-07-09 23:56:34 +02:00
if (i == sp.listcount) {
sp.listchanged = 0;
sp.listcount = i;
} else {
2023-07-09 23:56:34 +02:00
sp.listcount = i;
sp.listchanged = 1;
2023-05-07 18:07:02 +02:00
// prevents state->buffer from being NULL
if (!protocol) {
resizeclient();
}
}
} else {
free(items);
items = list_items;
list_items = NULL;
}
2023-05-07 02:11:16 +02:00
}
int parsemarkup(int index) {
2023-05-08 23:00:45 +02:00
#if USEIMAGE
int w, h;
char *limg = NULL;
#endif
// parse image markup
#if USEIMAGE
if (!strncmp("IMG:", items[index].text, strlen("IMG:")) || !strncmp("img://", items[index].text, strlen("img://"))) {
2023-05-08 23:00:45 +02:00
if(!(items[index].image = malloc(strlen(items[index].text)+1)))
fprintf(stderr, "spmenu: cannot malloc %lu bytes\n", strlen(items[index].text));
if (sscanf(items[index].text, "IMG:%[^\t]", items[index].image)) {
2023-05-08 23:00:45 +02:00
items[index].text += strlen("IMG:")+strlen(items[index].image)+1;
} else if (sscanf(items[index].text, "img://%[^\t]", items[index].image)) {
items[index].text += strlen("img://")+strlen(items[index].image)+1;
2023-05-07 02:11:16 +02:00
} else {
2023-05-08 23:00:45 +02:00
free(items[index].image);
2023-05-07 02:11:16 +02:00
items[index].image = NULL;
}
2023-05-08 23:00:45 +02:00
} else {
items[index].image = NULL;
}
2023-05-08 23:00:45 +02:00
// load image cache (or generate)
2023-06-23 03:38:21 +02:00
if (generatecache && img.longestedge <= maxcache && items[index].image && strcmp(items[index].image, limg ? limg : "")) {
2023-05-08 23:00:45 +02:00
loadimagecache(items[index].image, &w, &h);
}
2023-05-07 02:11:16 +02:00
2023-05-08 23:00:45 +02:00
if(items[index].image) {
limg = items[index].image;
}
if (limg) {
return 1;
} else {
return 0;
}
2023-05-08 23:00:45 +02:00
#else // remove the data, just for convenience
char *data;
if (!strncmp("IMG:", items[index].text, strlen("IMG:")) || !strncmp("img://", items[index].text, strlen("img://"))) {
2023-05-08 23:00:45 +02:00
if(!(data = malloc(strlen(items[index].text)+1)))
fprintf(stderr, "spmenu: cannot malloc %lu bytes\n", strlen(items[index].text));
if(sscanf(items[index].text, "IMG:%[^\t]", data)) {
items[index].text += strlen("IMG:")+strlen(data)+1;
} else if(sscanf(items[index].text, "img://%[^\t]", data)) {
items[index].text += strlen("img://")+strlen(data)+1;
2023-05-07 02:11:16 +02:00
}
2023-05-08 23:00:45 +02:00
}
return 0;
2023-05-08 23:00:45 +02:00
#endif
}