Changeset 7b4d90e


Ignore:
Timestamp:
Sep 25, 2009, 7:43:51 PM (12 years ago)
Author:
David Benjamin <davidben@mit.edu>
Branches:
master, release-1.4, release-1.5, release-1.6, release-1.7, release-1.8, release-1.9
Children:
dd6af02
Parents:
da60ba9
Message:
Handle missing newline in owl_fmtext_truncate_cols

Fixes #51. Also document some behavior of the function and add a test.

Signed-off-by: David Benjamin <davidben@mit.edu>
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • fmtext.c

    r89b2daf r7b4d90e  
    418418/* Truncate the message so that each line begins at column 'acol' and
    419419 * ends at 'bcol' or sooner.  The first column is number 0.  The new
    420  * message is placed in 'out'.  The message is * expected to end in a
    421  * new line for now. NOTE: This needs to be modified to deal with
    422  * backing up if we find a SPACING COMBINING MARK at the end of a
    423  * line. If that happens, we should back up to the last non-mark
    424  * character and stop there.
     420 * message is placed in 'out'.
     421 *
     422 * NOTE: This needs to be modified to deal with backing up if we find
     423 * a SPACING * COMBINING MARK at the end of a line. If that happens,
     424 * we should back up to * the last non-mark character and stop there.
     425 *
     426 * NOTE: If a line ends at bcol, we omit the newline. This is so printing
     427 * to ncurses works.
    425428 */
    426429void owl_fmtext_truncate_cols(const owl_fmtext *in, int acol, int bcol, owl_fmtext *out)
     
    439442    ptr_e=strchr(ptr_s, '\n');
    440443    if (!ptr_e) {
    441       /* but this shouldn't happen if we end in a \n */
    442       break;
     444      /* set it to the NULL at the end of the string, to handle a line that is
     445       * not newline-terminated */
     446      ptr_e = last+1;
    443447    }
    444448   
     
    495499      owl_fmtext_append_normal(out, "\n");
    496500    }
    497     ptr_s = g_utf8_next_char(ptr_e);
     501    /* Be careful if ptr_e is pointing to the NULL if we do not end with a
     502     * newline. We don't really need this check, but pointing ptr_s past the
     503     * NULL byte is just asking for problems later.
     504     */
     505    ptr_s = (ptr_e <= last) ? g_utf8_next_char(ptr_e) : ptr_e;
    498506  }
    499507}
  • tester.c

    re30ed92 r7b4d90e  
    1212int owl_filter_regtest(void);
    1313int owl_obarray_regtest(void);
     14int owl_fmtext_regtest(void);
    1415
    1516int main(int argc, char **argv, char **env)
     
    2930  numfailures += owl_filter_regtest();
    3031  numfailures += owl_obarray_regtest();
     32  numfailures += owl_fmtext_regtest();
    3133  if (numfailures) {
    3234      fprintf(stderr, "# *** WARNING: %d failures total\n", numfailures);
     
    306308  return numfailed;
    307309}
     310
     311
     312int owl_fmtext_regtest(void) {
     313  int numfailed = 0;
     314  char *p;
     315
     316  owl_fmtext fm1, fm2;
     317
     318  owl_fmtext_init_null(&fm1);
     319  owl_fmtext_init_null(&fm2);
     320
     321  printf("# BEGIN testing owl_fmtext\n");
     322
     323  /* Test truncate_cols:
     324   * - newline removal on long lines
     325   * - handle lines without trailing newlines
     326   * - don't kill short lines
     327   */
     328  owl_fmtext_append_normal(&fm1, "foo\n1234567890\n1234567890\nbaz");
     329  owl_fmtext_truncate_cols(&fm1, 1, 5, &fm2);
     330  p = owl_fmtext_print_plain(&fm2);
     331  FAIL_UNLESS("returned truncating columns worked properly", p && !strcmp(p, "oo\n2345623456az"));
     332  owl_free(p);
     333
     334  owl_fmtext_free(&fm1);
     335  owl_fmtext_free(&fm2);
     336
     337  printf("# END testing owl_fmtext (%d failures)\n", numfailed);
     338
     339  return numfailed;
     340}
Note: See TracChangeset for help on using the changeset viewer.