=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/jot/jot.c,v retrieving revision 1.14 retrieving revision 1.15 diff -c -r1.14 -r1.15 *** src/usr.bin/jot/jot.c 2003/12/15 23:24:20 1.14 --- src/usr.bin/jot/jot.c 2003/12/29 08:51:19 1.15 *************** *** 1,4 **** ! /* $OpenBSD: jot.c,v 1.14 2003/12/15 23:24:20 jmc Exp $ */ /* $NetBSD: jot.c,v 1.3 1994/12/02 20:29:43 pk Exp $ */ /*- --- 1,4 ---- ! /* $OpenBSD: jot.c,v 1.15 2003/12/29 08:51:19 otto Exp $ */ /* $NetBSD: jot.c,v 1.3 1994/12/02 20:29:43 pk Exp $ */ /*- *************** *** 31,37 **** */ #ifndef lint ! static char copyright[] = "@(#) Copyright (c) 1993\n\ The Regents of the University of California. All rights reserved.\n"; #endif /* not lint */ --- 31,37 ---- */ #ifndef lint ! static const char copyright[] = "@(#) Copyright (c) 1993\n\ The Regents of the University of California. All rights reserved.\n"; #endif /* not lint */ *************** *** 40,46 **** #if 0 static char sccsid[] = "@(#)jot.c 8.1 (Berkeley) 6/6/93"; #endif ! static char rcsid[] = "$OpenBSD: jot.c,v 1.14 2003/12/15 23:24:20 jmc Exp $"; #endif /* not lint */ /* --- 40,46 ---- #if 0 static char sccsid[] = "@(#)jot.c 8.1 (Berkeley) 6/6/93"; #endif ! static const char rcsid[] = "$OpenBSD: jot.c,v 1.15 2003/12/29 08:51:19 otto Exp $"; #endif /* not lint */ /* *************** *** 50,55 **** --- 50,56 ---- */ #include + #include #include #include #include *************** *** 64,114 **** #define is_default(s) (strcmp((s), "-") == 0) ! double begin; ! double ender; ! double s; ! long reps; ! int randomize; ! int infinity; ! int boring; ! int prec; ! int dox; ! int chardata; ! int nofinalnl; ! char sepstring[BUFSIZ] = "\n"; ! char format[BUFSIZ]; ! void getargs(int, char *[]); ! void getformat(void); ! int getprec(char *); ! void putdata(double, long); static void usage(void); int main(int argc, char *argv[]) { ! double xd, yd; ! long id; ! double *x = &xd; ! double *y = &yd; ! long *i = &id; unsigned int mask = 0; ! int n = 0; ! int ch; while ((ch = getopt(argc, argv, "rb:w:cs:np:")) != -1) ! switch((char)ch) { case 'r': ! randomize = 1; break; case 'c': ! chardata = 1; break; case 'n': ! nofinalnl = 1; break; case 'b': ! boring = 1; if (strlcpy(format, optarg, sizeof(format)) >= sizeof(format)) errx(1, "-b word too long"); --- 65,112 ---- #define is_default(s) (strcmp((s), "-") == 0) ! static double begin; ! static double ender; ! static double s; ! static long reps; ! static bool randomize; ! static bool infinity; ! static bool boring; ! static int prec = -1; ! static bool dox; ! static bool chardata; ! static bool finalnl = true; ! static char sepstring[BUFSIZ] = "\n"; ! static char format[BUFSIZ]; ! static void getformat(void); ! static int getprec(char *); ! static void putdata(double, bool); static void usage(void); int main(int argc, char *argv[]) { ! double x; ! double y; ! long i; unsigned int mask = 0; ! int n = 0; ! int ch; while ((ch = getopt(argc, argv, "rb:w:cs:np:")) != -1) ! switch (ch) { case 'r': ! randomize = true; break; case 'c': ! chardata = true; break; case 'n': ! finalnl = false; break; case 'b': ! boring = true; if (strlcpy(format, optarg, sizeof(format)) >= sizeof(format)) errx(1, "-b word too long"); *************** *** 125,131 **** break; case 'p': prec = atoi(optarg); ! if (prec <= 0) errx(1, "bad precision value"); break; default: --- 123,129 ---- break; case 'p': prec = atoi(optarg); ! if (prec < 0) errx(1, "bad precision value"); break; default: *************** *** 146,152 **** if (!sscanf(argv[2], "%lf", &ender)) ender = argv[2][strlen(argv[2])-1]; mask |= 02; ! if (!prec) n = getprec(argv[2]); } case 2: --- 144,150 ---- if (!sscanf(argv[2], "%lf", &ender)) ender = argv[2][strlen(argv[2])-1]; mask |= 02; ! if (prec == -1) n = getprec(argv[2]); } case 2: *************** *** 154,160 **** if (!sscanf(argv[1], "%lf", &begin)) begin = argv[1][strlen(argv[1])-1]; mask |= 04; ! if (!prec) prec = getprec(argv[1]); if (n > prec) /* maximum precision */ prec = n; --- 152,158 ---- if (!sscanf(argv[1], "%lf", &begin)) begin = argv[1][strlen(argv[1])-1]; mask |= 04; ! if (prec == -1) prec = getprec(argv[1]); if (n > prec) /* maximum precision */ prec = n; *************** *** 164,176 **** if (!sscanf(argv[0], "%ld", &reps)) errx(1, "Bad reps value: %s", argv[0]); mask |= 010; } break; case 0: usage(); break; default: ! errx(1, "Too many arguments. What do you mean by %s?", argv[4]); } getformat(); while (mask) /* 4 bit mask has 1's where last 4 args were given */ --- 162,177 ---- if (!sscanf(argv[0], "%ld", &reps)) errx(1, "Bad reps value: %s", argv[0]); mask |= 010; + if (prec == -1) + prec = 0; } break; case 0: usage(); break; default: ! errx(1, "Too many arguments. What do you mean by %s?", ! argv[4]); } getformat(); while (mask) /* 4 bit mask has 1's where last 4 args were given */ *************** *** 271,305 **** errx(1, "bad mask"); } if (reps == 0) ! infinity = 1; if (randomize) { ! *x = (ender - begin) * (ender > begin ? 1 : -1); ! for (*i = 1; *i <= reps || infinity; (*i)++) { ! *y = (double) arc4random() / UINT_MAX; ! putdata(*y * *x + begin, reps - *i); } } else ! for (*i = 1, *x = begin; *i <= reps || infinity; (*i)++, *x += s) ! putdata(*x, reps - *i); ! if (!nofinalnl) putchar('\n'); exit(0); } ! void ! putdata(double x, long notlast) { - long d = x; - long *dp = &d; - if (boring) /* repeated word */ printf("%s", format); else if (dox) /* scalar */ ! printf(format, *dp); else /* real */ printf(format, x); ! if (notlast != 0) fputs(sepstring, stdout); } --- 272,303 ---- errx(1, "bad mask"); } if (reps == 0) ! infinity = true; if (randomize) { ! x = (ender - begin) * (ender > begin ? 1 : -1); ! for (i = 1; i <= reps || infinity; i++) { ! y = (double) arc4random() / UINT_MAX; ! putdata(y * x + begin, reps - i == 0 && !infinity); } } else ! for (i = 1, x = begin; i <= reps || infinity; i++, x += s) ! putdata(x, reps - i == 0 && !infinity); ! if (finalnl) putchar('\n'); exit(0); } ! static void ! putdata(double x, bool last) { if (boring) /* repeated word */ printf("%s", format); else if (dox) /* scalar */ ! printf(format, (long)x); else /* real */ printf(format, x); ! if (!last) fputs(sepstring, stdout); } *************** *** 312,335 **** exit(1); } ! int getprec(char *s) { char *p; char *q; ! for (p = s; *p; p++) if (*p == '.') break; ! if (!*p) return (0); ! for (q = ++p; *p; p++) if (!isdigit(*p)) break; return (p - q); } ! void getformat(void) { char *p; --- 310,333 ---- exit(1); } ! static int getprec(char *s) { char *p; char *q; ! for (p = s; *p != '\0'; p++) if (*p == '.') break; ! if (*p == '\0') return (0); ! for (q = ++p; *p != '\0'; p++) if (!isdigit(*p)) break; return (p - q); } ! static void getformat(void) { char *p; *************** *** 337,362 **** if (boring) /* no need to bother */ return; ! for (p = format; *p; p++) /* look for '%' */ if (*p == '%') { if (*(p+1) != '%') break; p++; /* leave %% alone */ } sz = sizeof(format) - strlen(format) - 1; ! if (!*p && !chardata) { if (snprintf(p, sz, "%%.%df", prec) >= (int)sz) errx(1, "-w word too long"); ! } else if (!*p && chardata) { if (strlcpy(p, "%c", sz) >= sz) errx(1, "-w word too long"); ! dox = 1; ! } else if (!*(p+1)) { if (sz <= 0) errx(1, "-w word too long"); ! strlcat(format, "%", sizeof format); /* cannot end in single '%' */ } else { ! for (; *p && !isalpha(*p); p++) /* Certain nonalphanumerics we can't allow */ if (*p == '$' || *p == '*') break; --- 335,361 ---- if (boring) /* no need to bother */ return; ! for (p = format; *p != '\0'; p++) /* look for '%' */ if (*p == '%') { if (*(p+1) != '%') break; p++; /* leave %% alone */ } sz = sizeof(format) - strlen(format) - 1; ! if (*p == '\0' && !chardata) { if (snprintf(p, sz, "%%.%df", prec) >= (int)sz) errx(1, "-w word too long"); ! } else if (*p == '\0' && chardata) { if (strlcpy(p, "%c", sz) >= sz) errx(1, "-w word too long"); ! dox = true; ! } else if (*(p+1) == '\0') { if (sz <= 0) errx(1, "-w word too long"); ! /* cannot end in single '%' */ ! strlcat(format, "%", sizeof format); } else { ! for (; *p != '\0' && !isalpha(*p); p++) /* Certain nonalphanumerics we can't allow */ if (*p == '$' || *p == '*') break; *************** *** 373,391 **** case 'd': case 'o': case 'x': case 'u': case 'D': case 'O': case 'X': case 'U': case 'c': case 'i': ! dox = 1; break; default: errx(1, "unknown or invalid format `%s'", format); } /* Need to check for trailing stuff to print */ ! for (; *p; p++) /* look for '%' */ if (*p == '%') { if (*(p+1) != '%') break; p++; /* leave %% alone */ } ! if (*p) errx(1, "unknown or invalid format `%s'", format); } } --- 372,390 ---- case 'd': case 'o': case 'x': case 'u': case 'D': case 'O': case 'X': case 'U': case 'c': case 'i': ! dox = true; break; default: errx(1, "unknown or invalid format `%s'", format); } /* Need to check for trailing stuff to print */ ! for (; *p != '\0'; p++) /* look for '%' */ if (*p == '%') { if (*(p+1) != '%') break; p++; /* leave %% alone */ } ! if (*p != '\0') errx(1, "unknown or invalid format `%s'", format); } }