/*
 * Copyright (c) 1997-8,2020 Andrew G. Morgan <morgan@kernel.org>
 *
 * This is a file to make the capability <-> string mappings for
 * libcap.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
 * #include 'sed' generated array
 */

struct {
    const char *name;
    int index;
} const list[] = {
#include "cap_names.list.h"
    {NULL, -1}
};

/*
 * recalloc uses realloc to grow some memory but it resets the
 * indicated extended empty space.
 */
static void *recalloc(void *p, int was, int is) {
    void *n = realloc(p, is);
    if (!n) {
	fputs("out of memory", stderr);
	exit(1);
    }
    memset(n+was, 0, is-was);
    return n;
}

int main(void)
{
    int i, maxcaps=0, maxlength=0;
    const char **pointers = NULL;
    int pointers_avail = 0;

    for ( i=0; list[i].index >= 0 && list[i].name; ++i ) {
	if (maxcaps <= list[i].index) {
	    maxcaps = list[i].index + 1;
	}
        if (list[i].index >= pointers_avail) {
	    int was = pointers_avail * sizeof(char *);
	    pointers_avail = 2 * list[i].index + 1;
	    pointers = recalloc(pointers, was, pointers_avail * sizeof(char *));
        }
	pointers[list[i].index] = list[i].name;
	int n = strlen(list[i].name);
	if (n > maxlength) {
	    maxlength = n;
	}
    }

    printf("/*\n"
	   " * DO NOT EDIT: this file is generated automatically from\n"
	   " *\n"
	   " *     <uapi/linux/capability.h>\n"
	   " */\n\n"
	   "#define __CAP_BITS       %d\n"
	   "#define __CAP_NAME_SIZE  %d\n"
	   "\n"
	   "#ifdef LIBCAP_PLEASE_INCLUDE_ARRAY\n"
	   "#define LIBCAP_CAP_NAMES { \\\n", maxcaps, maxlength+1);

    for (i=0; i<maxcaps; ++i) {
	if (pointers[i]) {
	    printf("      /* %d */\t\"%s\", \\\n", i, pointers[i]);
	} else {
	    printf("      /* %d */\tNULL,\t\t/* - presently unused */ \\\n", i);
	}
    }

    printf("  }\n"
	   "#endif /* LIBCAP_PLEASE_INCLUDE_ARRAY */\n"
	   "\n"
	   "/* END OF FILE */\n");

    free(pointers);
    exit(0);
}
