#include <h/fmt_scan.h>
#include <h/tws.h>
#include <h/fmt_compile.h>
+#include <ctype.h>
+#include <sysexits.h>
#ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
static int match(char *, char *);
static char *get_x400_friendly(char *, char *, int);
static int get_x400_comp(char *, char *, char *, int);
+static char *fmt_trim(char *, int);
/*
return 1;
}
+static char *
+fmt_trim(char *str, int width)
+{
+ char *xp;
+ int ljust, i;
+ char buffer[BUFSIZ];
+
+ strncpy(buffer, str, sizeof(buffer));
+ buffer[sizeof(buffer)-1] = '\0';
+ str = buffer;
+ while (isspace(*str)) {
+ str++;
+ }
+ ljust = 0;
+ if ((i = width) < 0) {
+ i = -i;
+ ljust++;
+ }
+
+ if (!ljust && i > 0 && (int)strlen(str) > i) {
+ str[i] = '\0';
+ }
+ xp = str;
+ xp += strlen(str) - 1;
+ while (xp > str && isspace(*xp)) {
+ *xp-- = '\0';
+ }
+ if (ljust && i > 0 && (int)strlen(str) > i) {
+ str += strlen(str) - i;
+ }
+ return str;
+}
+
struct format *
fmt_scan(struct format *format, char *scanl, int width, int *dat)
{
cptrimmed(&cp, str, fmt->f_width, fmt->f_fill, ep - cp);
break;
case FT_STRFW:
- adios(NULL, "internal error (FT_STRFW)");
+ adios(EX_SOFTWARE, NULL, "internal error (FT_STRFW)");
case FT_NUM:
n = snprintf(cp, ep - cp + 1, "%d", value);
case FT_LS_TRIM:
if (str) {
- unsigned char *xp;
-
- strncpy(buffer, str, sizeof(buffer));
- buffer[sizeof(buffer)-1] = '\0';
- str = buffer;
- while (isspace(*str))
- str++;
- ljust = 0;
- if ((i = fmt->f_width) < 0) {
- i = -i;
- ljust++;
- }
-
- if (!ljust && i > 0 && (int)strlen(str) > i)
- str[i] = '\0';
- xp = str;
- xp += strlen(str) - 1;
- while (xp > str && isspace(*xp))
- *xp-- = '\0';
- if (ljust && i > 0 && (int)strlen(str) > i)
- str += strlen(str) - i;
+ str = fmt_trim(str, fmt->f_width);
}
break;
/* UNQUOTEs RFC-2822 quoted-string and quoted-pair */
case FT_LS_UNQUOTE:
if (str) {
- int m;
strncpy(buffer, str, sizeof(buffer));
/* strncpy doesn't NUL-terminate if it fills the buffer */
buffer[sizeof(buffer)-1] = '\0';
- str = buffer;
-
- /* we will parse from buffer to buffer2 */
- n = 0; /* n is the input position in str */
- m = 0; /* m is the ouput position in buffer2 */
-
- while ( str[n] != '\0') {
- switch ( str[n] ) {
- case '\\':
- n++;
- if ( str[n] != '\0')
- buffer2[m++] = str[n++];
- break;
- case '"':
- n++;
- break;
- default:
- buffer2[m++] = str[n++];
- break;
- }
- }
- buffer2[m] = '\0';
+ unquote_string(buffer, buffer2);
str = buffer2;
}
break;
indent = strlen(sp);
wid -= indent;
if (wid <= 0) {
- adios(NULL, "putaddr -- num register (%d) "
+ adios(EX_SOFTWARE, NULL, "putaddr -- num register (%d) "
"must be greater than label "
"width (%d)", value, indent);
}
}
break;
+ case FT_LS_UNMAILTO:
+ if (!str) {
+ break;
+ }
+ str = trim(str);
+ if (*str == '<' && str[strlen(str)-1] == '>') {
+ str++;
+ str[strlen(str)-1] = '\0';
+ }
+ if (strncmp("mailto:", str, 7)==0) {
+ str += 7;
+ }
+ break;
+
}
fmt++;
}
*cp++ = '\n';
*cp = '\0';
return ((struct format *)0);
-
-#ifdef JLR
- /* I'll remove this as soon as I understand what it does. --meillo */
- if (cp[-1] != '\n')
- *cp++ = '\n';
- while (fmt->f_type != FT_DONE)
- fmt++;
-
- finished:;
- *cp = '\0';
- return (fmt->f_value ? ++fmt : (struct format *) 0);
-#endif /* JLR */
-
}