mirror of
https://github.com/gwenhael-le-moine/sway-patched-tray-menu.git
synced 2024-12-28 22:23:42 +01:00
8cbce77e1d
This now uses the getline function to receive the header, replacing read_line_buffer, which has been deleted since it is otherwise unused. Furthermore, once the protocol has been determined, the current status is handled immediately to be shown (though this has not been added for the i3bar protocol since it has not yet been rewritten to handle this).
72 lines
1.5 KiB
C
72 lines
1.5 KiB
C
#define _POSIX_C_SOURCE 200809L
|
|
#include "readline.h"
|
|
#include "log.h"
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
|
|
char *read_line(FILE *file) {
|
|
size_t length = 0, size = 128;
|
|
char *string = malloc(size);
|
|
char lastChar = '\0';
|
|
if (!string) {
|
|
wlr_log(WLR_ERROR, "Unable to allocate memory for read_line");
|
|
return NULL;
|
|
}
|
|
while (1) {
|
|
int c = getc(file);
|
|
if (c == '\n' && lastChar == '\\'){
|
|
--length; // Ignore last character.
|
|
lastChar = '\0';
|
|
continue;
|
|
}
|
|
if (c == EOF || c == '\n' || c == '\0') {
|
|
break;
|
|
}
|
|
if (c == '\r') {
|
|
continue;
|
|
}
|
|
lastChar = c;
|
|
if (length == size) {
|
|
char *new_string = realloc(string, size *= 2);
|
|
if (!new_string) {
|
|
free(string);
|
|
wlr_log(WLR_ERROR, "Unable to allocate memory for read_line");
|
|
return NULL;
|
|
}
|
|
string = new_string;
|
|
}
|
|
string[length++] = c;
|
|
}
|
|
if (length + 1 == size) {
|
|
char *new_string = realloc(string, length + 1);
|
|
if (!new_string) {
|
|
free(string);
|
|
return NULL;
|
|
}
|
|
string = new_string;
|
|
}
|
|
string[length] = '\0';
|
|
return string;
|
|
}
|
|
|
|
char *peek_line(FILE *file, int line_offset, long *position) {
|
|
long pos = ftell(file);
|
|
size_t length = 0;
|
|
char *line = NULL;
|
|
for (int i = 0; i <= line_offset; i++) {
|
|
ssize_t read = getline(&line, &length, file);
|
|
if (read < 0) {
|
|
free(line);
|
|
line = NULL;
|
|
break;
|
|
}
|
|
if (read > 0 && line[read - 1] == '\n') {
|
|
line[read - 1] = '\0';
|
|
}
|
|
}
|
|
if (position) {
|
|
*position = ftell(file);
|
|
}
|
|
fseek(file, pos, SEEK_SET);
|
|
return line;
|
|
}
|