Update of /cvsroot/alsa/alsa-driver/utils
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28071
Modified Files:
mod-deps.c
Log Message:
acinclude.m4 output is much better (the condition part),
but still some work is required
Index: mod-deps.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/utils/mod-deps.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- mod-deps.c 3 Mar 2004 20:19:40 -0000 1.1
+++ mod-deps.c 4 Mar 2004 12:34:54 -0000 1.2
@@ -39,7 +39,7 @@
char *name; /* dependency name */
struct dep *dep; /* dependency pointer */
int left; /* left brackets */
- int right; /* right brackets */
+ int right; /* right brackets (after this condition element) */
int type;
struct cond *next;
struct cond *stack_prev;
@@ -64,9 +64,9 @@
// Prototypes
-static int read_file(const char *filename);
-static int read_file_1(const char *filename);
-static int include_file(char *line);
+static int read_file(const char *filename, struct cond **template);
+static int read_file_1(const char *filename, struct cond **template);
+static int include_file(char *line, struct cond **template);
static void free_cond(struct cond *cond);
static struct cond *create_cond(char *line);
static struct dep *alloc_mem_for_dep(void);
@@ -76,6 +76,7 @@
static char *get_word(char *line, char *word);
static struct dep *find_dep(char *parent, char *depname);
static void del_all_from_list(void);
+static int is_always_true(struct dep *dep);
int main(int argc, char *argv[]);
static void usage(char *programname);
@@ -91,6 +92,7 @@
static char *kernel_deps[] = {
"ARCH_SA1100",
"SBUS",
+ "PARISC",
"GAMEPORT",
NULL
};
@@ -98,7 +100,7 @@
/* @ -> add to output for all cards */
/* % -> always true */
static char *no_cards[] = {
- "SOUND",
+ "%SOUND",
"SOUND_PRIME",
"[EMAIL PROTECTED]",
"@SND_TIMER",
@@ -133,34 +135,33 @@
exit(EXIT_FAILURE);
}
-static int read_file(const char *filename)
+static int read_file(const char *filename, struct cond **template)
{
char *fullfile;
int err;
fullfile = malloc(strlen(basedir) + strlen(hiddendir) + 1 + strlen(filename) +
1);
sprintf(fullfile, "%s/%s", basedir, filename);
- if ((err = read_file_1(fullfile)) < 0)
+ if ((err = read_file_1(fullfile, template)) < 0)
return err;
if (!strncmp(filename, "core/", 5))
sprintf(fullfile, "%s/acore/%s", hiddendir, filename + 5);
else
sprintf(fullfile, "%s/%s", hiddendir, filename);
if (access(fullfile, R_OK) == 0) {
- if ((err = read_file_1(fullfile)) < 0)
+ if ((err = read_file_1(fullfile, template)) < 0)
return err;
}
return 0;
}
-static int read_file_1(const char *filename)
+static int read_file_1(const char *filename, struct cond **template)
{
char *buffer, *newbuf;
FILE *file;
int c, prev, idx, size, result = 0;
int state = READ_STATE_NONE;
struct dep *dep;
- struct cond *template = NULL;
file = fopen(filename, "r");
if (file == NULL) {
@@ -204,12 +205,12 @@
if (!strncmp(buffer, "endmenu", 7)) {
struct cond *otemplate;
state = READ_STATE_NONE;
- if (template == NULL) {
+ if (*template == NULL) {
fprintf(stderr, "Menu level error\n");
exit(EXIT_FAILURE);
}
- otemplate = template;
- template = template->stack_prev;
+ otemplate = *template;
+ *template = (*template)->stack_prev;
free_cond(otemplate);
continue;
}
@@ -218,8 +219,8 @@
state = READ_STATE_MENU;
strcpy(buffer, "EMPTY");
ntemplate = create_cond(buffer);
- ntemplate->stack_prev = template;
- template = ntemplate;
+ ntemplate->stack_prev = *template;
+ *template = ntemplate;
continue;
}
if (!strncmp(buffer, "config ", 7)) {
@@ -232,35 +233,38 @@
}
if (!strncmp(buffer, "source ", 7)) {
state = READ_STATE_NONE;
- result = include_file(buffer + 7);
+ result = include_file(buffer + 7, template);
if (result < 0)
goto __end;
}
switch (state) {
case READ_STATE_CONFIG:
if (!strncmp(buffer, "\tdepends on ", 12))
- add_dep(dep, buffer + 12, template);
+ add_dep(dep, buffer + 12, *template);
if (!strncmp(buffer, "\tselect ", 8))
add_select(dep, buffer + 8);
continue;
case READ_STATE_MENU:
if (!strncmp(buffer, "\tdepends on ", 12)) {
struct cond *ntemplate;
+ if (strcmp((*template)->name, "EMPTY")) {
+ fprintf(stderr, "Menu consistency error\n");
+ exit(EXIT_FAILURE);
+ }
ntemplate = create_cond(buffer + 12);
- free(template->name);
- template->name = ntemplate->name;
- template->dep = ntemplate->dep;
- template->left = ntemplate->left;
- template->right = ntemplate->right;
- template->type = ntemplate->type;
+ free((*template)->name);
+ (*template)->name = ntemplate->name;
+ (*template)->dep = ntemplate->dep;
+ (*template)->left = ntemplate->left;
+ (*template)->right = ntemplate->right;
+ (*template)->type = ntemplate->type;
+ (*template)->next = ntemplate->next;
free(ntemplate);
}
continue;
}
}
__end:
- if (template)
- free_cond(template);
free(buffer);
if (file != stdin)
fclose(file);
@@ -268,7 +272,7 @@
}
// include a file
-static int include_file(char *line)
+static int include_file(char *line, struct cond **template)
{
char *word = NULL, *ptr;
int result;
@@ -280,7 +284,7 @@
ptr += 6;
if (!strncmp(ptr, "oss/", 4))
return 0;
- result = read_file(ptr);
+ result = read_file(ptr, template);
free(word);
return result;
}
@@ -385,16 +389,33 @@
static struct cond *duplicate_cond(struct cond *cond)
{
struct cond *result = NULL, *tmp, *prev = NULL;
+ int first = 1;
+ if (cond == NULL)
+ return NULL;
+ if (cond->stack_prev) {
+ result = prev = duplicate_cond(cond->stack_prev);
+ while (prev && prev->next)
+ prev = prev->next;
+ if (prev)
+ prev->type = COND_AND;
+ }
+ if (!strcmp(cond->name, "EMPTY"))
+ return result;
while (cond) {
tmp = calloc(sizeof(struct cond), 1);
if (tmp == NULL)
nomem();
*tmp = *cond;
+ tmp->stack_prev = NULL;
tmp->name = strdup(cond->name);
if (tmp->name == NULL)
nomem();
tmp->next = NULL;
+ if (first) {
+ tmp->left++;
+ first = 0;
+ }
if (result == NULL)
result = tmp;
if (prev)
@@ -402,6 +423,8 @@
prev = tmp;
cond = cond->next;
}
+ if (prev && !first)
+ prev->right++;
return result;
}
@@ -543,6 +566,74 @@
}
}
+// Resolve all dependencies
+static void optimize_dep(struct dep * parent)
+{
+ struct cond *cond, *prev;
+
+ while (parent) {
+ __restart:
+ cond = parent->cond;
+ prev = NULL;
+ while (cond) {
+ int remove_flag = 0;
+ if (cond->left > cond->right) {
+ cond->left -= cond->right;
+ cond->right = 0;
+ } else {
+ cond->right -= cond->left;
+ cond->left = 0;
+ }
+ if (cond->next &&
+ !strcmp(cond->name, cond->next->name) &&
+ ((cond->left == cond->right &&
+ cond->next->left == cond->next->right) ||
+ (cond->left == cond->right + 1 &&
+ cond->next->left + 1 == cond->next->right)) &&
+ cond->left == cond->next->right)
+ goto __remove;
+ if (!is_always_true(cond->dep))
+ goto __next;
+ if (cond->left == cond->right &&
+ (cond->next == NULL || cond->type == COND_AND) &&
+ (prev == NULL || prev->type == COND_AND)) {
+ remove_flag++;
+ } else if (cond->left + 1 == cond->right &&
+ (prev && prev->type == COND_AND)) {
+ if (prev == NULL) {
+ fprintf(stderr, "optimize error (1)\n");
+ exit(EXIT_FAILURE);
+ }
+ prev->right++;
+ remove_flag++;
+ } else if (cond->left == cond->right + 1 &&
+ cond->type == COND_AND) {
+ if (cond->next == NULL) {
+ fprintf(stderr, "optimize error (2)\n");
+ exit(EXIT_FAILURE);
+ }
+ cond->next->left++;
+ remove_flag++;
+ }
+ if (remove_flag) {
+ __remove:
+ if (prev == NULL) {
+ parent->cond = cond->next;
+ } else {
+ prev->next = cond->next;
+ }
+ cond->next = NULL;
+ free_cond(cond);
+ goto __restart;
+ }
+ __next:
+ prev = cond;
+ cond = cond->next;
+ }
+ parent = parent->next;
+ }
+}
+
// Resolve fixed (selected) dependecies
static void resolve_sel(struct dep * parent)
{
@@ -704,6 +795,7 @@
char *text;
struct cond *cond, *cond_prev;
struct sel *sel;
+ int j;
printf("dnl ALSA soundcard configuration\n");
printf("dnl Find out which cards to compile driver for\n");
@@ -734,15 +826,19 @@
if (!is_toplevel(tempdep))
continue;
for (cond = tempdep->cond, cond_prev = NULL; cond; cond = cond->next) {
- if (is_always_true(cond->dep))
- continue;
+ //if (is_always_true(cond->dep))
+ // continue;
if (!put_if)
printf("\tif ");
else {
printf(cond_prev->type == COND_AND ? " &&" : " ||");
printf("\n\t ");
}
+ for (j = 0; j < cond->left; j++)
+ printf("(");
printf("( test \"$CONFIG_%s\" == \"y\" -o \"$CONFIG_%s\" ==
\"m\" )", cond->name, cond->name);
+ for (j = 0; j < cond->right; j++)
+ printf(")");
put_if = 1;
cond_prev = cond;
}
@@ -951,6 +1047,7 @@
int method = METHOD_ACINCLUDE;
int argidx = 1;
char *filename;
+ struct cond *template = NULL;
// Find out which method to use
if (argc < 2)
@@ -991,13 +1088,16 @@
filename = "Kconfig";
// Read the file into memory
- if (read_file(filename) < 0) {
+ if (read_file(filename, &template) < 0) {
fprintf(stderr, "Error reading %s: %s\n",
filename ? filename : "stdin", strerror(errno));
exit(EXIT_FAILURE);
}
+ if (template)
+ free_cond(template);
// Resolve dependencies
resolve_dep(all_deps);
+ optimize_dep(all_deps);
resolve_sel(all_deps);
// Use method
-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog