#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern char *rindex (const char *, int);
#include "defs.h"
#include "manfile.h"
#include "man-config.h"
#include "to_cat.h"
#include "util.h"
static char *
mantail_of(char *name) {
char *s0, *s1, *s;
s0 = s1 = 0;
for (s = name; *s; s++) {
if (*s == '/') {
s0 = s1;
s1 = s;
}
}
return s0;
}
const char *
mandir_of(const char *name) {
char *p, *q;
q = my_strdup(name);
p = mantail_of(q);
if (p) {
*p = 0;
return q;
}
free(q);
return NULL;
}
const char *
convert_to_cat (const char *name0, const char *ext, int standards) {
char *name, *freename, *cat_name = 0;
char *t0, *t2, *t3, *t4;
struct dirs *dlp;
int len;
freename = name = my_strdup (name0);
t0 = rindex (name, '.');
if (t0 && get_expander(t0))
*t0 = 0;
t2 = mantail_of (name);
if (t2 == NULL)
return 0;
*t2 = 0;
if (strncmp(t2+1, "man", 3) != 0)
return 0;
t2[1] = 'c';
t2[3] = 't';
len = (ext ? strlen(ext) : 0);
for (dlp = cfdirlist.nxt; dlp; dlp = dlp->nxt) {
if (!strcmp (name, dlp->mandir)) {
if (!dlp->catdir[0])
break;
*t2 = '/';
len += strlen (dlp->catdir) + strlen (t2) + 1;
cat_name = (char *) my_malloc (len);
strcpy (cat_name, dlp->catdir);
strcat (cat_name, t2);
goto gotit;
}
}
if (standards & FHS) {
if (*name != '/')
return 0;
t3 = t2;
if ((t4 = rindex(name,'/')) != NULL && strcmp(t4, "/man")) {
*t3 = '/';
t3 = t4;
*t3 = 0;
}
if(t3 - name >= 4 && !strcmp(t3 - 4, "/man")) {
if(!strncmp(name, "/usr/", 5))
name += 4;
t4 = t3 - 4;
*t4 = 0;
if(t4 - name >= 6 && !strcmp(t4 - 6, "/share"))
t4[-6] = 0;
*t3 = '/';
len += strlen("/var/cache/man") + strlen(name) + strlen(t3) + 1;
cat_name = (char *) my_malloc (len);
strcpy (cat_name, "/var/cache/man");
strcat (cat_name, name);
strcat (cat_name, t3);
goto gotit;
}
return 0;
}
if ((standards & FSSTND) && !strncmp(name, "/usr/", 5)) {
t3 = t2;
while ((t4 = rindex(name, '/')) != NULL && strcmp(t4, "/man")) {
*t3 = '/';
t3 = t4;
*t3 = 0;
}
*t3 = '/';
if (t4) {
*t4 = 0;
len += strlen("/var/catman") + strlen (name+4) + strlen (t3) + 1;
cat_name = (char *) my_malloc (len);
strcpy (cat_name, "/var/catman");
strcat (cat_name, name+4);
strcat (cat_name, t3);
goto gotit;
}
} else
*t2 = '/';
if (ext) {
len += strlen(name) + 1;
cat_name = (char *) my_malloc (len);
strcpy (cat_name, name);
} else
cat_name = name;
gotit:
if ((standards & DO_HP) && get_expander(cat_name)) {
} else if (ext)
strcat (cat_name, ext);
if (name != cat_name)
free (freename);
return cat_name;
}