*/
void buf_move(struct buf *dst, struct buf *src);
+/**
+ * buf_from_file - read file into memory buffer
+ * @filename: file to read
+ * Free returned buffer with buf_reset().
+ */
+struct buf buf_from_file(const char *filename);
+
#endif /* LABWC_BUF_H */
+++ /dev/null
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * Read file into memory
- *
- * Copyright Johan Malm 2020
- */
-
-#ifndef LABWC_GRAB_FILE_H
-#define LABWC_GRAB_FILE_H
-
-#include "common/buf.h"
-
-/**
- * grab_file - read file into memory buffer
- * @filename: file to read
- * Free returned buffer with buf_reset().
- */
-struct buf grab_file(const char *filename);
-
-#endif /* LABWC_GRAB_FILE_H */
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
+#include <wlr/util/log.h>
#include "common/macros.h"
#include "common/mem.h"
#include "common/string-helpers.h"
*dst = *src;
*src = BUF_INIT;
}
+
+struct buf
+buf_from_file(const char *filename)
+{
+ struct buf buf = BUF_INIT;
+ FILE *stream = fopen(filename, "r");
+ if (!stream) {
+ return buf;
+ }
+
+ if (fseek(stream, 0, SEEK_END) == -1) {
+ wlr_log_errno(WLR_ERROR, "fseek(%s)", filename);
+ fclose(stream);
+ return buf;
+ }
+ long size = ftell(stream);
+ if (size == -1) {
+ wlr_log_errno(WLR_ERROR, "ftell(%s)", filename);
+ fclose(stream);
+ return buf;
+ }
+ rewind(stream);
+
+ buf_expand(&buf, size + 1);
+ if (fread(buf.data, 1, size, stream) == (size_t)size) {
+ buf.len = size;
+ buf.data[size] = '\0';
+ } else {
+ wlr_log_errno(WLR_ERROR, "fread(%s)", filename);
+ buf_reset(&buf);
+ }
+ fclose(stream);
+ return buf;
+}
+++ /dev/null
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Read file into memory
- *
- * Copyright Johan Malm 2020
- */
-
-#define _POSIX_C_SOURCE 200809L
-#include "common/grab-file.h"
-#include "common/buf.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-struct buf
-grab_file(const char *filename)
-{
- char *line = NULL;
- size_t len = 0;
- FILE *stream = fopen(filename, "r");
- if (!stream) {
- return BUF_INIT;
- }
- struct buf buffer = BUF_INIT;
- while ((getline(&line, &len, stream) != -1)) {
- char *p = strrchr(line, '\n');
- if (p) {
- *p = '\0';
- }
- buf_add(&buffer, line);
- }
- free(line);
- fclose(stream);
- return buffer;
-}
'fd-util.c',
'file-helpers.c',
'font.c',
- 'grab-file.c',
'graphic-helpers.c',
'lab-scene-rect.c',
'match.c',
*/
for (struct wl_list *elm = iter(&paths); elm != &paths; elm = iter(elm)) {
struct path *path = wl_container_of(elm, path, link);
- FILE *stream = fopen(path->string, "r");
- if (!stream) {
+ struct buf b = buf_from_file(path->string);
+ if (!b.len) {
continue;
}
wlr_log(WLR_INFO, "read config file %s", path->string);
- struct buf b = BUF_INIT;
- char *line = NULL;
- size_t len = 0;
- while (getline(&line, &len, stream) != -1) {
- char *p = strrchr(line, '\n');
- if (p) {
- *p = '\0';
- }
- buf_add(&b, line);
- }
- zfree(line);
- fclose(stream);
rcxml_parse_xml(&b);
buf_reset(&b);
if (!should_merge_config) {
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "common/grab-file.h"
+#include "common/buf.h"
#include "common/mem.h"
#include "common/string-helpers.h"
#include "buffer.h"
uint32_t color = argb32(rgba);
/* Read file into memory as it's easier to tokenize that way */
- struct buf token_buf = grab_file(filename);
+ struct buf token_buf = buf_from_file(filename);
if (token_buf.len) {
struct token *tokens = tokenize_xbm(token_buf.data);
pixmap = parse_xbm_tokens(tokens, color);
return true;
}
-/*
- * @stream can come from either of the following:
- * - fopen() in the case of reading a file such as menu.xml
- * - popen() when processing pipemenus
- */
-static void
-parse_stream(struct server *server, FILE *stream)
-{
- char *line = NULL;
- size_t len = 0;
- struct buf b = BUF_INIT;
-
- while (getline(&line, &len, stream) != -1) {
- char *p = strrchr(line, '\n');
- if (p) {
- *p = '\0';
- }
- buf_add(&b, line);
- }
- free(line);
- parse_buf(server, NULL, &b);
- buf_reset(&b);
-}
-
static void
parse_xml(const char *filename, struct server *server)
{
for (struct wl_list *elm = iter(&paths); elm != &paths; elm = iter(elm)) {
struct path *path = wl_container_of(elm, path, link);
- FILE *stream = fopen(path->string, "r");
- if (!stream) {
+ struct buf buf = buf_from_file(path->string);
+ if (!buf.len) {
continue;
}
wlr_log(WLR_INFO, "read menu file %s", path->string);
- parse_stream(server, stream);
- fclose(stream);
+ parse_buf(server, /*parent*/ NULL, &buf);
+ buf_reset(&buf);
if (!should_merge_config) {
break;
}