#include "curses.h"
extern char *strcpy();
#if !defined(SYSV) && !defined(USG) && !defined(strchr)
#define strchr index
#endif
extern char *strchr();
#define NULLPTR ((char *) 0)
static int
lookat(char *string, char *pattern, char *args)
{
int val, pat;
while ((pat = *pattern++) && (val = *string++))
if (pat == '*')
*args++ = val;
else if (val != pat)
return (0);
if (pat == '\0')
return (1);
else
return (0);
}
static int currentparm, otherparm, reversedparms;
static char *newvalue;
static char _newvalue[1024] = "!!! MUST CHANGE BY HAND !!!";
#define BYHANDMSGLEN 27
static void setparms();
static void
setparms()
{
currentparm = 1;
otherparm = 2;
reversedparms = 0;
newvalue = &_newvalue[BYHANDMSGLEN];
return;
}
static int
checkparms(int arg)
{
arg -= '0';
if (arg != 1 && arg != 2)
return (1);
else if (arg != currentparm)
if (reversedparms)
return (1);
else if (!reversedparms && arg == otherparm) {
(void) strcpy(newvalue, "%r");
newvalue += 2;
reversedparms = TRUE;
} else
return (1);
else {
otherparm = currentparm;
currentparm = 3 - currentparm;
}
return (0);
}
char
*infotocap(char *value, int *err)
{
char args[4];
char *savevalue;
*err = 0;
if (strchr(value, '%') == NULLPTR)
return (value);
setparms();
savevalue = value;
while (*value)
if (*value != '%')
*newvalue++ = *value++;
else if (lookat(value, "%p*%d", args)) {
if (checkparms(args[0]))
goto dobyhand;
(void) strcpy(newvalue, "%d");
newvalue += 2;
value += 5;
} else if (lookat(value, "%p*%02d", args)) {
if (checkparms(args[0]))
goto dobyhand;
(void) strcpy(newvalue, "%2");
newvalue += 2;
value += 7;
} else if (lookat(value, "%p*%03d", args)) {
if (checkparms(args[0]))
goto dobyhand;
(void) strcpy(newvalue, "%3");
newvalue += 2;
value += 7;
} else if (lookat(value, "%p*%2.2d", args)) {
if (checkparms(args[0]))
goto dobyhand;
(void) strcpy(newvalue, "%2");
newvalue += 2;
value += 8;
} else if (lookat(value, "%p*%3.3d", args)) {
if (checkparms(args[0]))
goto dobyhand;
(void) strcpy(newvalue, "%3");
newvalue += 2;
value += 8;
} else if (lookat(value, "%p*%c", args)) {
if (checkparms(args[0]))
goto dobyhand;
(void) strcpy(newvalue, "%.");
newvalue += 2;
value += 5;
} else if (lookat(value, "%p*%'*'%+%c", args)) {
if (checkparms(args[0]))
goto dobyhand;
(void) sprintf(newvalue, "%%+%c", args[1]);
newvalue += 3;
value += 11;
} else if (lookat(value, "%i", args)) {
(void) strcpy(newvalue, "%i");
newvalue += 2;
value += 2;
} else if (lookat(value, "%%", args)) {
(void) strcpy(newvalue, "%%");
newvalue += 2;
value += 2;
} else if (lookat(value, "p*%'*'%>%+%p*%'*'%+%;", args)) {
if (args[0] != args[2])
goto dobyhand;
if (checkparms(args[0]))
goto dobyhand;
(void) sprintf(newvalue, "%%>%c%c", args[1], args[3]);
newvalue += 2;
value += 21;
} else
goto dobyhand;
*newvalue = '\0';
return (&_newvalue[BYHANDMSGLEN]);
dobyhand:
(void) strcpy(&_newvalue[BYHANDMSGLEN], savevalue);
*err = 1;
return (_newvalue);
}