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