diff options
| author | Bert <ber.t@gmx.com> | 2011-02-02 09:01:05 +0100 | 
|---|---|---|
| committer | Bert <ber.t@gmx.com> | 2011-02-02 09:01:05 +0100 | 
| commit | 2afb989cc415419229d6f6ded02d59ee109ac796 (patch) | |
| tree | 5f3d696667008ea4ef3f9dd7d2ea6e5f92cb250b | |
| parent | e510eda5f1ec77353d2f8b62e35a69df0bdec99e (diff) | |
Skeleton for -r
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | main.c | 57 | ||||
| -rw-r--r-- | options.c | 1 | ||||
| -rw-r--r-- | options.h | 1 | 
4 files changed, 54 insertions, 7 deletions
| @@ -1,6 +1,6 @@  all: sxiv -VERSION=0.4 +VERSION=git-20110202  CC?=gcc  PREFIX?=/usr/local @@ -19,6 +19,7 @@  #include <stdlib.h>  #include <stdio.h>  #include <sys/select.h> +#include <sys/stat.h>  #include <X11/Xlib.h>  #include <X11/Xutil.h> @@ -28,6 +29,9 @@  #include "image.h"  #include "window.h" +void* s_malloc(size_t); +void* s_realloc(void*, size_t); +  void on_keypress(XEvent*);  void on_buttonpress(XEvent*);  void on_buttonrelease(XEvent*); @@ -35,6 +39,7 @@ void on_motionnotify(XEvent*);  void on_configurenotify(XEvent*);  void update_title(); +void read_dir(const char*);  static void (*handler[LASTEvent])(XEvent*) = {  	[KeyPress] = on_keypress, @@ -47,6 +52,8 @@ static void (*handler[LASTEvent])(XEvent*) = {  img_t img;  win_t win; +#define DNAME_CNT 512 +#define FNAME_CNT 4096  const char **filenames;  int filecnt, fileidx; @@ -87,6 +94,8 @@ void run() {  int main(int argc, char **argv) {  	int i; +	const char *filename; +	struct stat fstats;  	parse_options(argc, argv); @@ -95,17 +104,36 @@ int main(int argc, char **argv) {  		exit(1);  	} -	if (!(filenames = (const char**) malloc(options->filecnt * sizeof(char*)))) -		DIE("could not allocate memory"); -	 +	if (options->recursive) +		filecnt = FNAME_CNT; +	else +		filecnt = options->filecnt; + +	filenames = (const char**) s_malloc(filecnt * sizeof(const char*));  	fileidx = 0; -	filecnt = 0;  	for (i = 0; i < options->filecnt; ++i) { -		if (img_check(options->filenames[i])) -			filenames[filecnt++] = options->filenames[i]; +		filename = options->filenames[i]; +		if (stat(filename, &fstats)) { +			WARN("could not stat file: %s", filename); +		} else if (S_ISDIR(fstats.st_mode)) { +			if (options->recursive) +				read_dir(filename); +			else +				WARN("ignoring directory: %s", filename); +		} else if (img_check(filename)) { +			if (fileidx == filecnt) { +				filecnt *= 2; +				filenames = (const char**) s_realloc(filenames, +				                                     filecnt * sizeof(const char*)); +			} +			filenames[fileidx++] = filename; +		}  	} +	filecnt = fileidx; +	fileidx = 0; +  	if (!filecnt) {  		fprintf(stderr, "sxiv: no valid image filename given, aborting\n");  		exit(1); @@ -355,3 +383,20 @@ void update_title() {  	win_set_title(&win, win_title);  } + +void read_dir(const char *dir) { +} + +void* s_malloc(size_t size) { +	void *ptr; +	 +	if (!(ptr = malloc(size))) +		DIE("could not allocate memory"); +	return ptr; +} + +void* s_realloc(void *ptr, size_t size) { +	if (!(ptr = realloc(ptr, size))) +		DIE("could not allocate memory"); +	return ptr; +} @@ -50,6 +50,7 @@ void parse_options(int argc, char **argv) {  	_options.geometry = NULL;  	_options.quiet = 0; +	_options.recursive = 0;  	while ((opt = getopt(argc, argv, "dFfg:hpqsvZz:")) != -1) {  		switch (opt) { @@ -34,6 +34,7 @@ typedef struct options_s {  	char *geometry;  	unsigned char quiet; +	unsigned char recursive;  } options_t;  extern const options_t *options; | 
