10 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
11 #define MIN(a, b) ((a) < (b) ? (a) : (b))
12 #define MAX(a, b) ((a) > (b) ? (a) : (b))
14 static char abuf
[1 << 16];
19 static int aya_offset(int fd
, int aya
)
22 if (aaya
> aya
|| apos
== -1) {
27 read(fd
, abuf
, sizeof(abuf
));
30 while (!(s
= memchr(abuf
+ acur
, '\n', sizeof(abuf
) - acur
))) {
34 read(fd
, abuf
, sizeof(abuf
));
42 static void *xmalloc(size_t size
)
44 void *value
= malloc(size
);
46 fprintf(stderr
, "Out of memory!\n");
52 static void *xerror(char *errmsg
)
58 struct quran
*quran_alloc(char *path
)
60 struct quran
*quran
= xmalloc(sizeof(struct quran
));
62 memset(quran
, 0, sizeof(quran
));
63 quran
->fd
= open(path
, O_RDONLY
);
66 for (i
= 0; i
< NAYA
+ 1; i
++)
67 quran
->ayas
[i
] = aya_offset(quran
->fd
, i
);
71 void quran_aya(struct quran
*quran
, char *buf
, int len
, int aya
)
74 if (quran
->ayas
[aya
] + len
> quran
->ayas
[aya
+ 1])
75 len
= quran
->ayas
[aya
+ 1] - quran
->ayas
[aya
] - 1;
76 lseek(quran
->fd
, quran
->ayas
[aya
], 0);
77 n
= read(quran
->fd
, buf
, len
);
78 while (n
> 0 && (buf
[n
- 1] == '\r' || buf
[n
- 1] == '\n'))
83 void quran_free(struct quran
*quran
)
93 {"Al-Faatiha", 7}, {"Al-Baqara", 286}, {"Aal-i-Imraan", 200},
94 {"An-Nisaa", 176}, {"Al-Maaida", 120}, {"Al-An'aam", 165},
95 {"Al-A'raaf", 206}, {"Al-Anfaal", 75}, {"At-Tawba", 129},
96 {"Yunus", 109}, {"Hud", 123}, {"Yusuf", 111},
97 {"Ar-Ra'd", 43}, {"Ibrahim", 52}, {"Al-Hijr", 99},
98 {"An-Nahl", 128}, {"Al-Israa", 111}, {"Al-Kahf", 110},
99 {"Maryam", 98}, {"Taa-Haa", 135}, {"Al-Anbiyaa", 112},
100 {"Al-Hajj", 78}, {"Al-Muminoon", 118}, {"An-Noor", 64},
101 {"Al-Furqaan", 77}, {"Ash-Shu'araa", 227}, {"An-Naml", 93},
102 {"Al-Qasas", 88}, {"Al-Ankaboot", 69}, {"Ar-Room", 60},
103 {"Luqman", 34}, {"As-Sajda", 30}, {"Al-Ahzaab", 73},
104 {"Saba", 54}, {"Faatir", 45}, {"Yaseen", 83},
105 {"As-Saaffaat", 182}, {"Saad", 88}, {"Az-Zumar", 75},
106 {"Al-Ghaafir", 85}, {"Fussilat", 54}, {"Ash-Shura", 53},
107 {"Az-Zukhruf", 89}, {"Ad-Dukhaan", 59}, {"Al-Jaathiya", 37},
108 {"Al-Ahqaf", 35}, {"Muhammad", 38}, {"Al-Fath", 29},
109 {"Al-Hujuraat", 18}, {"Qaaf", 45}, {"Adh-Dhaariyat", 60},
110 {"At-Tur", 49}, {"An-Najm", 62}, {"Al-Qamar", 55},
111 {"Ar-Rahmaan", 78}, {"Al-Waaqia", 96}, {"Al-Hadid", 29},
112 {"Al-Mujaadila", 22}, {"Al-Hashr", 24}, {"Al-Mumtahana", 13},
113 {"As-Saff", 14}, {"Al-Jumu'a", 11}, {"Al-Munaafiqoon", 11},
114 {"At-Taghaabun", 18}, {"At-Talaaq", 12}, {"At-Tahrim", 12},
115 {"Al-Mulk", 30}, {"Al-Qalam", 52}, {"Al-Haaqqa", 52},
116 {"Al-Ma'aarij", 44}, {"Nooh", 28}, {"Al-Jinn", 28},
117 {"Al-Muzzammil", 20}, {"Al-Muddaththir", 56}, {"Al-Qiyaama", 40},
118 {"Al-Insaan", 31}, {"Al-Mursalaat", 50}, {"An-Naba", 40},
119 {"An-Naazi'aat", 46}, {"Abasa", 42}, {"At-Takwir", 29},
120 {"Al-Infitaar", 19}, {"Al-Mutaffifin", 36}, {"Al-Inshiqaaq", 25},
121 {"Al-Burooj", 22}, {"At-Taariq", 17}, {"Al-A'laa", 19},
122 {"Al-Ghaashiya", 26}, {"Al-Fajr", 30}, {"Al-Balad", 20},
123 {"Ash-Shams", 15}, {"Al-Lail", 21}, {"Ad-Dhuhaa", 11},
124 {"Ash-Sharh", 8}, {"At-Tin", 8}, {"Al-Alaq", 19},
125 {"Al-Qadr", 5}, {"Al-Bayyina", 8}, {"Az-Zalzala", 8},
126 {"Al-Aadiyaat", 11}, {"Al-Qaari'a", 11}, {"At-Takaathur", 8},
127 {"Al-Asr", 3}, {"Al-Humaza", 9}, {"Al-Fil", 5},
128 {"Quraish", 4}, {"Al-Maa'un", 7}, {"Al-Kawthar", 3},
129 {"Al-Kaafiroon", 6}, {"An-Nasr", 3}, {"Al-Masad", 5},
130 {"Al-Ikhlaas", 4}, {"Al-Falaq", 5}, {"An-Naas", 6}
133 int sura_ayas(int sura
)
135 return suras
[sura
- 1].ayas
;
138 char *sura_name(int sura
)
140 return suras
[sura
- 1].name
;
143 int sura_start(int sura
)
147 for (i
= 0; i
< sura
- 1; i
++)
152 int aya_num(int sura
, int aya
)
154 return sura_start(sura
) + aya
;
157 #define AYAHASH(sura, aya) (((sura) << 10) | (aya))
159 int juz_start(int sura
, int aya
)
161 switch (AYAHASH(sura
, aya
)) {
164 case AYAHASH(2, 142):
166 case AYAHASH(2, 253):
172 case AYAHASH(4, 148):
176 case AYAHASH(6, 111):
186 case AYAHASH(12, 53):
192 case AYAHASH(18, 75):
198 case AYAHASH(25, 21):
200 case AYAHASH(27, 56):
202 case AYAHASH(29, 46):
204 case AYAHASH(33, 31):
206 case AYAHASH(36, 28):
208 case AYAHASH(39, 32):
210 case AYAHASH(41, 47):
214 case AYAHASH(51, 31):
226 int sajda_kind(int sura
, int aya
)
228 switch (AYAHASH(sura
, aya
)) {
229 case AYAHASH(7, 206):
231 case AYAHASH(13, 15):
233 case AYAHASH(16, 50):
235 case AYAHASH(17, 109):
237 case AYAHASH(19, 58):
239 case AYAHASH(22, 18):
241 case AYAHASH(22, 77):
243 case AYAHASH(25, 60):
245 case AYAHASH(27, 26):
247 case AYAHASH(32, 15):
249 case AYAHASH(38, 24):
251 case AYAHASH(41, 38):
253 case AYAHASH(53, 62):
255 case AYAHASH(84, 21):
257 case AYAHASH(96, 19):