cptrimmed(charstring_t dest, char *str, int wid, char fill, size_t max) {
int remaining; /* remaining output width available */
int rjust;
+ struct charstring *trimmed;
size_t end; /* number of input bytes remaining in str */
#ifdef MULTIBYTE_SUPPORT
int char_len; /* bytes in current character */
}
if (remaining > (int) max) { remaining = max; }
+ trimmed = rjust ? charstring_create(remaining) : dest;
+
if ((sp = str)) {
#ifdef MULTIBYTE_SUPPORT
if (mbtowc(NULL, NULL, 0)) {} /* reset shift state */
sp++;
#endif
if (!prevCtrl) {
- charstring_push_back (dest, ' ');
+ charstring_push_back (trimmed, ' ');
remaining--;
}
#ifdef MULTIBYTE_SUPPORT
if (w >= 0 && remaining >= w) {
- charstring_push_back_chars (dest, altstr ? altstr : sp,
+ charstring_push_back_chars (trimmed, altstr ? altstr : sp,
char_len, w);
remaining -= w;
altstr = NULL;
}
sp += char_len;
#else
- charstring_push_back (dest, *sp++);
+ charstring_push_back (trimmed, *sp++);
remaining--;
#endif
}
}
- if (rjust) {
- if (remaining > 0) {
- /* copy string to the right */
- charstring_t copy = charstring_copy (dest);
-
- /* add padding at the beginning */
- charstring_clear (dest);
- for (; remaining > 0; --remaining) {
- charstring_push_back (dest, fill);
- }
-
- charstring_append (dest, copy);
+ while (remaining-- > 0) {
+ charstring_push_back(dest, fill);
+ }
- charstring_free (copy);
- }
- } else {
- /* pad remaining space */
- while (remaining-- > 0) {
- charstring_push_back (dest, fill);
- }
+ if (rjust) {
+ charstring_append(dest, trimmed);
+ charstring_free(trimmed);
}
}
setup_test
-actual=`run_prog ${MH_LIBEXEC_DIR}/ap -format "%-30(friendly{text})<<End of test" "No Such User <nosuch@user.com>"`
-expected=" No Such User<<End of test"
-##########123456789012345678901234567890
+for prefix in '' '>' '2>'; do
+ actual=`run_prog ${MH_LIBEXEC_DIR}/ap -format "$prefix%-20(friendly{text})<<End of test" 'No Such User <nosuch@user.com>'`
+ expected="$prefix No Such User<<End of test"
+ # 1 10 20
-if test x"$actual" != x"$expected"; then
- echo "$0: right justification test expected:" 1>&2
- echo " $expected" 1>&2
- echo "but instead got:" 1>&2
- echo " $actual" 1>&2
- failed=`expr ${failed:-0} + 1`
-fi
+ if test x"$actual" != x"$expected"; then
+ echo "$0: right justification test expected:" 1>&2
+ echo " $expected" 1>&2
+ echo "but instead got:" 1>&2
+ echo " $actual" 1>&2
+ failed=`expr ${failed:-0} + 1`
+ fi
+done
exit $failed