+
+
+
+
+/*
+** Get the default folder
+** Return the Inbox profile entry or, as fallback, the compile time default
+** Returns a pointer to the abs folpath
+*/
+char *
+getdeffol(void)
+{
+ char *folder = context_find(inbox);
+
+ if (!folder || !*folder) {
+ folder = defaultfolder; /* the compile time default */
+ }
+ if (*folder == '+') {
+ folder++;
+ }
+ return folder;
+}
+
+
+/*
+** Get the current folder
+** Return the Current-Folder context entry or, as fallback, the default folder
+** Returns a pointer to the abs folpath
+**
+** Equivalent to: expandfol("@")
+*/
+char *
+getcurfol(void)
+{
+ char *folder = context_find(curfolder);
+
+ if (!folder || !*folder) {
+ folder = getdeffol();
+ }
+ return folder;
+}
+
+
+/*
+** Expand folder path
+** Convert rel folpaths (@) into abs folpaths
+** dir paths are simply passed through
+** Returns the abs folpath (without prefix), in static mem
+**
+** TODO: Always copy into the static buffer, or just return the pointer?
+*/
+char *
+expandfol(char *f)
+{
+ static char buf[BUFSIZ];
+
+ if (*f == '@') {
+ /* f = concat(getcurfol(), "/", f+1, NULL); */
+ snprintf(buf, sizeof buf, "%s/%s", getcurfol(), f+1);
+
+ } else if (*f == '+') {
+ strcpy(buf, f+1);
+
+ } else {
+ strcpy(buf, f);
+ }
+ packpath(buf);
+ return buf;
+}
+
+
+/*
+** Expand directory path
+** Convert rel dirpath into abs dirpath
+** The argument is assumed to be a dir path relative to the cwd,
+** except when beginning with '/' (then it will be passed through).
+** Returns the abs dirpath, in static mem
+**
+** TODO: Always copy into the static buffer, or just return the pointer?
+*/
+char *
+expanddir(char *d)
+{
+ static char buf[BUFSIZ];
+ int len;
+
+ if (*d == '/') {
+ strcpy(buf, d);
+ } else {
+ getcwd(buf, sizeof buf);
+ len = strlen(buf);
+ snprintf(buf+len, sizeof buf - len, "/%s", d);
+ }
+ packpath(buf);
+ return buf;
+}
+
+
+/*
+** Anypath to absolute directory path
+** Convert any kind of path into an abs dirpath
+** A path without distinguishing prefix is assumed to be an abs folpath
+** Abs dirpaths are passed unchanged
+** Rel dirpaths ('.') get prefixed with the (abs) cwd
+** Return pointer to static memory
+**
+** To get the dir path of the mail storage root, call: toabsdir("+")
+**
+** TODO: check lengths for copies
+*/
+char *
+toabsdir(char *path)
+{
+ static char buf[BUFSIZ];
+
+ if (*path == '/') {
+ /* nothing to do */
+ strncpy(buf, path, sizeof buf);
+ packpath(buf);
+ return buf;
+
+ } else if (*path == '.') {
+ /* rel dir path */
+ strncpy(buf, expanddir(path), sizeof buf);
+ return buf;
+
+ } else {
+ /* folder path */
+ char *cp=buf, *pp;
+
+ if (!(pp = context_find("path")) || !*pp) {
+ adios(NULL, "Non-empty profile entry `Path' required");
+ }
+ if (*pp != '/') {
+ /* Path is relative to $HOME */
+ snprintf(buf, sizeof buf, "%s/", mypath);
+ cp += strlen(buf);
+ }
+ strcpy(cp, pp);
+ packpath(buf);
+ /* append the mail folder */
+ cp = buf + strlen(buf);
+ *cp++ = '/';
+ strcpy(cp, expandfol(path));
+ return buf;
+ }
+}