Blame


1 8a3b2ceb 2004-04-24 devnull #include <u.h>
2 8a3b2ceb 2004-04-24 devnull #include <libc.h>
3 8a3b2ceb 2004-04-24 devnull #include <bio.h>
4 8a3b2ceb 2004-04-24 devnull #include "sky.h"
5 8a3b2ceb 2004-04-24 devnull
6 8a3b2ceb 2004-04-24 devnull extern Biobuf bout;
7 8a3b2ceb 2004-04-24 devnull
8 8a3b2ceb 2004-04-24 devnull char*
9 8a3b2ceb 2004-04-24 devnull append(char *p, char *s)
10 8a3b2ceb 2004-04-24 devnull {
11 8a3b2ceb 2004-04-24 devnull while(*s)
12 8a3b2ceb 2004-04-24 devnull *p++ = *s++;
13 8a3b2ceb 2004-04-24 devnull return p;
14 8a3b2ceb 2004-04-24 devnull }
15 8a3b2ceb 2004-04-24 devnull
16 8a3b2ceb 2004-04-24 devnull int
17 8a3b2ceb 2004-04-24 devnull matchlen(char *a, char *b)
18 8a3b2ceb 2004-04-24 devnull {
19 8a3b2ceb 2004-04-24 devnull int n;
20 8a3b2ceb 2004-04-24 devnull
21 8a3b2ceb 2004-04-24 devnull for(n=0; *a==*b; a++, b++, n++)
22 8a3b2ceb 2004-04-24 devnull if(*a == 0)
23 8a3b2ceb 2004-04-24 devnull return n;
24 8a3b2ceb 2004-04-24 devnull if(*a == 0)
25 8a3b2ceb 2004-04-24 devnull return n;
26 8a3b2ceb 2004-04-24 devnull return 0;
27 8a3b2ceb 2004-04-24 devnull }
28 8a3b2ceb 2004-04-24 devnull
29 8a3b2ceb 2004-04-24 devnull char*
30 8a3b2ceb 2004-04-24 devnull prose(char *s, char *desc[][2], short index[])
31 8a3b2ceb 2004-04-24 devnull {
32 8a3b2ceb 2004-04-24 devnull static char buf[512];
33 8a3b2ceb 2004-04-24 devnull char *p=buf;
34 8a3b2ceb 2004-04-24 devnull int i, j, k, max;
35 8a3b2ceb 2004-04-24 devnull
36 8a3b2ceb 2004-04-24 devnull j = 0;
37 8a3b2ceb 2004-04-24 devnull while(*s){
38 8a3b2ceb 2004-04-24 devnull if(p >= buf+sizeof buf)
39 8a3b2ceb 2004-04-24 devnull abort();
40 8a3b2ceb 2004-04-24 devnull if(*s == ' '){
41 8a3b2ceb 2004-04-24 devnull if(p>buf && p[-1]!=' ')
42 8a3b2ceb 2004-04-24 devnull *p++ = ' ';
43 8a3b2ceb 2004-04-24 devnull s++;
44 8a3b2ceb 2004-04-24 devnull continue;
45 8a3b2ceb 2004-04-24 devnull }
46 8a3b2ceb 2004-04-24 devnull if(*s == ','){
47 8a3b2ceb 2004-04-24 devnull *p++ = ';', s++;
48 8a3b2ceb 2004-04-24 devnull continue;
49 8a3b2ceb 2004-04-24 devnull }
50 8a3b2ceb 2004-04-24 devnull if(s[0]=='M' && '0'<=s[1] && s[1]<='9'){ /* Messier tag */
51 8a3b2ceb 2004-04-24 devnull *p++ = *s++;
52 8a3b2ceb 2004-04-24 devnull continue; /* below will copy the number */
53 8a3b2ceb 2004-04-24 devnull }
54 8a3b2ceb 2004-04-24 devnull if((i=index[(uchar)*s]) == -1){
55 8a3b2ceb 2004-04-24 devnull Dup:
56 8a3b2ceb 2004-04-24 devnull switch(*s){
57 8a3b2ceb 2004-04-24 devnull default:
58 8a3b2ceb 2004-04-24 devnull while(*s && *s!=',' && *s!=' ')
59 8a3b2ceb 2004-04-24 devnull *p++=*s++;
60 8a3b2ceb 2004-04-24 devnull break;
61 8a3b2ceb 2004-04-24 devnull
62 8a3b2ceb 2004-04-24 devnull case '0': case '1': case '2': case '3': case '4':
63 8a3b2ceb 2004-04-24 devnull case '5': case '6': case '7': case '8': case '9':
64 8a3b2ceb 2004-04-24 devnull while('0'<=*s && *s<='9')
65 8a3b2ceb 2004-04-24 devnull *p++ = *s++;
66 8a3b2ceb 2004-04-24 devnull if(*s=='\'' || *s=='s')
67 8a3b2ceb 2004-04-24 devnull *p++ = *s++;
68 8a3b2ceb 2004-04-24 devnull break;
69 8a3b2ceb 2004-04-24 devnull
70 8a3b2ceb 2004-04-24 devnull case '(': case ')':
71 8a3b2ceb 2004-04-24 devnull case '\'': case '"':
72 8a3b2ceb 2004-04-24 devnull case '&': case '-': case '+':
73 8a3b2ceb 2004-04-24 devnull *p++ = *s++;
74 8a3b2ceb 2004-04-24 devnull break;
75 8a3b2ceb 2004-04-24 devnull
76 8a3b2ceb 2004-04-24 devnull case '*':
77 8a3b2ceb 2004-04-24 devnull if('0'<=s[1] && s[1]<='9'){
78 8a3b2ceb 2004-04-24 devnull int flag=0;
79 8a3b2ceb 2004-04-24 devnull s++;
80 8a3b2ceb 2004-04-24 devnull Pnumber:
81 8a3b2ceb 2004-04-24 devnull while('0'<=*s && *s<='9')
82 8a3b2ceb 2004-04-24 devnull *p++=*s++;
83 8a3b2ceb 2004-04-24 devnull if(s[0] == '-'){
84 8a3b2ceb 2004-04-24 devnull *p++ = *s++;
85 8a3b2ceb 2004-04-24 devnull flag++;
86 8a3b2ceb 2004-04-24 devnull goto Pnumber;
87 8a3b2ceb 2004-04-24 devnull }
88 8a3b2ceb 2004-04-24 devnull if(s[0]==',' && s[1]==' ' && '0'<=s[2] && s[2]<='9'){
89 8a3b2ceb 2004-04-24 devnull *p++ = *s++;
90 8a3b2ceb 2004-04-24 devnull s++; /* skip blank */
91 8a3b2ceb 2004-04-24 devnull flag++;
92 8a3b2ceb 2004-04-24 devnull goto Pnumber;
93 8a3b2ceb 2004-04-24 devnull }
94 8a3b2ceb 2004-04-24 devnull if(s[0] == '.'){
95 8a3b2ceb 2004-04-24 devnull if(s[1]=='.' && s[2]=='.'){
96 8a3b2ceb 2004-04-24 devnull *p++ = '-';
97 8a3b2ceb 2004-04-24 devnull s += 3;
98 8a3b2ceb 2004-04-24 devnull flag++;
99 8a3b2ceb 2004-04-24 devnull goto Pnumber;
100 8a3b2ceb 2004-04-24 devnull }
101 8a3b2ceb 2004-04-24 devnull *p++ = *s++;
102 8a3b2ceb 2004-04-24 devnull goto Pnumber;
103 8a3b2ceb 2004-04-24 devnull }
104 8a3b2ceb 2004-04-24 devnull p = append(p, "m star");
105 8a3b2ceb 2004-04-24 devnull if(flag)
106 8a3b2ceb 2004-04-24 devnull *p++ = 's';
107 8a3b2ceb 2004-04-24 devnull *p++ = ' ';
108 8a3b2ceb 2004-04-24 devnull break;
109 8a3b2ceb 2004-04-24 devnull }
110 8a3b2ceb 2004-04-24 devnull if(s[1] == '*'){
111 8a3b2ceb 2004-04-24 devnull if(s[2] == '*'){
112 8a3b2ceb 2004-04-24 devnull p = append(p, "triple star ");
113 8a3b2ceb 2004-04-24 devnull s += 3;
114 8a3b2ceb 2004-04-24 devnull }else{
115 8a3b2ceb 2004-04-24 devnull p = append(p, "double star ");
116 8a3b2ceb 2004-04-24 devnull s += 2;
117 8a3b2ceb 2004-04-24 devnull }
118 8a3b2ceb 2004-04-24 devnull break;
119 8a3b2ceb 2004-04-24 devnull }
120 8a3b2ceb 2004-04-24 devnull p = append(p, "star ");
121 8a3b2ceb 2004-04-24 devnull s++;
122 8a3b2ceb 2004-04-24 devnull break;
123 8a3b2ceb 2004-04-24 devnull }
124 8a3b2ceb 2004-04-24 devnull continue;
125 8a3b2ceb 2004-04-24 devnull }
126 8a3b2ceb 2004-04-24 devnull for(max=-1; desc[i][0] && desc[i][0][0]==*s; i++){
127 8a3b2ceb 2004-04-24 devnull k = matchlen(desc[i][0], s);
128 8a3b2ceb 2004-04-24 devnull if(k > max)
129 8a3b2ceb 2004-04-24 devnull max = k, j = i;
130 8a3b2ceb 2004-04-24 devnull }
131 8a3b2ceb 2004-04-24 devnull if(max == 0)
132 8a3b2ceb 2004-04-24 devnull goto Dup;
133 8a3b2ceb 2004-04-24 devnull s += max;
134 8a3b2ceb 2004-04-24 devnull for(k=0; desc[j][1][k]; k++)
135 8a3b2ceb 2004-04-24 devnull *p++=desc[j][1][k];
136 8a3b2ceb 2004-04-24 devnull if(*s == ' ')
137 8a3b2ceb 2004-04-24 devnull *p++ = *s++;
138 8a3b2ceb 2004-04-24 devnull else if(*s == ',')
139 8a3b2ceb 2004-04-24 devnull *p++ = ';', s++;
140 8a3b2ceb 2004-04-24 devnull else
141 8a3b2ceb 2004-04-24 devnull *p++ = ' ';
142 8a3b2ceb 2004-04-24 devnull }
143 8a3b2ceb 2004-04-24 devnull *p = 0;
144 8a3b2ceb 2004-04-24 devnull return buf;
145 8a3b2ceb 2004-04-24 devnull }
146 8a3b2ceb 2004-04-24 devnull
147 8a3b2ceb 2004-04-24 devnull void
148 8a3b2ceb 2004-04-24 devnull prdesc(char *s, char *desc[][2], short index[])
149 8a3b2ceb 2004-04-24 devnull {
150 8a3b2ceb 2004-04-24 devnull int c, j;
151 8a3b2ceb 2004-04-24 devnull
152 8a3b2ceb 2004-04-24 devnull if(index[0] == 0){
153 8a3b2ceb 2004-04-24 devnull index[0] = 1;
154 8a3b2ceb 2004-04-24 devnull for(c=1, j=0; c<128; c++)
155 8a3b2ceb 2004-04-24 devnull if(desc[j][0]==0 || desc[j][0][0]>c)
156 8a3b2ceb 2004-04-24 devnull index[c] = -1;
157 8a3b2ceb 2004-04-24 devnull else if(desc[j][0][0] == c){
158 8a3b2ceb 2004-04-24 devnull index[c] = j;
159 8a3b2ceb 2004-04-24 devnull while(desc[j][0] && desc[j][0][0] == c)
160 8a3b2ceb 2004-04-24 devnull j++;
161 8a3b2ceb 2004-04-24 devnull if(j >= NINDEX){
162 8a3b2ceb 2004-04-24 devnull fprint(2, "scat: internal error: too many prose entries\n");
163 8a3b2ceb 2004-04-24 devnull exits("NINDEX");
164 8a3b2ceb 2004-04-24 devnull }
165 8a3b2ceb 2004-04-24 devnull }
166 8a3b2ceb 2004-04-24 devnull }
167 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "\t%s [%s]\n", prose(s, desc, index), s);
168 8a3b2ceb 2004-04-24 devnull }