959e88ce61a2dbd3db51f8c0accaf3bb153100e5
[fleet.git] / src / edu / berkeley / fleet / doc / Constant.java
1 package edu.berkeley.fleet.doc;
2
3 import java.io.*;
4 import java.util.*;
5
6 public class Constant {
7
8     long setbits   = 0;
9     long clearbits = 0;
10     boolean signExtend = false;
11     int numberOffset = 0;
12     int numberWidth = 0;
13
14     public Constant(String s) {
15         if (s.startsWith("0x")) {
16             setbits = Long.parseLong(s.substring(2), 16);
17             clearbits = ~setbits;
18         } else if (s.length() == 37) {
19             for(int i=0; i<37; i++) {
20                 char c = s.charAt(36-i);
21                 switch(c) {
22                     case '0': clearbits |= (1<<i); break;
23                     case '1': setbits   |= (1<<i); break;
24                     case '.': break;
25                     case 's': signExtend = true;  numberOffset = i; numberWidth++; break;
26                     case 'u': signExtend = false; numberOffset = i; numberWidth++; break;
27                 }
28             }
29         } else {
30             setbits = Long.parseLong(s);
31             clearbits = ~setbits;
32         }
33     }
34
35     public static long resolveConstant(String exp, BenkoBoxDescription bbd) {
36         long ret = 0;
37         for(StringTokenizer st = new StringTokenizer(exp, ",");
38             st.hasMoreTokens();) {
39             String s = st.nextToken();
40             long val = 0;
41             if (s.indexOf('=') != -1) {
42                 val = Long.parseLong(s.substring(s.indexOf('=')+1));
43                 s = s.substring(0, s.indexOf('='));
44             }
45             Constant c = bbd.getConstant(s);
46             if (c==null) {
47                 if (s.startsWith("0x")) ret |= Long.parseLong(s, 16);
48                 else                    ret |= Long.parseLong(s);
49             } else {
50                 ret |= c.setbits;
51                 ret &= ~c.clearbits;
52                 // FIXME: val
53             }
54         }
55         return ret;
56     }
57
58 }