txtwin: mark previous position with '
[cnoor.git] / cnoor.c
blob516a87814a0c899eef7e712c2281daf18fd0cace
1 /*
2 * cnoor - a small framebuffer Quran viewer
4 * Copyright (C) 2009-2015 Ali Gholami Rudi <ali at rudi dot ir>
6 * This program is released under the Modified BSD license.
7 */
8 #include <ctype.h>
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include <string.h>
12 #include "config.h"
13 #include "txtwin.h"
14 #include "quran.h"
16 #define LENGTH(vars) (sizeof(vars) / sizeof(vars[0]))
18 static char *adigs[] = {"٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"};
20 static char *arabic_number(int n)
22 static char buf[128];
23 int digs[16];
24 int ndigs = 0;
25 int i;
26 while (n) {
27 digs[ndigs++] = n % 10;
28 n /= 10;
30 buf[0] = '\0';
31 for (i = 0; i < ndigs; i++)
32 strcat(buf, adigs[digs[i]]);
33 return buf;
36 static void ins_sura(struct quran *quran, struct quran *trans, int sura)
38 char buf[16 * 1024];
39 int start = sura_start(sura);
40 int ayas = sura_ayas(sura);
41 int i;
42 for (i = 0; i < ayas; i++) {
43 int juz = juz_start(sura, i + 1);
44 int sajda = sajda_kind(sura, i + 1);
45 txtwin_line();
46 if (juz) {
47 sprintf(buf, " %s\n", arabic_number(juz));
48 txtwin_append(buf, FONT_JUZ);
50 quran_aya(quran, buf, LENGTH(buf), start + i);
51 txtwin_append(buf, FONT_QURAN);
52 sprintf(buf, " %s ", arabic_number(i + 1));
53 txtwin_append(buf, FONT_NUM);
54 if (sajda != SAJDA_NONE) {
55 char *s = sajda == SAJDA_RECOM ? "*" : "**";
56 txtwin_append(s, FONT_SAJDA);
58 if (trans) {
59 quran_aya(trans, buf, LENGTH(buf), start + i);
60 txtwin_append("\n", NULL);
61 txtwin_append(buf, FONT_TRANS);
63 txtwin_append("\n\n", NULL);
67 int show(int sura)
69 char name[128];
70 struct quran *quran;
71 struct quran *trans = NULL;
72 sprintf(name, "%d(%s)", sura, sura_name(sura));
73 quran = quran_alloc(QURAN_PATH);
74 if (TRANS_PATH)
75 trans = quran_alloc(TRANS_PATH);
76 txtwin_init(name);
77 ins_sura(quran, trans, sura);
78 txtwin_loop();
79 txtwin_free();
80 if (trans)
81 quran_free(trans);
82 quran_free(quran);
83 return 0;
86 int main(int argc, char **argv)
88 int sura;
89 if (argc == 1 || !strcmp(argv[1], "-h")) {
90 printf("usage: %s sura_number\n", argv[0]);
91 return 0;
93 sura = atoi(argv[1]);
94 if (sura <= 0 || sura > 114) {
95 fprintf(stderr, "cnoor: invalid sura number\n");
96 return 1;
98 show(sura);
99 return 0;