чување 5ba662b56983e43c4a8c3ba769dd73adf32d8bd7
родитељ e5af08f756af7c5f8c7ae58280256a7ace6d1e29
Аутор: Страхиња Радић <contact@strahinja.org>
Датум: Mon, 17 May 2021 23:09:27 +0200
Added flags, test entries, entry drawing routine and more
Signed-off-by: Страхиња Радић <contact@strahinja.org>
Diffstat:
| M | poe.c | | | 151 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------- |
измењених датотека: 1, додавања: 126(+), брисања: 25(-)
diff --git a/poe.c b/poe.c
@@ -35,11 +35,18 @@
#define BORDER_SE u'\u2518'
#define BORDER_VER u'\u2502'
#define BORDER_HOR u'\u2500'
-#define PROGRAMNAME "poe"
+
#define ERROR_FG TB_WHITE | TB_BOLD
#define ERROR_BG TB_RED
+#define FLAG_FG TB_YELLOW | TB_BOLD
+#define FLAG_BG TB_DEFAULT
+#define MSGID_FG TB_GREEN
+#define MSGID_BG TB_DEFAULT
+#define MSGSTR_FG TB_WHITE
+#define MSGSTR_BG TB_DEFAULT
#define SHADOW_FG TB_BLACK
#define SHADOW_BG TB_BLACK | TB_BOLD
+
#define LEN(x) (sizeof(x) / sizeof(x[0]))
typedef enum {
@@ -48,11 +55,17 @@ typedef enum {
RIGHT
} Alignment;
+typedef enum {
+ FL_NONE = 0,
+ FL_C_FORMAT = 1,
+ FL_FUZZY = 1 << 1,
+} Flags;
+
enum {
ERR_UNKNOWN_KEY,
ERR_NO_PREV,
ERR_NO_NEXT,
- ERR_EXITKEY
+ ERR_EXIT_KEY
};
typedef struct {
@@ -63,20 +76,35 @@ typedef struct {
Alignment alignment;
} StatusSegment;
+typedef struct {
+ Flags flags;
+ char* msgid;
+ char* msgstr;
+} PoEntry;
+
static const char* title = " poe - .po File Editor ";
static const char* help[] = {
- "ESC - Close dialog, clear error",
- "H | F1 - Show this screen",
- "k | ↑ - Previous entry",
- "j | ↓ - Next entry",
- "q - Quit"
+ "ESC - Close dialog, clear error",
+ "H | F1 - Show this screen",
+ "g | Home - First entry",
+ "k | \u2191 - Previous entry",
+ "j | \u2193 - Next entry",
+ "G | End - Last entry",
+ "q - Quit"
};
static const char* errors[] = {
- [ERR_UNKNOWN_KEY] = "Unknown key (press F1 for help)",
- [ERR_NO_PREV] = "No previous entry",
- [ERR_NO_NEXT] = "No next entry",
- [ERR_EXITKEY] = "Press q to quit"
+ [ERR_UNKNOWN_KEY] = "Unknown key (press H for help)",
+ [ERR_NO_PREV] = "No previous entry",
+ [ERR_NO_NEXT] = "No next entry",
+ [ERR_EXIT_KEY] = "Press q to quit"
+};
+static const char* flag_strings[] = {
+ [FL_C_FORMAT] = "c-format",
+ [FL_FUZZY] = "fuzzy"
};
+static const char* empty_msgid = "*** No msgid ***";
+static const char* empty_msgstr = "*** No msgstr ***";
+static const char* program_name = "poe";
void format_filename(char* result, size_t result_size, const char* format);
void format_msgs(char* result, size_t result_size, const char* format);
@@ -92,10 +120,19 @@ static const StatusSegment status_segments[] = {
char filename[MAXPATH];
char error[MAXBUF];
+/* Test */
+static PoEntry entries[] = {
+ { flags: FL_C_FORMAT | FL_FUZZY, msgid: "First msgid: %s",
+ msgstr: "Први msgid: %s" },
+ { flags: FL_NONE, msgid: "Test msgid",
+ msgstr: "Пробни msgstr" },
+ { flags: FL_FUZZY, msgid: "Final text",
+ msgstr: "Последњи текст" },
+};
-long msgid_count = 0;
-long msgid_index = 0;
-int show_help = 0;
+long msgid_count = 0;
+long msgid_number = 0;
+int show_help = 0;
int maxx, maxy;
int
@@ -106,7 +143,7 @@ print_error(const int code, const char* msg, ...)
va_start(args, msg);
vsnprintf(buf, sizeof(buf), msg, args);
va_end(args);
- fprintf(stderr, "%s: %s\n", PROGRAMNAME, buf);
+ fprintf(stderr, "%s: %s\n", program_name, buf);
return code;
}
@@ -125,7 +162,7 @@ format_msgs(char* result, size_t result_size, const char* format)
if (!result)
return;
- snprintf(result, result_size, format, msgid_index, msgid_count);
+ snprintf(result, result_size, format, msgid_number, msgid_count);
}
void
@@ -248,7 +285,7 @@ draw_help()
draw_box(startx, endx, starty, endy, TB_BLACK, TB_WHITE);
draw_string(startx+1, starty, TB_BLACK | TB_BOLD | TB_REVERSE, TB_WHITE,
title, w-2, strlen(title)+2, 1, CENTER);
- while (row < sizeof(help)/sizeof(*help))
+ while (row < LEN(help))
{
draw_string(startx+2, starty+3+row, TB_BLACK, TB_WHITE,
help[row], w-4, w-4, 2, LEFT);
@@ -264,7 +301,7 @@ draw_status()
int current_start = 0;
const StatusSegment* pseg = status_segments;
- if (*error)
+ if (error[0])
draw_string(0, maxy-1, ERROR_FG, ERROR_BG, error, maxx, maxx,
1, CENTER);
else
@@ -284,10 +321,55 @@ draw_status()
}
void
+draw_entry(PoEntry* entry)
+{
+ char flags_buf[MAXBUF];
+ uint16_t flags;
+
+ if (entry)
+ {
+ draw_string(0, maxy/3, MSGID_FG, MSGID_BG, entry->msgid,
+ maxx, maxx, maxx/4, LEFT);
+ flags = entry->flags;
+ flags_buf[0] = 0;
+ while (flags)
+ {
+ if (flags & FL_C_FORMAT)
+ {
+ flags &= ~FL_C_FORMAT;
+ draw_string(0, 1, FLAG_FG, FLAG_BG,
+ flag_strings[FL_C_FORMAT], maxx, maxx, 1, LEFT);
+ }
+ else if (flags & FL_FUZZY)
+ {
+ flags &= ~FL_FUZZY;
+ draw_string(10, 1, FLAG_FG, FLAG_BG,
+ flag_strings[FL_FUZZY], maxx-10, maxx-10, 1, LEFT);
+ }
+ }
+ draw_string(0, 2*maxy/3, MSGSTR_FG, MSGSTR_BG, entry->msgstr,
+ maxx, maxx, maxx/4, LEFT);
+ }
+ else
+ {
+ draw_string(0, maxy/3, MSGID_FG, MSGID_BG, empty_msgid,
+ maxx, maxx, maxx/4, LEFT);
+ draw_string(0, 2*maxy/3, MSGSTR_FG, MSGSTR_BG, empty_msgstr,
+ maxx, maxx, maxx/4, LEFT);
+ }
+}
+
+void
draw()
{
+ if (msgid_number > 0)
+ draw_entry(&entries[msgid_number-1]);
+ else
+ draw_entry(NULL);
+
if (show_help)
draw_help();
+
draw_status();
}
@@ -317,6 +399,8 @@ main(int argc, char** argv)
tb_init();
error[0] = 0;
+ msgid_count = LEN(entries);
+ msgid_number = msgid_count > 0 ? 1 : 0;
while (running)
{
tb_clear();
@@ -334,10 +418,10 @@ main(int argc, char** argv)
{
if (show_help)
show_help = 0;
- else if (*error)
+ else if (error[0])
error[0] = 0;
else
- strcpy(error, errors[ERR_EXITKEY]);
+ strcpy(error, errors[ERR_EXIT_KEY]);
}
else if (ev.key == TB_KEY_F1
|| ev.ch == 'H')
@@ -347,22 +431,39 @@ main(int argc, char** argv)
}
else if (ev.ch == 'q')
running = 0;
+ else if (ev.key == TB_KEY_HOME
+ || ev.ch == 'g')
+ {
+ error[0] = 0;
+ msgid_number = msgid_count ? 1 : 0;
+ }
else if (ev.key == TB_KEY_ARROW_UP
|| ev.ch == 'k')
{
- if (msgid_index == 0)
+ if (msgid_number < 2)
strcpy(error, errors[ERR_NO_PREV]);
else
- msgid_index--;
+ {
+ error[0] = 0;
+ msgid_number--;
+ }
}
else if (ev.key == TB_KEY_ARROW_DOWN
|| ev.ch == 'j')
{
- if (!msgid_count || msgid_index
- == msgid_count-1)
+ if (msgid_number == msgid_count)
strcpy(error, errors[ERR_NO_NEXT]);
else
- msgid_index++;
+ {
+ error[0] = 0;
+ msgid_number++;
+ }
+ }
+ else if (ev.key == TB_KEY_END
+ || ev.ch == 'G')
+ {
+ error[0] = 0;
+ msgid_number = msgid_count;
}
else
strcpy(error, errors[ERR_UNKNOWN_KEY]);