[HarfBuzz] harfbuzz-ng: Branch 'master' - 2 commits
Behdad Esfahbod
behdad at kemper.freedesktop.org
Thu Sep 15 23:08:48 PDT 2011
util/options.cc | 101 ++++++++++++++++++++++++++++++++++++++---------------
util/options.hh | 36 +++++-------------
util/view-cairo.cc | 6 ++-
3 files changed, 89 insertions(+), 54 deletions(-)
New commits:
commit 55aeb0490454cc1ba93a42f307ed1230f59dee4b
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Fri Sep 16 02:08:36 2011 -0400
Fix reading text from stdin
diff --git a/util/options.cc b/util/options.cc
index ff596d0..582e437 100644
--- a/util/options.cc
+++ b/util/options.cc
@@ -509,40 +509,64 @@ font_options_t::get_font (void) const
const char *
text_options_t::get_line (unsigned int *len)
{
- if (!text) {
+ if (text) {
+ if (text_len == (unsigned int) -1)
+ text_len = strlen (text);
+
+ if (!text_len) {
+ *len = 0;
+ return NULL;
+ }
+
+ const char *ret = text;
+ const char *p = (const char *) memchr (text, '\n', text_len);
+ unsigned int ret_len;
+ if (!p) {
+ ret_len = text_len;
+ text += ret_len;
+ text_len = 0;
+ } else {
+ ret_len = p - ret;
+ text += ret_len + 1;
+ text_len -= ret_len + 1;
+ }
+
+ *len = ret_len;
+ return ret;
+ }
+
+ if (!fp) {
if (!text_file)
fail (TRUE, "At least one of text or text-file must be set");
- GMappedFile *mf = g_mapped_file_new (text_file, FALSE, NULL);
- if (!mf)
- fail (FALSE, "Failed opening text file `%s'", g_filename_display_name (text_file));
- text = g_mapped_file_get_contents (mf);
- text_len = g_mapped_file_get_length (mf);
- }
+ if (0 != strcmp (text_file, "-"))
+ fp = fopen (text_file, "r");
+ else
+ fp = stdin;
- if (text_len == (unsigned int) -1)
- text_len = strlen (text);
+ if (!fp)
+ fail (FALSE, "Failed opening text file `%s': %s",
+ text_file, strerror (errno));
- if (!text_len) {
- *len = 0;
- return NULL;
+ gs = g_string_new (NULL);
}
- const char *ret = text;
- const char *p = (const char *) memchr (text, '\n', text_len);
- unsigned int ret_len;
- if (!p) {
- ret_len = text_len;
- text += ret_len;
- text_len = 0;
- } else {
- ret_len = p - ret;
- text += ret_len + 1;
- text_len -= ret_len + 1;
+ g_string_set_size (gs, 0);
+ char buf[BUFSIZ];
+ while (fgets (buf, sizeof (buf), fp)) {
+ unsigned int bytes = strlen (buf);
+ if (buf[bytes - 1] == '\n') {
+ bytes--;
+ g_string_append_len (gs, buf, bytes);
+ break;
+ }
+ g_string_append_len (gs, buf, bytes);
}
-
- *len = ret_len;
- return ret;
+ if (ferror (fp))
+ fail (FALSE, "Failed reading text: %s",
+ strerror (errno));
+ *len = gs->len;
+ return !*len && feof (fp) ? NULL : gs->str;
}
diff --git a/util/options.hh b/util/options.hh
index c521e75..a101f7d 100644
--- a/util/options.hh
+++ b/util/options.hh
@@ -178,14 +178,17 @@ struct text_options_t : option_group_t
text = NULL;
text_file = NULL;
- file = NULL;
+ fp = NULL;
+ gs = NULL;
text_len = (unsigned int) -1;
add_options (parser);
}
~text_options_t (void) {
- if (file)
- g_mapped_file_unref (file);
+ if (gs)
+ g_string_free (gs, TRUE);
+ if (fp)
+ fclose (fp);
}
void add_options (option_parser_t *parser);
@@ -204,8 +207,9 @@ struct text_options_t : option_group_t
const char *text_file;
private:
- mutable GMappedFile *file;
- mutable unsigned int text_len;
+ FILE *fp;
+ GString *gs;
+ unsigned int text_len;
};
struct output_options_t : option_group_t
@@ -219,7 +223,7 @@ struct output_options_t : option_group_t
add_options (parser);
}
~output_options_t (void) {
- if (fp && fp != stdout)
+ if (fp)
fclose (fp);
}
diff --git a/util/view-cairo.cc b/util/view-cairo.cc
index daa202d..c639abd 100644
--- a/util/view-cairo.cc
+++ b/util/view-cairo.cc
@@ -96,7 +96,7 @@ view_cairo_t::consume_line (hb_buffer_t *buffer,
l.glyphs = cairo_glyph_allocate (l.num_glyphs + 1);
l.utf8 = g_strndup (text, text_len);
l.utf8_len = text_len;
- l.num_clusters = 1;
+ l.num_clusters = l.num_glyphs ? 1 : 0;
for (unsigned int i = 1; i < l.num_glyphs; i++)
if (hb_glyph[i].cluster != hb_glyph[i-1].cluster)
l.num_clusters++;
@@ -129,8 +129,9 @@ view_cairo_t::consume_line (hb_buffer_t *buffer,
memset ((void *) l.clusters, 0, l.num_clusters * sizeof (l.clusters[0]));
bool backward = HB_DIRECTION_IS_BACKWARD (hb_buffer_get_direction (buffer));
l.cluster_flags = backward ? CAIRO_TEXT_CLUSTER_FLAG_BACKWARD : (cairo_text_cluster_flags_t) 0;
- g_assert (l.num_glyphs);
unsigned int cluster = 0;
+ if (!l.num_glyphs)
+ goto done;
l.clusters[cluster].num_glyphs++;
if (backward) {
for (i = l.num_glyphs - 2; i >= 0; i--) {
@@ -154,6 +155,7 @@ view_cairo_t::consume_line (hb_buffer_t *buffer,
l.clusters[cluster].num_bytes += text_len - hb_glyph[i - 1].cluster;
}
+done:
g_array_append_val (lines, l);
}
commit a75c1b125159f6cfb6b652a9ec40803f7c7e3f71
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Fri Sep 16 01:16:41 2011 -0400
Move code around
diff --git a/util/options.cc b/util/options.cc
index 4e75827..ff596d0 100644
--- a/util/options.cc
+++ b/util/options.cc
@@ -121,9 +121,10 @@ option_parser_t::parse (int *argc, char ***argv)
GError *parse_error = NULL;
if (!g_option_context_parse (context, argc, argv, &parse_error))
{
- if (parse_error != NULL)
+ if (parse_error != NULL) {
fail (TRUE, "%s", parse_error->message);
- else
+ //g_error_free (parse_error);
+ } else
fail (TRUE, "Option parse error");
}
}
@@ -543,3 +544,25 @@ text_options_t::get_line (unsigned int *len)
*len = ret_len;
return ret;
}
+
+
+FILE *
+output_options_t::get_file_handle (void)
+{
+ if (fp)
+ return fp;
+
+ if (output_file)
+ fp = fopen (output_file, "wb");
+ else {
+#if HAVE_IO_H
+ _setmode (fileno (stdout), O_BINARY);
+#endif
+ fp = stdout;
+ }
+ if (!fp)
+ fail (FALSE, "Cannot open output file `%s': %s",
+ g_filename_display_name (output_file), strerror (errno));
+
+ return fp;
+}
diff --git a/util/options.hh b/util/options.hh
index 623e25a..c521e75 100644
--- a/util/options.hh
+++ b/util/options.hh
@@ -237,25 +237,7 @@ struct output_options_t : option_group_t
output_file = NULL; /* STDOUT */
}
- FILE *get_file_handle (void)
- {
- if (fp)
- return fp;
-
- if (output_file)
- fp = fopen (output_file, "wb");
- else {
-#if HAVE_IO_H
- _setmode (fileno (stdout), O_BINARY);
-#endif
- fp = stdout;
- }
- if (!fp)
- fail (FALSE, "Cannot open output file `%s': %s",
- g_filename_display_name (output_file), strerror (errno));
-
- return fp;
- }
+ FILE *get_file_handle (void);
virtual void init (const font_options_t *font_opts) = 0;
virtual void consume_line (hb_buffer_t *buffer,
More information about the HarfBuzz
mailing list