mirror of
https://github.com/labwc/labwc.git
synced 2025-10-29 05:40:24 -04:00
Don't remove newlines when parsing config, menu and XBM
Removing newlines in rc.xml and menu.xml caused parser error with following content: <!-- - - Some comments - --> ...though it is a valid XML. Let's not do that. I moved `grab_file()` to `buf.c` and renamed it to `buf_from_file()`, because it now directly touches `struct buf` and I don't like having a source file only for one function.
This commit is contained in:
parent
eebf5b3e4e
commit
7f67b9c866
8 changed files with 50 additions and 101 deletions
|
|
@ -109,4 +109,11 @@ void buf_reset(struct buf *s);
|
||||||
*/
|
*/
|
||||||
void buf_move(struct buf *dst, struct buf *src);
|
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 */
|
#endif /* LABWC_BUF_H */
|
||||||
|
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
/* 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 */
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <wlr/util/log.h>
|
||||||
#include "common/macros.h"
|
#include "common/macros.h"
|
||||||
#include "common/mem.h"
|
#include "common/mem.h"
|
||||||
#include "common/string-helpers.h"
|
#include "common/string-helpers.h"
|
||||||
|
|
@ -203,3 +204,37 @@ buf_move(struct buf *dst, struct buf *src)
|
||||||
*dst = *src;
|
*dst = *src;
|
||||||
*src = BUF_INIT;
|
*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;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
|
|
@ -6,7 +6,6 @@ labwc_sources += files(
|
||||||
'fd-util.c',
|
'fd-util.c',
|
||||||
'file-helpers.c',
|
'file-helpers.c',
|
||||||
'font.c',
|
'font.c',
|
||||||
'grab-file.c',
|
|
||||||
'graphic-helpers.c',
|
'graphic-helpers.c',
|
||||||
'lab-scene-rect.c',
|
'lab-scene-rect.c',
|
||||||
'match.c',
|
'match.c',
|
||||||
|
|
|
||||||
|
|
@ -1872,25 +1872,13 @@ rcxml_read(const char *filename)
|
||||||
*/
|
*/
|
||||||
for (struct wl_list *elm = iter(&paths); elm != &paths; elm = iter(elm)) {
|
for (struct wl_list *elm = iter(&paths); elm != &paths; elm = iter(elm)) {
|
||||||
struct path *path = wl_container_of(elm, path, link);
|
struct path *path = wl_container_of(elm, path, link);
|
||||||
FILE *stream = fopen(path->string, "r");
|
struct buf b = buf_from_file(path->string);
|
||||||
if (!stream) {
|
if (!b.len) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
wlr_log(WLR_INFO, "read config file %s", path->string);
|
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);
|
rcxml_parse_xml(&b);
|
||||||
buf_reset(&b);
|
buf_reset(&b);
|
||||||
if (!should_merge_config) {
|
if (!should_merge_config) {
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "common/grab-file.h"
|
#include "common/buf.h"
|
||||||
#include "common/mem.h"
|
#include "common/mem.h"
|
||||||
#include "common/string-helpers.h"
|
#include "common/string-helpers.h"
|
||||||
#include "buffer.h"
|
#include "buffer.h"
|
||||||
|
|
@ -273,7 +273,7 @@ img_xbm_load(const char *filename, float *rgba)
|
||||||
uint32_t color = argb32(rgba);
|
uint32_t color = argb32(rgba);
|
||||||
|
|
||||||
/* Read file into memory as it's easier to tokenize that way */
|
/* 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) {
|
if (token_buf.len) {
|
||||||
struct token *tokens = tokenize_xbm(token_buf.data);
|
struct token *tokens = tokenize_xbm(token_buf.data);
|
||||||
pixmap = parse_xbm_tokens(tokens, color);
|
pixmap = parse_xbm_tokens(tokens, color);
|
||||||
|
|
|
||||||
|
|
@ -679,30 +679,6 @@ parse_buf(struct server *server, struct menu *parent, struct buf *buf)
|
||||||
return true;
|
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
|
static void
|
||||||
parse_xml(const char *filename, struct server *server)
|
parse_xml(const char *filename, struct server *server)
|
||||||
{
|
{
|
||||||
|
|
@ -715,13 +691,13 @@ parse_xml(const char *filename, struct server *server)
|
||||||
|
|
||||||
for (struct wl_list *elm = iter(&paths); elm != &paths; elm = iter(elm)) {
|
for (struct wl_list *elm = iter(&paths); elm != &paths; elm = iter(elm)) {
|
||||||
struct path *path = wl_container_of(elm, path, link);
|
struct path *path = wl_container_of(elm, path, link);
|
||||||
FILE *stream = fopen(path->string, "r");
|
struct buf buf = buf_from_file(path->string);
|
||||||
if (!stream) {
|
if (!buf.len) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
wlr_log(WLR_INFO, "read menu file %s", path->string);
|
wlr_log(WLR_INFO, "read menu file %s", path->string);
|
||||||
parse_stream(server, stream);
|
parse_buf(server, /*parent*/ NULL, &buf);
|
||||||
fclose(stream);
|
buf_reset(&buf);
|
||||||
if (!should_merge_config) {
|
if (!should_merge_config) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue