summaryrefslogtreecommitdiffstats
path: root/src/lib/krb5/krb/x-deltat.y
diff options
context:
space:
mode:
authorKen Raeburn <raeburn@mit.edu>1999-12-06 21:49:19 +0000
committerKen Raeburn <raeburn@mit.edu>1999-12-06 21:49:19 +0000
commit4ae5aea3e465fe90e5d6aba4d77f38aee3f8df73 (patch)
tree8451784fafac7777ce72b67a86e089b17331447c /src/lib/krb5/krb/x-deltat.y
parent4e9cd18258e0dff1252886aa1ecead2ffa48e927 (diff)
downloadkrb5-4ae5aea3e465fe90e5d6aba4d77f38aee3f8df73.tar.gz
krb5-4ae5aea3e465fe90e5d6aba4d77f38aee3f8df73.tar.xz
krb5-4ae5aea3e465fe90e5d6aba4d77f38aee3f8df73.zip
merge 1.1 branch, to 12/1/99
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@11948 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib/krb5/krb/x-deltat.y')
-rw-r--r--src/lib/krb5/krb/x-deltat.y168
1 files changed, 168 insertions, 0 deletions
diff --git a/src/lib/krb5/krb/x-deltat.y b/src/lib/krb5/krb/x-deltat.y
new file mode 100644
index 0000000000..be53ce3c64
--- /dev/null
+++ b/src/lib/krb5/krb/x-deltat.y
@@ -0,0 +1,168 @@
+/*
+ * lib/krb5/krb/deltat.y
+ *
+ * Copyright 1999 by the Massachusetts Institute of Technology.
+ * All Rights Reserved.
+ *
+ * Export of this software from the United States of America may
+ * require a specific license from the United States Government.
+ * It is the responsibility of any person or organization contemplating
+ * export to obtain such a license before exporting.
+ *
+ * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
+ * distribute this software and its documentation for any purpose and
+ * without fee is hereby granted, provided that the above copyright
+ * notice appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation, and that
+ * the name of M.I.T. not be used in advertising or publicity pertaining
+ * to distribution of the software without specific, written prior
+ * permission. Furthermore if you modify this software you must label
+ * your software as modified software and not distribute it in such a
+ * fashion that it might be confused with the original M.I.T. software.
+ * M.I.T. makes no representations about the suitability of
+ * this software for any purpose. It is provided "as is" without express
+ * or implied warranty.
+ *
+ *
+ * krb5_string_to_deltat()
+ */
+
+/* For a clean, thread-safe interface, we must use the "pure parser"
+ facility of GNU Bison. Unfortunately, standard YACC has no such
+ option. */
+
+/* N.B.: For simplicity in dealing with the distribution, the
+ Makefile.in listing for deltat.c does *not* normally list this
+ file. If you change this file, tweak the Makefile so it'll rebuild
+ deltat.c, or do it manually. */
+%{
+
+#include <ctype.h>
+#include <errno.h>
+#include "k5-int.h"
+
+struct param {
+ krb5_deltat delta;
+ char *p;
+};
+
+#define YYPARSE_PARAM tmv
+
+#define DO(D,H,M,S) \
+ { \
+ ((struct param *)tmv)->delta = (((D * 24) + H) * 60 + M) * 60 + S; \
+ }
+
+static int mylex (int *, char **);
+#define YYLEX_PARAM (&((struct param *)tmv)->p)
+#undef yylex
+#define yylex(U, P) mylex (&(U)->val, (P))
+
+#undef yyerror
+#define yyerror(MSG)
+
+static int yyparse (void *);
+
+%}
+
+%pure_parser
+
+%union { int val; }
+
+%token <val> NUM LONGNUM
+%token '-' ':' 'd' 'h' 'm' 's' WS
+
+%type <val> num opt_hms opt_ms opt_s wsnum posnum
+
+%start start
+
+%%
+
+start: deltat ;
+posnum: NUM | LONGNUM ;
+num: posnum | '-' posnum { $$ = - $2; } ;
+ws: /* nothing */ | WS ;
+wsnum: ws num { $$ = $2; };
+deltat:
+ wsnum 'd' opt_hms { DO ($1, 0, 0, $3); }
+ | wsnum 'h' opt_ms { DO ( 0, $1, 0, $3); }
+ | wsnum 'm' opt_s { DO ( 0, 0, $1, $3); }
+ | wsnum 's' { DO ( 0, 0, 0, $1); }
+ | wsnum '-' NUM ':' NUM ':' NUM { DO ($1, $3, $5, $7); }
+ | wsnum ':' NUM ':' NUM { DO ( 0, $1, $3, $5); }
+ | wsnum ':' NUM { DO ( 0, $1, $3, 0); }
+ ;
+
+opt_hms:
+ opt_ms
+ | wsnum 'h' opt_ms { $$ = $1 * 3600 + $3; };
+opt_ms:
+ opt_s
+ | wsnum 'm' opt_s { $$ = $1 * 60 + $3; };
+opt_s:
+ ws { $$ = 0; }
+ | wsnum 's' ;
+
+%%
+
+static int
+mylex (int *intp, char **pp)
+{
+ int num, c;
+#define P (*pp)
+ char *orig_p = P;
+
+#ifdef isascii
+ if (!isascii (*P))
+ return 0;
+#endif
+ switch (c = *P++) {
+ case '-':
+ case ':':
+ case 'd':
+ case 'h':
+ case 'm':
+ case 's':
+ return c;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ /* XXX assumes ASCII */
+ num = c - '0';
+ while (isdigit (*P)) {
+ num *= 10;
+ num += *P++ - '0';
+ }
+ *intp = num;
+ return (P - orig_p > 2) ? LONGNUM : NUM;
+ case ' ':
+ case '\t':
+ case '\n':
+ while (isspace (*P))
+ P++;
+ return WS;
+ default:
+ return YYEOF;
+ }
+}
+
+KRB5_DLLIMP krb5_error_code KRB5_CALLCONV
+krb5_string_to_deltat(string, deltatp)
+ char FAR * string;
+ krb5_deltat FAR * deltatp;
+{
+ struct param p;
+ p.delta = 0;
+ p.p = string;
+ if (yyparse (&p))
+ return EINVAL;
+ *deltatp = p.delta;
+ return 0;
+}