1/* Generated By:JavaCC: Do not edit this line. DateTimeParser.java */
2/*
3 *  Copyright 2004 the mime4j project
4 *
5 *  Licensed under the Apache License, Version 2.0 (the "License");
6 *  you may not use this file except in compliance with the License.
7 *  You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 */
17package org.apache.james.mime4j.field.datetime.parser;
18
19import org.apache.james.mime4j.field.datetime.DateTime;
20
21import java.util.Vector;
22
23public class DateTimeParser implements DateTimeParserConstants {
24    private static final boolean ignoreMilitaryZoneOffset = true;
25
26    public static void main(String args[]) throws ParseException {
27                while (true) {
28                    try {
29                                DateTimeParser parser = new DateTimeParser(System.in);
30                        parser.parseLine();
31                    } catch (Exception x) {
32                                x.printStackTrace();
33                                return;
34                    }
35                }
36    }
37
38    private static int parseDigits(Token token) {
39        return Integer.parseInt(token.image, 10);
40    }
41
42    private static int getMilitaryZoneOffset(char c) {
43        if (ignoreMilitaryZoneOffset)
44            return 0;
45
46        c = Character.toUpperCase(c);
47
48        switch (c) {
49            case 'A': return 1;
50            case 'B': return 2;
51            case 'C': return 3;
52            case 'D': return 4;
53            case 'E': return 5;
54            case 'F': return 6;
55            case 'G': return 7;
56            case 'H': return 8;
57            case 'I': return 9;
58            case 'K': return 10;
59            case 'L': return 11;
60            case 'M': return 12;
61
62            case 'N': return -1;
63            case 'O': return -2;
64            case 'P': return -3;
65            case 'Q': return -4;
66            case 'R': return -5;
67            case 'S': return -6;
68            case 'T': return -7;
69            case 'U': return -8;
70            case 'V': return -9;
71            case 'W': return -10;
72            case 'X': return -11;
73            case 'Y': return -12;
74
75            case 'Z': return 0;
76            default: return 0;
77        }
78    }
79
80    private static class Time {
81        private int hour;
82        private int minute;
83        private int second;
84        private int zone;
85
86        public Time(int hour, int minute, int second, int zone) {
87            this.hour = hour;
88            this.minute = minute;
89            this.second = second;
90            this.zone = zone;
91        }
92
93        public int getHour() { return hour; }
94        public int getMinute() { return minute; }
95        public int getSecond() { return second; }
96        public int getZone() { return zone; }
97    }
98
99    private static class Date {
100        private String year;
101        private int month;
102        private int day;
103
104        public Date(String year, int month, int day) {
105            this.year = year;
106            this.month = month;
107            this.day = day;
108        }
109
110        public String getYear() { return year; }
111        public int getMonth() { return month; }
112        public int getDay() { return day; }
113    }
114
115  final public DateTime parseLine() throws ParseException {
116 DateTime dt;
117    dt = date_time();
118    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
119    case 1:
120      jj_consume_token(1);
121      break;
122    default:
123      jj_la1[0] = jj_gen;
124      ;
125    }
126    jj_consume_token(2);
127          {if (true) return dt;}
128    throw new Error("Missing return statement in function");
129  }
130
131  final public DateTime parseAll() throws ParseException {
132 DateTime dt;
133    dt = date_time();
134    jj_consume_token(0);
135          {if (true) return dt;}
136    throw new Error("Missing return statement in function");
137  }
138
139  final public DateTime date_time() throws ParseException {
140 Date d; Time t;
141    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
142    case 4:
143    case 5:
144    case 6:
145    case 7:
146    case 8:
147    case 9:
148    case 10:
149      day_of_week();
150      jj_consume_token(3);
151      break;
152    default:
153      jj_la1[1] = jj_gen;
154      ;
155    }
156    d = date();
157    t = time();
158            {if (true) return new DateTime(
159                    d.getYear(),
160                    d.getMonth(),
161                    d.getDay(),
162                    t.getHour(),
163                    t.getMinute(),
164                    t.getSecond(),
165                    t.getZone());}    // time zone offset
166
167    throw new Error("Missing return statement in function");
168  }
169
170  final public String day_of_week() throws ParseException {
171    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
172    case 4:
173      jj_consume_token(4);
174      break;
175    case 5:
176      jj_consume_token(5);
177      break;
178    case 6:
179      jj_consume_token(6);
180      break;
181    case 7:
182      jj_consume_token(7);
183      break;
184    case 8:
185      jj_consume_token(8);
186      break;
187    case 9:
188      jj_consume_token(9);
189      break;
190    case 10:
191      jj_consume_token(10);
192      break;
193    default:
194      jj_la1[2] = jj_gen;
195      jj_consume_token(-1);
196      throw new ParseException();
197    }
198      {if (true) return token.image;}
199    throw new Error("Missing return statement in function");
200  }
201
202  final public Date date() throws ParseException {
203 int d, m; String y;
204    d = day();
205    m = month();
206    y = year();
207      {if (true) return new Date(y, m, d);}
208    throw new Error("Missing return statement in function");
209  }
210
211  final public int day() throws ParseException {
212 Token t;
213    t = jj_consume_token(DIGITS);
214                 {if (true) return parseDigits(t);}
215    throw new Error("Missing return statement in function");
216  }
217
218  final public int month() throws ParseException {
219    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
220    case 11:
221      jj_consume_token(11);
222            {if (true) return 1;}
223      break;
224    case 12:
225      jj_consume_token(12);
226            {if (true) return 2;}
227      break;
228    case 13:
229      jj_consume_token(13);
230            {if (true) return 3;}
231      break;
232    case 14:
233      jj_consume_token(14);
234            {if (true) return 4;}
235      break;
236    case 15:
237      jj_consume_token(15);
238            {if (true) return 5;}
239      break;
240    case 16:
241      jj_consume_token(16);
242            {if (true) return 6;}
243      break;
244    case 17:
245      jj_consume_token(17);
246            {if (true) return 7;}
247      break;
248    case 18:
249      jj_consume_token(18);
250            {if (true) return 8;}
251      break;
252    case 19:
253      jj_consume_token(19);
254            {if (true) return 9;}
255      break;
256    case 20:
257      jj_consume_token(20);
258            {if (true) return 10;}
259      break;
260    case 21:
261      jj_consume_token(21);
262            {if (true) return 11;}
263      break;
264    case 22:
265      jj_consume_token(22);
266            {if (true) return 12;}
267      break;
268    default:
269      jj_la1[3] = jj_gen;
270      jj_consume_token(-1);
271      throw new ParseException();
272    }
273    throw new Error("Missing return statement in function");
274  }
275
276  final public String year() throws ParseException {
277 Token t;
278    t = jj_consume_token(DIGITS);
279                 {if (true) return t.image;}
280    throw new Error("Missing return statement in function");
281  }
282
283  final public Time time() throws ParseException {
284 int h, m, s=0, z;
285    h = hour();
286    jj_consume_token(23);
287    m = minute();
288    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
289    case 23:
290      jj_consume_token(23);
291      s = second();
292      break;
293    default:
294      jj_la1[4] = jj_gen;
295      ;
296    }
297    z = zone();
298      {if (true) return new Time(h, m, s, z);}
299    throw new Error("Missing return statement in function");
300  }
301
302  final public int hour() throws ParseException {
303 Token t;
304    t = jj_consume_token(DIGITS);
305                 {if (true) return parseDigits(t);}
306    throw new Error("Missing return statement in function");
307  }
308
309  final public int minute() throws ParseException {
310 Token t;
311    t = jj_consume_token(DIGITS);
312                 {if (true) return parseDigits(t);}
313    throw new Error("Missing return statement in function");
314  }
315
316  final public int second() throws ParseException {
317 Token t;
318    t = jj_consume_token(DIGITS);
319                 {if (true) return parseDigits(t);}
320    throw new Error("Missing return statement in function");
321  }
322
323  final public int zone() throws ParseException {
324  Token t, u; int z;
325    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
326    case OFFSETDIR:
327      t = jj_consume_token(OFFSETDIR);
328      u = jj_consume_token(DIGITS);
329                                              z=parseDigits(u)*(t.image.equals("-") ? -1 : 1);
330      break;
331    case 25:
332    case 26:
333    case 27:
334    case 28:
335    case 29:
336    case 30:
337    case 31:
338    case 32:
339    case 33:
340    case 34:
341    case MILITARY_ZONE:
342      z = obs_zone();
343      break;
344    default:
345      jj_la1[5] = jj_gen;
346      jj_consume_token(-1);
347      throw new ParseException();
348    }
349      {if (true) return z;}
350    throw new Error("Missing return statement in function");
351  }
352
353  final public int obs_zone() throws ParseException {
354 Token t; int z;
355    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
356    case 25:
357      jj_consume_token(25);
358            z=0;
359      break;
360    case 26:
361      jj_consume_token(26);
362            z=0;
363      break;
364    case 27:
365      jj_consume_token(27);
366            z=-5;
367      break;
368    case 28:
369      jj_consume_token(28);
370            z=-4;
371      break;
372    case 29:
373      jj_consume_token(29);
374            z=-6;
375      break;
376    case 30:
377      jj_consume_token(30);
378            z=-5;
379      break;
380    case 31:
381      jj_consume_token(31);
382            z=-7;
383      break;
384    case 32:
385      jj_consume_token(32);
386            z=-6;
387      break;
388    case 33:
389      jj_consume_token(33);
390            z=-8;
391      break;
392    case 34:
393      jj_consume_token(34);
394            z=-7;
395      break;
396    case MILITARY_ZONE:
397      t = jj_consume_token(MILITARY_ZONE);
398                                                             z=getMilitaryZoneOffset(t.image.charAt(0));
399      break;
400    default:
401      jj_la1[6] = jj_gen;
402      jj_consume_token(-1);
403      throw new ParseException();
404    }
405      {if (true) return z * 100;}
406    throw new Error("Missing return statement in function");
407  }
408
409  public DateTimeParserTokenManager token_source;
410  SimpleCharStream jj_input_stream;
411  public Token token, jj_nt;
412  private int jj_ntk;
413  private int jj_gen;
414  final private int[] jj_la1 = new int[7];
415  static private int[] jj_la1_0;
416  static private int[] jj_la1_1;
417  static {
418      jj_la1_0();
419      jj_la1_1();
420   }
421   private static void jj_la1_0() {
422      jj_la1_0 = new int[] {0x2,0x7f0,0x7f0,0x7ff800,0x800000,0xff000000,0xfe000000,};
423   }
424   private static void jj_la1_1() {
425      jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0xf,0xf,};
426   }
427
428  public DateTimeParser(java.io.InputStream stream) {
429     this(stream, null);
430  }
431  public DateTimeParser(java.io.InputStream stream, String encoding) {
432    try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
433    token_source = new DateTimeParserTokenManager(jj_input_stream);
434    token = new Token();
435    jj_ntk = -1;
436    jj_gen = 0;
437    for (int i = 0; i < 7; i++) jj_la1[i] = -1;
438  }
439
440  public void ReInit(java.io.InputStream stream) {
441     ReInit(stream, null);
442  }
443  public void ReInit(java.io.InputStream stream, String encoding) {
444    try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
445    token_source.ReInit(jj_input_stream);
446    token = new Token();
447    jj_ntk = -1;
448    jj_gen = 0;
449    for (int i = 0; i < 7; i++) jj_la1[i] = -1;
450  }
451
452  public DateTimeParser(java.io.Reader stream) {
453    jj_input_stream = new SimpleCharStream(stream, 1, 1);
454    token_source = new DateTimeParserTokenManager(jj_input_stream);
455    token = new Token();
456    jj_ntk = -1;
457    jj_gen = 0;
458    for (int i = 0; i < 7; i++) jj_la1[i] = -1;
459  }
460
461  public void ReInit(java.io.Reader stream) {
462    jj_input_stream.ReInit(stream, 1, 1);
463    token_source.ReInit(jj_input_stream);
464    token = new Token();
465    jj_ntk = -1;
466    jj_gen = 0;
467    for (int i = 0; i < 7; i++) jj_la1[i] = -1;
468  }
469
470  public DateTimeParser(DateTimeParserTokenManager tm) {
471    token_source = tm;
472    token = new Token();
473    jj_ntk = -1;
474    jj_gen = 0;
475    for (int i = 0; i < 7; i++) jj_la1[i] = -1;
476  }
477
478  public void ReInit(DateTimeParserTokenManager tm) {
479    token_source = tm;
480    token = new Token();
481    jj_ntk = -1;
482    jj_gen = 0;
483    for (int i = 0; i < 7; i++) jj_la1[i] = -1;
484  }
485
486  final private Token jj_consume_token(int kind) throws ParseException {
487    Token oldToken;
488    if ((oldToken = token).next != null) token = token.next;
489    else token = token.next = token_source.getNextToken();
490    jj_ntk = -1;
491    if (token.kind == kind) {
492      jj_gen++;
493      return token;
494    }
495    token = oldToken;
496    jj_kind = kind;
497    throw generateParseException();
498  }
499
500  final public Token getNextToken() {
501    if (token.next != null) token = token.next;
502    else token = token.next = token_source.getNextToken();
503    jj_ntk = -1;
504    jj_gen++;
505    return token;
506  }
507
508  final public Token getToken(int index) {
509    Token t = token;
510    for (int i = 0; i < index; i++) {
511      if (t.next != null) t = t.next;
512      else t = t.next = token_source.getNextToken();
513    }
514    return t;
515  }
516
517  final private int jj_ntk() {
518    if ((jj_nt=token.next) == null)
519      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
520    else
521      return (jj_ntk = jj_nt.kind);
522  }
523
524  private Vector<int[]> jj_expentries = new Vector<int[]>();
525  private int[] jj_expentry;
526  private int jj_kind = -1;
527
528  public ParseException generateParseException() {
529    jj_expentries.removeAllElements();
530    boolean[] la1tokens = new boolean[49];
531    for (int i = 0; i < 49; i++) {
532      la1tokens[i] = false;
533    }
534    if (jj_kind >= 0) {
535      la1tokens[jj_kind] = true;
536      jj_kind = -1;
537    }
538    for (int i = 0; i < 7; i++) {
539      if (jj_la1[i] == jj_gen) {
540        for (int j = 0; j < 32; j++) {
541          if ((jj_la1_0[i] & (1<<j)) != 0) {
542            la1tokens[j] = true;
543          }
544          if ((jj_la1_1[i] & (1<<j)) != 0) {
545            la1tokens[32+j] = true;
546          }
547        }
548      }
549    }
550    for (int i = 0; i < 49; i++) {
551      if (la1tokens[i]) {
552        jj_expentry = new int[1];
553        jj_expentry[0] = i;
554        jj_expentries.addElement(jj_expentry);
555      }
556    }
557    int[][] exptokseq = new int[jj_expentries.size()][];
558    for (int i = 0; i < jj_expentries.size(); i++) {
559      exptokseq[i] = jj_expentries.elementAt(i);
560    }
561    return new ParseException(token, exptokseq, tokenImage);
562  }
563
564  final public void enable_tracing() {
565  }
566
567  final public void disable_tracing() {
568  }
569
570}
571