1
1

Omit "dev" field in export when same as parent dir + "excluded" fix

Этот коммит содержится в:
Yorhel 2012-08-29 11:43:10 +02:00
родитель c4616ff186
Коммит 968471f602
2 изменённых файлов: 43 добавлений и 9 удалений

Просмотреть файл

@ -31,7 +31,12 @@
static FILE *stream;
static int level; /* Current level of nesting */
/* Stack of device IDs, also used to determine the */
struct stack {
uint64_t *list;
int size, top;
} stack;
static void output_string(const char *str) {
@ -81,9 +86,10 @@ static void output_info(struct dir *d) {
fputs(",\"dsize\":", stream);
output_int((uint64_t)d->size);
}
/* TODO: No need to include a dev is it's the same as the parent dir. */
fputs(",\"dev\":", stream);
output_int(d->dev);
if(d->dev != nstack_top(&stack, 0)) {
fputs(",\"dev\":", stream);
output_int(d->dev);
}
fputs(",\"ino\":", stream);
output_int(d->ino);
if(d->flags & FF_HLNKC) /* TODO: Including the actual number of links would be nicer. */
@ -93,9 +99,9 @@ static void output_info(struct dir *d) {
if(!(d->flags & (FF_DIR|FF_FILE)))
fputs(",\"notreg\":true", stream);
if(d->flags & FF_EXL)
fputs(",\"excluded\":\"pattern", stream);
fputs(",\"excluded\":\"pattern\"", stream);
else if(d->flags & FF_OTHFS)
fputs(",\"excluded\":\"othfs", stream);
fputs(",\"excluded\":\"othfs\"", stream);
fputc('}', stream);
}
@ -107,7 +113,8 @@ static void output_info(struct dir *d) {
* called with a stream that's in an error state. */
static int item(struct dir *item) {
if(!item) {
if(!--level) { /* closing of the root item */
nstack_pop(&stack);
if(!stack.top) { /* closing of the root item */
fputs("]]", stream);
return fclose(stream);
} else /* closing of a regular directory item */
@ -119,7 +126,7 @@ static int item(struct dir *item) {
/* File header.
* TODO: Add scan options? */
if(item->flags & FF_DIR && !level++)
if(!stack.top)
fputs("[1,0,{\"progname\":\""PACKAGE"\",\"progver\":\""PACKAGE_VERSION"\"}", stream);
fputs(",\n", stream);
@ -127,11 +134,16 @@ static int item(struct dir *item) {
fputc('[', stream);
output_info(item);
if(item->flags & FF_DIR)
nstack_push(&stack, item->dev);
return ferror(stream);
}
static int final(int fail) {
nstack_free(&stack);
return fail ? 1 : 1; /* Silences -Wunused-parameter */
}
@ -142,7 +154,8 @@ int dir_export_init(const char *fn) {
else if((stream = fopen(fn, "w")) == NULL)
return 1;
level = 0;
nstack_init(&stack);
pstate = ST_CALC;
dir_output.item = item;
dir_output.final = final;

Просмотреть файл

@ -84,5 +84,26 @@ struct dir *getroot(struct dir *);
/* Adds a value to the size, asize and items fields of *d and its parents */
void addparentstats(struct dir *, int64_t, int64_t, int);
/* A simple stack implemented in macros */
#define nstack_init(_s) do {\
(_s)->size = 10;\
(_s)->top = 0;\
(_s)->list = malloc(10*sizeof(*(_s)->list));\
} while(0)
#define nstack_push(_s, _v) do {\
if((_s)->size <= (_s)->top) {\
(_s)->size *= 2;\
(_s)->list = realloc((_s)->list, (_s)->size*sizeof(*(_s)->list));\
}\
(_s)->list[(_s)->top++] = _v;\
} while(0)
#define nstack_pop(_s) (_s)->top--
#define nstack_top(_s, _d) ((_s)->top > 0 ? (_s)->list[(_s)->top-1] : (_d))
#define nstack_free(_s) free((_s)->list)
#endif