fbpan: add % command
[cnoor.git] / quran.c
blobef2e1cda2d7e7fde4ba6693611f03aa43e892f11
1 #include <fcntl.h>
2 #include <sys/mman.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <sys/stat.h>
6 #include <sys/types.h>
7 #include <unistd.h>
8 #include "util.h"
9 #include "quran.h"
11 static size_t file_size(int fd)
13 struct stat st;
14 if (!fstat(fd, &st))
15 return st.st_size;
16 return 0;
19 static void init_ayas(struct quran *quran)
21 int i = 0;
22 char *s = quran->text;
23 quran->ayas[0] = quran->text;
24 while (i < NAYA && (s = strchr(s, '\n')))
25 quran->ayas[++i] = ++s;
28 struct quran *quran_alloc(char *path)
30 struct quran *quran = xmalloc(sizeof(struct quran));
31 memset(quran, 0, sizeof(quran));
32 quran->fd = open(path, O_RDONLY);
33 if (quran->fd == -1)
34 xerror("open");
35 quran->text = mmap(NULL, file_size(quran->fd), PROT_READ,
36 MAP_SHARED, quran->fd, 0);
37 if (quran->text == MAP_FAILED)
38 xerror("mmap");
39 init_ayas(quran);
40 return quran;
43 void quran_aya(struct quran *quran, char *buf, size_t len, int aya)
45 char *s = quran->ayas[aya];
46 char *e = strchr(s, '\n');
47 size_t n = e - s;
48 if (n > len - 1)
49 n = len - 1;
50 memcpy(buf, s, n);
51 buf[buf[n - 1] == '\r' ? n - 1 : n] = '\0';
54 void quran_free(struct quran *quran)
56 munmap(quran->text, file_size(quran->fd));
57 close(quran->fd);
58 free(quran);
61 static int ayas[] = {
62 7, 286, 200, 176, 120, 165, 206, 75, 129, 109,
63 123, 111, 43, 52, 99, 128, 111, 110, 98, 135,
64 112, 78, 118, 64, 77, 227, 93, 88, 69, 60,
65 34, 30, 73, 54, 45, 83, 182, 88, 75, 85,
66 54, 53, 89, 59, 37, 35, 38, 29, 18, 45,
67 60, 49, 62, 55, 78, 96, 29, 22, 24, 13,
68 14, 11, 11, 18, 12, 12, 30, 52, 52, 44,
69 28, 28, 20, 56, 40, 31, 50, 40, 46, 42,
70 29, 19, 36, 25, 22, 17, 19, 26, 30, 20,
71 15, 21, 11, 8, 8, 19, 5, 8, 8, 11,
72 11, 8, 3, 9, 5, 4, 7, 3, 6, 3,
73 5, 4, 5, 6};
75 int sura_ayas(int sura)
77 return ayas[sura - 1];
80 int sura_start(int sura)
82 int i;
83 int n = 0;
84 for (i = 0; i < sura - 1; i++)
85 n += ayas[i];
86 return n;
89 int aya_num(int sura, int aya)
91 return sura_start(sura) + aya;
94 #define AYAHASH(sura, aya) (((sura) << 10) | (aya))
96 int juz_start(int sura, int aya)
98 switch (AYAHASH(sura, aya)) {
99 case AYAHASH(1, 1):
100 return 1;
101 case AYAHASH(2, 142):
102 return 2;
103 case AYAHASH(2, 253):
104 return 3;
105 case AYAHASH(3, 93):
106 return 4;
107 case AYAHASH(4, 24):
108 return 5;
109 case AYAHASH(4, 148):
110 return 6;
111 case AYAHASH(5, 82):
112 return 7;
113 case AYAHASH(6, 111):
114 return 8;
115 case AYAHASH(7, 88):
116 return 9;
117 case AYAHASH(8, 41):
118 return 10;
119 case AYAHASH(9, 93):
120 return 11;
121 case AYAHASH(11, 6):
122 return 12;
123 case AYAHASH(12, 53):
124 return 13;
125 case AYAHASH(15, 1):
126 return 14;
127 case AYAHASH(17, 1):
128 return 15;
129 case AYAHASH(18, 75):
130 return 16;
131 case AYAHASH(21, 1):
132 return 16;
133 case AYAHASH(23, 1):
134 return 18;
135 case AYAHASH(25, 21):
136 return 19;
137 case AYAHASH(27, 56):
138 return 20;
139 case AYAHASH(29, 46):
140 return 21;
141 case AYAHASH(33, 31):
142 return 22;
143 case AYAHASH(36, 28):
144 return 23;
145 case AYAHASH(39, 32):
146 return 24;
147 case AYAHASH(41, 47):
148 return 25;
149 case AYAHASH(46, 1):
150 return 26;
151 case AYAHASH(51, 31):
152 return 27;
153 case AYAHASH(58, 1):
154 return 28;
155 case AYAHASH(67, 1):
156 return 29;
157 case AYAHASH(78, 1):
158 return 30;
160 return 0;
163 enum sajda sajda_kind(int sura, int aya)
165 switch (AYAHASH(sura, aya)) {
166 case AYAHASH(7, 206):
167 return SAJDA_RECOM;
168 case AYAHASH(13, 15):
169 return SAJDA_RECOM;
170 case AYAHASH(16, 50):
171 return SAJDA_RECOM;
172 case AYAHASH(17, 109):
173 return SAJDA_RECOM;
174 case AYAHASH(19, 58):
175 return SAJDA_RECOM;
176 case AYAHASH(22, 18):
177 return SAJDA_RECOM;
178 case AYAHASH(22, 77):
179 return SAJDA_RECOM;
180 case AYAHASH(25, 60):
181 return SAJDA_RECOM;
182 case AYAHASH(27, 26):
183 return SAJDA_RECOM;
184 case AYAHASH(32, 15):
185 return SAJDA_OBLIG;
186 case AYAHASH(38, 24):
187 return SAJDA_RECOM;
188 case AYAHASH(41, 38):
189 return SAJDA_OBLIG;
190 case AYAHASH(53, 62):
191 return SAJDA_OBLIG;
192 case AYAHASH(84, 21):
193 return SAJDA_RECOM;
194 case AYAHASH(96, 19):
195 return SAJDA_OBLIG;
196 default:
197 return SAJDA_NONE;