Skip to content

Commit

Permalink
Move general functions scalloc, sstrdup out of i3status.c
Browse files Browse the repository at this point in the history
  • Loading branch information
orestisfl committed May 1, 2020
1 parent 675c423 commit d8e8eb2
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 65 deletions.
55 changes: 0 additions & 55 deletions i3status.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
#include <getopt.h>
#include <signal.h>
#include <confuse.h>
#include <glob.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
Expand All @@ -35,12 +34,6 @@

#include "i3status.h"

#define exit_if_null(pointer, ...) \
{ \
if (pointer == NULL) \
die(__VA_ARGS__); \
}

#define CFG_CUSTOM_ALIGN_OPT \
CFG_STR_CB("align", NULL, CFGF_NONE, parse_align)

Expand Down Expand Up @@ -106,21 +99,6 @@ static bool path_exists(const char *path) {
return (stat(path, &buf) == 0);
}

static void *scalloc(size_t size) {
void *result = calloc(size, 1);
exit_if_null(result, "Error: out of memory (calloc(%zu))\n", size);
return result;
}

char *sstrdup(const char *str) {
if (str == NULL) {
return NULL;
}
char *result = strdup(str);
exit_if_null(result, "Error: out of memory (strdup())\n");
return result;
}

/*
* Parses the "align" module option (to validate input).
*/
Expand Down Expand Up @@ -205,39 +183,6 @@ static int valid_color(const char *value) {
return 1;
}

/*
* This function resolves ~ in pathnames.
* It may resolve wildcards in the first part of the path, but if no match
* or multiple matches are found, it just returns a copy of path as given.
*
*/
static char *resolve_tilde(const char *path) {
static glob_t globbuf;
char *head, *tail, *result = NULL;

tail = strchr(path, '/');
head = strndup(path, tail ? (size_t)(tail - path) : strlen(path));

int res = glob(head, GLOB_TILDE, NULL, &globbuf);
free(head);
/* no match, or many wildcard matches are bad */
if (res == GLOB_NOMATCH || globbuf.gl_pathc != 1)
result = sstrdup(path);
else if (res != 0) {
die("glob() failed");
} else {
head = globbuf.gl_pathv[0];
result = scalloc(strlen(head) + (tail ? strlen(tail) : 0) + 1);
strcpy(result, head);
if (tail) {
strcat(result, tail);
}
}
globfree(&globbuf);

return result;
}

static char *get_config_path(void) {
char *xdg_config_home, *xdg_config_dirs, *config_path;

Expand Down
5 changes: 3 additions & 2 deletions include/i3status.h
Original file line number Diff line number Diff line change
Expand Up @@ -183,13 +183,14 @@ struct min_width {
const char *str;
};

char *sstrdup(const char *str);

/* src/general.c */
char *skip_character(char *input, char character, int amount);

void die(const char *fmt, ...) __attribute__((format(printf, 1, 2), noreturn));
bool slurp(const char *filename, char *destination, int size);
char *resolve_tilde(const char *path);
void *scalloc(size_t size);
char *sstrdup(const char *str);

/* src/output.c */
void print_separator(const char *separator);
Expand Down
56 changes: 56 additions & 0 deletions src/general.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,19 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <glob.h>
#include <sys/fcntl.h>
#include <sys/stat.h>

#include "i3status.h"

#define exit_if_null(pointer, ...) \
{ \
if (pointer == NULL) \
die(__VA_ARGS__); \
}


/*
* Reads size bytes into the destination buffer from filename.
*
Expand All @@ -33,6 +41,54 @@ bool slurp(const char *filename, char *destination, int size) {
return n != -1;
}

/*
* This function resolves ~ in pathnames.
* It may resolve wildcards in the first part of the path, but if no match
* or multiple matches are found, it just returns a copy of path as given.
*
*/
char *resolve_tilde(const char *path) {
static glob_t globbuf;
char *head, *tail, *result = NULL;

tail = strchr(path, '/');
head = strndup(path, tail ? (size_t)(tail - path) : strlen(path));

int res = glob(head, GLOB_TILDE, NULL, &globbuf);
free(head);
/* no match, or many wildcard matches are bad */
if (res == GLOB_NOMATCH || globbuf.gl_pathc != 1)
result = sstrdup(path);
else if (res != 0) {
die("glob() failed");
} else {
head = globbuf.gl_pathv[0];
result = scalloc(strlen(head) + (tail ? strlen(tail) : 0) + 1);
strcpy(result, head);
if (tail) {
strcat(result, tail);
}
}
globfree(&globbuf);

return result;
}

char *sstrdup(const char *str) {
if (str == NULL) {
return NULL;
}
char *result = strdup(str);
exit_if_null(result, "Error: out of memory (strdup())\n");
return result;
}

void *scalloc(size_t size) {
void *result = calloc(size, 1);
exit_if_null(result, "Error: out of memory (calloc(%zu))\n", size);
return result;
}

/*
* Skip the given character for exactly 'amount' times, returns
* a pointer to the first non-'character' character in 'input'.
Expand Down
8 changes: 0 additions & 8 deletions src/print_file_contents.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,6 @@

#define STRING_SIZE 10

static void *scalloc(size_t size) {
void *result = calloc(size, 1);
if (result == NULL) {
die("Error: out of memory (calloc(%zu))\n", size);
}
return result;
}

void print_file_contents(yajl_gen json_gen, char *buffer, const char *title, const char *path, const char *format, const char *format_bad, const int max_chars) {
const char *walk = format;
char *outwalk = buffer;
Expand Down

0 comments on commit d8e8eb2

Please sign in to comment.