commit 797ee8b125a070fd6e071a19b49ef89609762c09
parent 918815c6d5966a2236b50f98c2e58d573b8f9884
Author: Kris Maglione <bsdaemon@wmii.de>
Date: Sun, 11 Jun 2006 02:35:44 -0400
A draft of the base of fs2.c. This is mostly an attempt to give shape to my thoughts.
Diffstat:
| cmd/wm/fs2.c | | | 207 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 207 insertions(+), 0 deletions(-)
diff --git a/cmd/wm/fs2.c b/cmd/wm/fs2.c
@@ -0,0 +1,207 @@
+/* So, here's the begining of my idea of fs.c. Before you think it, yes, it's
+ * still braindamaged. I'm certain that more simplicification is possible, but
+ * my brain seems fried every time I try to work it out. Think of this a draft
+ * in preparation for a draft. The basic idea here is to keep everything regarding
+ * to directory structure in one place. Everything should be done in lookup_file,
+ * including finding all files in a dir for a stat and finding files to walk to,
+ * as well as associating a file with a pointer and id.
+ *
+ * I think that I could possibly save quite a few lines of code in lookup_file
+ * with a function to create the FileId struct and push it onto the list. We'll see.
+ * I need to sleep on it some more.
+ *
+ * Comments are, of course, welcome, but if you don't see where I'm going with this,
+ * I don't know of how much help they'll be.
+ *
+ * This, btw, doesn't compile due to a lack of header files for cext_emallocz,
+ * Client, lbar, etc.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+typedef struct Dirtab Dirtab;
+struct Dirtab
+{
+ char *name;
+ unsigned int type;
+ unsigned int perm;
+};
+
+#define nil ((void *)0)
+
+enum { DMDIR, QTDIR, QTFILE };
+enum { FsRoot, FsDClient, FsDClients, FsDLBar,
+ FsDRBar, FsDSClient, FsDTag, FsDTags,
+
+ FsFBar, FsFCNorm, FsFCSel, FsFCctl,
+ FsFCindex, FsFColRules, FsFEvent, FsFFont,
+ FsFKeys, FsFRctl, FsFTagRules, FsFTctl,
+ FsFTindex, FsFprops, RsFFont
+};
+
+Dirtab *dirtab[] =
+{
+[FsRoot] (Dirtab [])
+ {{".", FsRoot, 0500|DMDIR },
+ {"rbar", FsDRBar, 0700|DMDIR },
+ {"lbar", FsDLBar, 0700|DMDIR },
+ {"client", FsDClients, 0500|DMDIR },
+ {"tag", FsDTags, 0500|DMDIR },
+ {"ctl", FsFRctl, 0600 },
+ {"colrules", FsFColRules, 0600 },
+ {"tagrules", FsFTagRules, 0600 },
+ {"font", FsFFont, 0600 },
+ {"keys", FsFKeys, 0600 },
+ {"event", FsFEvent, 0600 },
+ {"normcolors", FsFCNorm, 0600 },
+ {"selcolors", FsFCSel, 0600 },
+ {nil}},
+[FsDRBar] (Dirtab [])
+ {{".", FsDRBar, 0700|DMDIR },
+ {"", FsFBar, 0600 },
+ {nil}},
+[FsDLBar] (Dirtab [])
+ {{".", FsDRBar, 0700|DMDIR },
+ {"", FsFBar, 0600 },
+ {nil}},
+[FsDClients] (Dirtab [])
+ {{".", FsDClients, 0500|DMDIR },
+ {"", FsDClient, 0500|DMDIR },
+ {nil}},
+[FsDClient] (Dirtab [])
+ {{".", FsDClient, 0500|DMDIR },
+ {"ctl", FsFCctl, 0200 },
+ {"props", FsFprops, 0400 },
+ {nil}},
+[FsDSClient] (Dirtab [])
+ {{".", FsDClient, 0500|DMDIR },
+ {"ctl", FsFCctl, 0200 },
+ {"index", FsFCindex, 0400 },
+ {"props", FsFprops, 0400 },
+ {nil}},
+[FsDTags] (Dirtab [])
+ {{".", FsDTags, 0500|DMDIR },
+ {"", FsDTag, 0500|DMDIR },
+ {nil}},
+[FsDTag] (Dirtab [])
+ {{".", FsDTag, 0500|DMDIR },
+ {"ctl", FsFTctl, 0200 },
+ {"index", FsFTindex, 0400 },
+ {nil}}
+};
+
+typedef struct FileId FileId;
+struct FileId {
+ FileId *next;
+ void *ref;
+ unsigned int id;
+ unsigned int index;
+ Dirtab tab;
+};
+
+FileId *free_fileid = nil;
+
+FileId *
+get_file() {
+ FileId *temp;
+ if(!free_fileid) {
+ unsigned int i = 15;
+ temp = cext_emallocz(sizeof(FileId) * i);
+ for(; i; i--) {
+ temp->next = free_fileid;
+ free_fileid = temp++;
+ }
+ }
+ temp = free_fileid;
+ free_fileid = temp->next;
+ return temp;
+}
+
+void
+free_file(FileId *f) {
+ free(f->tab.name);
+ f->next = free_fileid;
+ free_fileid = f;
+}
+
+FileId *
+lookup_file(FileId *parent, char *name)
+{
+ unsigned int i;
+
+ if(!(parent->tab.perm & DMDIR))
+ return nil;
+ Dirtab *dir = dirtab[parent->tab.type];
+ FileId *ret = nil, *temp, **last = &ret;
+
+ for(; dir->name; dir++) {
+ if(!name || !strcmp(name, dir->name)) {
+ temp = get_file();
+ *last = temp;
+ last = &temp->next;
+ temp->id = 0;
+ temp->ref = nil;
+ temp->tab = *dir;
+
+ switch(temp->tab.type) {
+ case FsDLBar:
+ temp->ref = lbar;
+ break;
+ case FsDRBar:
+ temp->ref = rbar;
+ break;
+ }
+ if(name)
+ break;
+ }else
+ if(!*dir->name) { /* strlen(dir->name) == 0 */
+ switch(parent->tab.type) {
+ case FsDClients:
+ Client *c;
+ if(!name || !strncmp(name, "sel", 4)) {
+ if(sel && sel->sel && (c = sel->sel->sel->client)) {
+ temp = get_file();
+ *last = temp;
+ last = &temp->next;
+ temp->ref = c;
+ temp->id = c.id;
+ temp->index = idx_of_client(c);
+ temp->tab = *dirtab[FsDSClient];
+ temp->tab.name = strdup("sel");
+ }
+ if(name)
+ break;
+ }else{
+ if(name) {
+ i = (unsigned int)strtol(name, &name, 10);
+ if(*name)
+ continue;
+ }
+
+ for(c=client; c; c=c->next) {
+ if(!name || c->index == i) {
+ temp = get_file();
+ *last = temp;
+ last = &temp->next;
+ temp->ref = c;
+ temp->id = c.id;
+ temp->tab = *dirtab[FsDClient];
+ asprintf(temp->tab.name, "%d", c->index);
+ }
+ if(name)
+ break;
+ }
+ if(name)
+ goto End_This_Loop; /* label doesn't exist */
+ }
+ case FsDTags:
+ /* and so forth */
+ }
+ }
+ }
+ *last = nil;
+ return ret;
+}