--- par-1.52.orig/debian/dirs +++ par-1.52/debian/dirs @@ -0,0 +1 @@ +usr/bin --- par-1.52.orig/debian/README.Debian-source +++ par-1.52/debian/README.Debian-source @@ -0,0 +1,19 @@ +Explanation for different file sizes and checksums +-------------------------------------------------- +for the upstream source and Debian source. +-------------------------------------------------- + +The upstream source for version 1.52 is +http://www.nicemice.net/par/Par152.tar.gz +which unpacks into a directory named Par152. + +The debian source for version 1.52 unpacks into a directory +par-1.52.orig. The contents of this directory are identical +the contents of Par152 obtained from the upstream sources. + +This re-packing of the upstream source was inadvertant and +will be corrected with the next upstream release. + +Kapil Hari Paranjape +Sun, 26 Aug 2007 21:15:56 +0530 +-- --- par-1.52.orig/debian/docs +++ par-1.52/debian/docs @@ -0,0 +1 @@ +par.doc --- par-1.52.orig/debian/compat +++ par-1.52/debian/compat @@ -0,0 +1 @@ +5 --- par-1.52.orig/debian/changelog +++ par-1.52/debian/changelog @@ -0,0 +1,123 @@ +par (1.52-3) unstable; urgency=low + + * debian/README.Debian: + - removed as it is about the i18n patch which is not yet ready. + * debian/README.Debian-source: + - added an explanation about the cosmetic differences between + the Debian tar.gz and upstream tar.gz + * debian/watch: + - added entry based on current upstream numbering. + * debian/rules: + - set DEB_INSTALL_DOCS_ALL to debian/README.Debian-source + + -- Kapil Hari Paranjape Mon, 27 Aug 2007 11:40:44 +0530 + +par (1.52-2) unstable; urgency=low + + [ Jérôme Pouiller (Jezz) ] + * debian/patches/add_Makefile: + - define _GNU_SOURCE_ to fix warnings + during compilation. + + [ Mohammed Adnène Trojette ] + * debian/patches/fix_man_spellings: + - replace preceed with precede. + Closes: #311229 --- really. Closes: #437895. + * debian/changelog: remove emacs settings + * debian/rules: switch to cdbs + * debian/control: added cdbs to Build-Depends. + + [ Kapil Hari Paranjape ] + * debian/control: + - added Mohammed Adnène Trojette and + Jérôme Pouiller to Uploaders. + - added quilt to Build-Depends. + - Standards-Version: 3.7.2. No changes required. + - changed maintainer e-mail address. + - removed space in "Home page:". + - added XS-Vcs-Svn field. + * debian/dirs: removed unused "/usr/sbin" entry. + * debian/rules: switch to quilt for patch management. + * debian/patches/catch_output_error: + - Clarified option E and I/O errors in par.1 + - Added some output error checking if E option is 1. + Closes: #214179. + * debian/copyright: filled in more details about copyright on + original source, patches and Debian changes. + + -- Kapil Hari Paranjape Fri, 24 Aug 2007 21:58:22 +0530 + +par (1.52-1) unstable; urgency=low + + * New Maintainer. + * Standards-Version: 3.6.2. No changes required. + * DH_COMPAT=4. Needed to replace use of dh_installmanpages + with dh_installman. Also fixed Build-Depends. + * Incorporated spelling corrections in the + man page. Closes: #311229. + + -- Kapil Hari Paranjape Mon, 27 Mar 2006 10:29:39 +0530 + +par (1.52-0.1) unstable; urgency=low + + * NMU + * new upstream version 1.52 (Closes: #143570) + * new URL in debian/copyright + * remove dh_testversion from debian/rules. + * install file releasenotes as upstream changelog. + * Standards-Version: 3.5.9 (Only changes to debian/rules with respect to + compile options required) + * make lintian happy, remove emacs settings from changelog + + -- Andreas Metzler Sun, 16 Mar 2003 16:58:06 +0100 + +par (1.51-1.1) unstable; urgency=low + + * Non-maintainer upload. + * Rebuild w/ new debhelper and no changes to finish + /usr/doc transition. Closes: #322794, #322814 + + -- Joey Hess Tue, 10 Jan 2006 01:14:30 -0500 + +par (1.51-1) unstable; urgency=low + + * new upstream release. more liberal license. closes: #90201 + * recompiled to match man & doc standards. closes: #91017, #91645 + + -- Craig Sanders Sat, 31 Mar 2001 12:35:39 +1000 + +par (1.50-4) unstable; urgency=low + + * recompiled for libc6 + + -- Craig Sanders Wed, 10 Sep 1997 08:29:22 +1000 + +par (1.50-3) unstable; urgency=low + + * added Section: text to debian/control + + -- Craig Sanders Sat, 22 Feb 1997 15:10:00 +1100 + +par (1.50-2) unstable; urgency=low + + * repackaged with debmake + + -- Craig Sanders Sat, 22 Feb 1997 13:16:50 +1100 + +par (1.50-1) unstable; urgency=low + + * New upstream release + + -- Craig Sanders Tue, 14 Jun 1996 00:00:00 +1100 + +par (1.41-2) unstable; urgency=low + + * recompiled as ELF + + -- Craig Sanders Tue, 18 Apr 1996 00:00:00 +1100 + +par (1.41-1) unstable; urgency=low + + * Initial Release + + -- Craig Sanders Tue, 26 Jan 1996 00:00:00 +1100 --- par-1.52.orig/debian/control +++ par-1.52/debian/control @@ -0,0 +1,25 @@ +Source: par +Section: text +Priority: optional +Maintainer: Kapil Hari Paranjape +Uploaders: Mohammed Adnène Trojette , Jérôme Pouiller (Jezz) +Build-Depends: debhelper (>= 5), cdbs (>= 0.4.23-1.1), quilt (>= 0.45-3) +XS-Vcs-Svn: svn://svn.debian.org/svn/collab-maint/deb-maint/par +Standards-Version: 3.7.2 + +Package: par +Architecture: any +Depends: ${shlibs:Depends} +Description: Paragraph reformatter + Greatly enhanced fmt type program by Adam M. Costello. + . + Can be used within vi or other editor to automatically reformat text + in a variety of ways. + . + Perfect for use with email & usenet messages as it correctly handles + multiple levels of quoting characters. + . + This version includes a patch allowing multi-byte and multi-width character + encodings. + . + Homepage: http://www.nicemice.net/par/ --- par-1.52.orig/debian/watch +++ par-1.52/debian/watch @@ -0,0 +1,5 @@ +# format version number, currently 3; this line is compulsory! +version=3 + +http://www.nicemice.net/par/Par(\d)(\d\d).tar.gz + --- par-1.52.orig/debian/rules +++ par-1.52/debian/rules @@ -0,0 +1,14 @@ +#!/usr/bin/make -f + +include /usr/share/cdbs/1/rules/debhelper.mk +include /usr/share/cdbs/1/class/makefile.mk +include /usr/share/cdbs/1/rules/patchsys-quilt.mk + +DEB_MAKE_CLEAN_TARGET := clean +DEB_MAKE_BUILD_TARGET := par par.doc +DEB_MAKE_INSTALL_TARGET := install DESTDIR=$(CURDIR)/debian/par/ +# no check for this software +DEB_MAKE_CHECK_TARGET := + +DEB_INSTALL_CHANGELOGS_ALL := releasenotes +DEB_INSTALL_DOCS_ALL := debian/README.Debian-source --- par-1.52.orig/debian/patches/add_Makefile +++ par-1.52/debian/patches/add_Makefile @@ -0,0 +1,25 @@ +# add a Makefile that sets up variables for +# the protoMakefile from upstream + +Index: par-1.52/Makefile +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ par-1.52/Makefile 2006-10-05 08:16:49.000000000 +0530 +@@ -0,0 +1,17 @@ ++#! /usr/bin/make ++ ++BIN=$(DESTDIR)/usr/bin ++DOC=$(DESTDIR)/usr/share/doc/par ++MAN=$(DESTDIR)/usr/share/man/man1 ++ ++include protoMakefile ++ ++CC = cc $(CFLAGS) -c -D_GNU_SOURCE ++ ++install: par par.doc ++ install -o root -g root -m 0755 par $(BIN)/par ++ install -d $(DOC) -o root -g root -m 0755 ++ install -o root -g root -m 0644 par.doc $(DOC) ++ install -d $(MAN) -o root -g root -m 0755 ++ install -o root -g root -m 0644 par.1 $(MAN) ++ --- par-1.52.orig/debian/patches/series +++ par-1.52/debian/patches/series @@ -0,0 +1,3 @@ +catch_output_errors +fix_man_spellings +add_Makefile --- par-1.52.orig/debian/patches/fix_man_spellings +++ par-1.52/debian/patches/fix_man_spellings @@ -0,0 +1,50 @@ +# This patch fixes spelling errors in the man pages +Index: par-1.52/par.1 +=================================================================== +--- par-1.52.orig/par.1 2006-10-13 07:37:39.000000000 +0530 ++++ par-1.52/par.1 2006-10-13 07:37:39.000000000 +0530 +@@ -220,7 +220,7 @@ + advance the divider over any immediately + following spaces. The comprelen of + .I S +-is the number of characters preceeding the divider. ++is the number of characters preceding the divider. + .IP comsuflen + Given a non-empty sequence + .I S +@@ -249,7 +249,7 @@ + .I body + is 1, place the divider just before the first + non-space non-body character, then back up +-the divider over one immediately preceeding ++the divider over one immediately preceding + space if there is one. The comsuflen of + .I S + is the number of characters following the divider. +@@ -853,7 +853,7 @@ + .IR Tab ) + spaces, where + .I n +-is the number of characters preceeding the ++is the number of characters preceding the + tab character on the line (evaluated after + earlier tab characters have been expanded). + .LP +@@ -917,7 +917,7 @@ + in the + .SM OPTIONS + section). The first word includes any +-spaces that preceed it on the same line. ++spaces that precede it on the same line. + .LP + Let + .I L +@@ -1135,7 +1135,7 @@ + .B par + will return + .BR \s-1EXIT_FAILURE\s0 . +-If the error is local to a single paragraph, the preceeding ++If the error is local to a single paragraph, the preceding + paragraphs will have been output before the error + was detected. Line numbers in error messages are + local to the IP in which the error occurred. All --- par-1.52.orig/debian/patches/add_wchar_include +++ par-1.52/debian/patches/add_wchar_include @@ -0,0 +1,12 @@ +Index: par-1.52/par.c +=================================================================== +--- par-1.52.orig/par.c 2007-08-24 07:19:50.000000000 +0530 ++++ par-1.52/par.c 2007-08-24 07:20:05.000000000 +0530 +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + + #undef NULL + #define NULL ((void *) 0) --- par-1.52.orig/debian/patches/01_i18n_support.diff +++ par-1.52/debian/patches/01_i18n_support.diff @@ -0,0 +1,1227 @@ +# This is the patch from Jérôme Pouiller +# that adds i18n support. +# Original patch was maintained by Jérôme +# as a sequence of patch branches to the upstream +# source. The release dates and explanations +# are as follows. +#Par 1.52-i18n.3 released 2006-Oct-03 +# Fix bug with option 'g' +# +#Par 1.52-i18n.2 released 2006-Aug-03 +# Fix bug debian #310495. (Bug with freeze) +# +#Par 1.52-i18n.1 released 2006-Jun-22 +# Changed char in wchar_t. Allow support of multibytes characters. +# Added support for double-width characters. + +Index: par-1.52/buffer.c +=================================================================== +--- par-1.52.orig/buffer.c 2006-10-13 07:32:10.000000000 +0530 ++++ par-1.52/buffer.c 2006-10-13 07:37:39.000000000 +0530 +@@ -18,6 +18,7 @@ + + #include + #include ++#include + + #undef NULL + #define NULL ((void *) 0) +@@ -60,7 +61,7 @@ + blk = malloc(sizeof (block)); + items = malloc(maxhere * itemsize); + if (!buf || !blk || !items) { +- strcpy(errmsg,outofmem); ++ wcscpy(errmsg,outofmem); + goto nberror; + } + +@@ -127,7 +128,7 @@ + new = malloc(sizeof (block)); + items = malloc(maxhere * itemsize); + if (!new || !items) { +- strcpy(errmsg,outofmem); ++ wcscpy(errmsg,outofmem); + goto aierror; + } + blk->next = new; +@@ -174,7 +175,7 @@ + + r = malloc(n * itemsize); + if (!r) { +- strcpy(errmsg,outofmem); ++ wcscpy(errmsg,outofmem); + return NULL; + } + +Index: par-1.52/charset.c +=================================================================== +--- par-1.52.orig/charset.c 2006-10-13 07:32:10.000000000 +0530 ++++ par-1.52/charset.c 2006-10-13 07:37:39.000000000 +0530 +@@ -22,6 +22,8 @@ + #include + #include + #include ++#include ++#include + + #undef NULL + #define NULL ((void *) 0) +@@ -39,8 +41,8 @@ + typedef unsigned char csflag_t; + + struct charset { +- char *inlist; /* Characters in inlist are in the set. */ +- char *outlist; /* Characters in outlist are not in the set. */ ++ wchar_t *inlist; /* Characters in inlist are in the set. */ ++ wchar_t *outlist; /* Characters in outlist are not in the set. */ + /* inlist and outlist must have no common characters. */ + /* inlist and outlist may be NULL, which acts like "". */ + csflag_t flags; /* Characters in neither list are in the set if they */ +@@ -56,25 +58,25 @@ + CS_NUL = 8; /* Includes the NUL character. */ + + +-static int appearsin(char c, const char *str) ++static int appearsin(wchar_t c, const wchar_t *str) + + /* Returns 0 if c is '\0' or str is NULL or c */ + /* does not appear in *str. Otherwise returns 1. */ + { +- return c && str && strchr(str,c); ++ return c && str && wcschr(str,c); + } + + +-static int hexdigtoint(char c) ++static int hexdigtoint(wchar_t c) + + /* Returns the value represented by the hexadecimal */ + /* digit c, or -1 if c is not a hexadecimal digit. */ + { +- const char *p, * const hexdigits = "0123456789ABCDEFabcdef"; ++ const wchar_t *p, * const hexdigits = L"0123456789ABCDEFabcdef"; + int n; + + if (!c) return -1; +- p = strchr(hexdigits, *(unsigned char *)&c); ++ p = wcschr(hexdigits, c); + if (!p) return -1; + n = p - hexdigits; + if (n >= 16) n -= 6; +@@ -91,35 +93,46 @@ + { + charset *cset = NULL; + buffer *cbuf = NULL; +- const char *p, * const singleescapes = "_sbqQx"; ++ const wchar_t *p, * const singleescapes = L"_sbqQx"; + int hex1, hex2; +- char ch; ++ wchar_t ch; ++ wchar_t *wstr; + ++ wstr = (wchar_t *) malloc((strlen(str) + 1) * sizeof(wchar_t)); ++ if (!wstr) { ++ wcscpy(errmsg,outofmem); ++ goto pcserror; ++ } ++ if ((size_t)(-1) == mbstowcs(wstr, str, strlen(str) + 1)) { ++ wcscpy(errmsg,mbserror); ++ goto pcserror; ++ } + cset = malloc(sizeof (charset)); + if (!cset) { +- strcpy(errmsg,outofmem); ++ wcscpy(errmsg,outofmem); + goto pcserror; + } + cset->inlist = cset->outlist = NULL; + cset->flags = 0; + +- cbuf = newbuffer(sizeof (char), errmsg); ++ cbuf = newbuffer(sizeof (wchar_t), errmsg); + if (*errmsg) goto pcserror; + +- for (p = str; *p; ++p) +- if (*p == '_') { ++ for (p = wstr; *p; ++p) ++ if (*p == L'_') { + ++p; + if (appearsin(*p, singleescapes)) { +- if (*p == '_') ch = '_' ; +- else if (*p == 's') ch = ' ' ; +- else if (*p == 'b') ch = '\\'; +- else if (*p == 'q') ch = '\''; +- else if (*p == 'Q') ch = '\"'; ++ if (*p == L'_') ch = L'_' ; ++ else if (*p == L's') ch = L' ' ; ++ else if (*p == L'b') ch = L'\\'; ++ else if (*p == L'q') ch = L'\''; ++ else if (*p == L'Q') ch = L'\"'; + else /* *p == 'x' */ { ++ /* FIXME _x metacharacter should allow wide characters input.*/ + hex1 = hexdigtoint(p[1]); + hex2 = hexdigtoint(p[2]); + if (hex1 < 0 || hex2 < 0) goto pcsbadstr; +- *(unsigned char *)&ch = 16 * hex1 + hex2; ++ ch = 16 * hex1 + hex2; + p += 2; + } + if (!ch) +@@ -130,14 +143,14 @@ + } + } + else { +- if (*p == 'A') cset->flags |= CS_UCASE; +- else if (*p == 'a') cset->flags |= CS_LCASE; +- else if (*p == '0') cset->flags |= CS_DIGIT; ++ if (*p == L'A') cset->flags |= CS_UCASE; ++ else if (*p == L'a') cset->flags |= CS_LCASE; ++ else if (*p == L'0') cset->flags |= CS_DIGIT; + else goto pcsbadstr; + } + } + else { +- additem(cbuf,p,errmsg); ++ additem(cbuf, p,errmsg); + if (*errmsg) goto pcserror; + } + ch = '\0'; +@@ -149,11 +162,12 @@ + pcscleanup: + + if (cbuf) freebuffer(cbuf); ++ if (wstr) free(wstr); + return cset; + + pcsbadstr: + +- sprintf(errmsg, "Bad charset syntax: %.*s\n", errmsg_size - 22, str); ++ swprintf(errmsg, errmsg_size, L"Bad charset syntax: %.*s\n", errmsg_size - 22, str); + + pcserror: + +@@ -171,14 +185,14 @@ + } + + +-int csmember(char c, const charset *cset) ++int csmember(wchar_t c, const charset *cset) + { + return + appearsin(c, cset->inlist) || + ( !appearsin(c, cset->outlist) && +- ( (cset->flags & CS_LCASE && islower(*(unsigned char *)&c)) || +- (cset->flags & CS_UCASE && isupper(*(unsigned char *)&c)) || +- (cset->flags & CS_DIGIT && isdigit(*(unsigned char *)&c)) || ++ ( (cset->flags & CS_LCASE && iswlower(*(wint_t *)&c)) || ++ (cset->flags & CS_UCASE && iswupper(*(wint_t *)&c)) || ++ (cset->flags & CS_DIGIT && iswdigit(*(wint_t *)&c)) || + (cset->flags & CS_NUL && !c ) ) ); + } + +@@ -191,16 +205,16 @@ + { + charset *csu; + buffer *inbuf = NULL, *outbuf = NULL; +- char *lists[4], **list, *p, nullchar = '\0'; ++ wchar_t *lists[4], **list, *p, nullchar = L'\0'; + + csu = malloc(sizeof (charset)); + if (!csu) { +- strcpy(errmsg,outofmem); ++ wcscpy(errmsg,outofmem); + goto csuderror; + } +- inbuf = newbuffer(sizeof (char), errmsg); ++ inbuf = newbuffer(sizeof (wchar_t), errmsg); + if (*errmsg) goto csuderror; +- outbuf = newbuffer(sizeof (char), errmsg); ++ outbuf = newbuffer(sizeof (wchar_t), errmsg); + if (*errmsg) goto csuderror; + csu->inlist = csu->outlist = NULL; + csu->flags = u ? cset1->flags | cset2->flags +Index: par-1.52/charset.h +=================================================================== +--- par-1.52.orig/charset.h 2006-10-13 07:32:10.000000000 +0530 ++++ par-1.52/charset.h 2006-10-13 07:37:39.000000000 +0530 +@@ -11,7 +11,7 @@ + /* Note: Those functions declared here which do not use errmsg */ + /* always succeed, provided that they are passed valid arguments. */ + +- ++#include + #include "errmsg.h" + + +@@ -30,7 +30,7 @@ + /* *cset. cset may not be used after this call. */ + + +-int csmember(char c, const charset *cset); ++int csmember(wchar_t c, const charset *cset); + + /* csmember(c,cset) returns 1 if c is a member of *cset, 0 otherwise. */ + +Index: par-1.52/errmsg.c +=================================================================== +--- par-1.52.orig/errmsg.c 2006-10-13 07:32:10.000000000 +0530 ++++ par-1.52/errmsg.c 2006-10-13 07:37:39.000000000 +0530 +@@ -11,8 +11,11 @@ + #include "errmsg.h" /* Makes sure we're consistent with the declarations. */ + + +-const char * const outofmem = +- "Out of memory.\n"; ++const wchar_t * const outofmem = ++ L"Out of memory.\n"; + +-const char * const impossibility = +- "Impossibility #%d has occurred. Please report it.\n"; ++const wchar_t * const mbserror = ++ L"Error in input multibyte string.\n"; ++ ++const wchar_t * const impossibility = ++ L"Impossibility #%d has occurred. Please report it.\n"; +Index: par-1.52/errmsg.h +=================================================================== +--- par-1.52.orig/errmsg.h 2006-10-13 07:32:10.000000000 +0530 ++++ par-1.52/errmsg.h 2006-10-13 07:37:39.000000000 +0530 +@@ -11,7 +11,7 @@ + #ifndef ERRMSG_H + #define ERRMSG_H + +- ++#include + #define errmsg_size 163 + + /* This is the maximum number of characters that will */ +@@ -20,7 +20,7 @@ + /* versions of this header file. */ + + +-typedef char errmsg_t[errmsg_size]; ++typedef wchar_t errmsg_t[errmsg_size]; + + /* Any function which takes the argument errmsg_t errmsg must, before */ + /* returning, either set errmsg[0] to '\0' (indicating success), or */ +@@ -28,10 +28,13 @@ + /* being careful not to overrun the space. */ + + +-extern const char * const outofmem; ++extern const wchar_t * const outofmem; + /* "Out of memory.\n" */ + +-extern const char * const impossibility; ++extern const wchar_t * const mbserror; ++ /* "Error in input multibyte string.\n" */ ++ ++extern const wchar_t * const impossibility; + /* "Impossibility #%d has occurred. Please report it.\n" */ + + +Index: par-1.52/par.c +=================================================================== +--- par-1.52.orig/par.c 2006-10-13 07:32:10.000000000 +0530 ++++ par-1.52/par.c 2006-10-13 07:38:20.000000000 +0530 +@@ -17,6 +17,7 @@ + #include + #include + #include ++#include + + #undef NULL + #define NULL ((void *) 0) +@@ -126,7 +127,7 @@ + /* line, or the fallback prelen and suflen */ + /* of the IP containing a non-bodiless line. */ + lflag_t flags; /* Boolean properties (see below). */ +- char rc; /* The repeated character of a bodiless line. */ ++ wchar_t rc; /* The repeated character of a bodiless line. */ + } lineprop; + + /* Flags for marking boolean properties: */ +@@ -277,12 +278,12 @@ + + badarg: + +- sprintf(errmsg, "Bad argument: %.*s\n", errmsg_size - 16, savearg); ++ swprintf(errmsg, errmsg_size,L"Bad argument: %.*s\n", errmsg_size - 16, savearg); + *phelp = 1; + } + + +-static char **readlines( ++static wchar_t **readlines( + lineprop **pprops, const charset *protectchars, + const charset *quotechars, int Tab, int invis, int quote, errmsg_t errmsg + ) +@@ -303,8 +304,10 @@ + { + buffer *cbuf = NULL, *lbuf = NULL, *lpbuf = NULL; + int c, empty, blank, firstline, qsonly, oldqsonly = 0, vlnlen, i; +- char ch, *ln = NULL, nullchar = '\0', *nullline = NULL, *qpend, +- *oldln = NULL, *oldqpend = NULL, *p, *op, *vln = NULL, **lines = NULL; ++ char ch, *ln = NULL, *qpend, *oldln = NULL, ++ *oldqpend = NULL, *p, *op; ++ wchar_t nullchar = L'\0'; ++ wchar_t *nullline = NULL, *vln = NULL, **lines = NULL; + lineprop vprop = { 0, 0, 0, '\0' }, iprop = { 0, 0, 0, '\0' }; + + /* oldqsonly, oldln, and oldquend don't really need to be initialized. */ +@@ -318,7 +321,7 @@ + + cbuf = newbuffer(sizeof (char), errmsg); + if (*errmsg) goto rlcleanup; +- lbuf = newbuffer(sizeof (char *), errmsg); ++ lbuf = newbuffer(sizeof (wchar_t *), errmsg); + if (*errmsg) goto rlcleanup; + lpbuf = newbuffer(sizeof (lineprop), errmsg); + if (*errmsg) goto rlcleanup; +@@ -339,7 +342,7 @@ + if (quote) { + for (qpend = ln; *qpend && csmember(*qpend, quotechars); ++qpend); + for (p = qpend; *p == ' ' || csmember(*p, quotechars); ++p); +- qsonly = *p == '\0'; ++ qsonly = (*p == '\0'); + while (qpend > ln && qpend[-1] == ' ') --qpend; + if (!firstline) { + for (p = ln, op = oldln; +@@ -358,13 +361,13 @@ + } + else { + vlnlen = p - ln; +- vln = malloc((vlnlen + 1) * sizeof (char)); ++ vln = malloc((vlnlen + 1) * sizeof (wchar_t)); + if (!vln) { +- strcpy(errmsg,outofmem); ++ wcscpy(errmsg,outofmem); + goto rlcleanup; + } +- strncpy(vln,ln,vlnlen); +- vln[vlnlen] = '\0'; ++ mbstowcs(vln,ln,vlnlen + 1); ++ vln[vlnlen] = L'\0'; + additem(lbuf, &vln, errmsg); + if (*errmsg) goto rlcleanup; + additem(lpbuf, invis ? &iprop : &vprop, errmsg); +@@ -373,13 +376,27 @@ + } + } + } ++ if (oldln != NULL) { ++ free(oldln); ++ oldln = NULL; ++ } + oldln = ln; + oldqpend = qpend; + oldqsonly = qsonly; + } +- additem(lbuf, &ln, errmsg); ++ vln = malloc((strlen(ln) + 1) * sizeof (wchar_t)); ++ if (!vln) { ++ wcscpy(errmsg, outofmem); ++ goto rlcleanup; ++ } ++ mbstowcs(vln,ln,strlen(ln) + 1); ++ if (oldln == NULL) { ++ free(ln); ++ ln = NULL; ++ } ++ additem(lbuf, &vln, errmsg); + if (*errmsg) goto rlcleanup; +- ln = NULL; ++ vln = NULL; + additem(lpbuf, &vprop, errmsg); + if (*errmsg) goto rlcleanup; + clearbuffer(cbuf); +@@ -403,10 +420,13 @@ + } + continue; + } +- if (isspace(c)) ch = ' '; +- else blank = 0; ++ if (isspace(c)) ++ ch = ' '; ++ else ++ blank = 0; + additem(cbuf, &ch, errmsg); +- if (*errmsg) goto rlcleanup; ++ if (*errmsg) ++ goto rlcleanup; + } + } + +@@ -415,9 +435,17 @@ + if (*errmsg) goto rlcleanup; + ln = copyitems(cbuf,errmsg); + if (*errmsg) goto rlcleanup; +- additem(lbuf, &ln, errmsg); +- if (*errmsg) goto rlcleanup; ++ vln = malloc((strlen(ln) + 1) * sizeof (wchar_t)); ++ if (!vln) { ++ wcscpy(errmsg, outofmem); ++ goto rlcleanup; ++ } ++ mbstowcs(vln,ln,strlen(ln) + 1); ++ free(ln); + ln = NULL; ++ additem(lbuf, &vln, errmsg); ++ if (*errmsg) goto rlcleanup; ++ vln = NULL; + additem(lpbuf, &vprop, errmsg); + if (*errmsg) goto rlcleanup; + } +@@ -449,7 +477,7 @@ + + + static void compresuflen( +- const char * const *lines, const char * const *endline, ++ const wchar_t * const *lines, const wchar_t * const *endline, + const charset *bodychars, int body, int pre, int suf, int *ppre, int *psuf + ) + /* lines is an array of strings, up to but not including endline. */ +@@ -457,7 +485,7 @@ + /* lines in lines. Assumes that they have already been determined */ + /* to be at least pre and suf. endline must not equal lines. */ + { +- const char *start, *end, *knownstart, * const *line, *p1, *p2, *knownend, ++ const wchar_t *start, *end, *knownstart, * const *line, *p1, *p2, *knownend, + *knownstart2; + + start = *lines; +@@ -474,7 +502,7 @@ + } + if (body) + for (p1 = end; p1 > knownstart; ) +- if (*--p1 != ' ') { ++ if (*--p1 != L' ') { + if (csmember(*p1, bodychars)) + end = p1; + else +@@ -501,18 +529,18 @@ + } + if (body) { + for (p1 = start; +- start < knownend && (*start == ' ' || csmember(*start, bodychars)); ++ start < knownend && (*start == L' ' || csmember(*start, bodychars)); + ++start); +- if (start > p1 && start[-1] == ' ') --start; ++ if (start > p1 && start[-1] == L' ') --start; + } + else +- while (end - start >= 2 && *start == ' ' && start[1] == ' ') ++start; ++ while (end - start >= 2 && *start == L' ' && start[1] == L' ') ++start; + *psuf = end - start; + } + + + static void delimit( +- const char * const *lines, const char * const *endline, ++ const wchar_t * const *lines, const wchar_t * const *endline, + const charset *bodychars, int repeat, int body, int div, + int pre, int suf, lineprop *props + ) +@@ -523,8 +551,8 @@ + /* and comsuflen of the lines in lines have already been */ + /* determined to be at least pre and suf, respectively. */ + { +- const char * const *line, *end, *p, * const *nextline; +- char rc; ++ const wchar_t * const *line, *end, *p, * const *nextline; ++ wchar_t rc; + lineprop *prop, *nextprop; + int anybodiless = 0, status; + +@@ -545,8 +573,8 @@ + for (end = *line; *end; ++end); + end -= suf; + p = *line + pre; +- rc = p < end ? *p : ' '; +- if (rc != ' ' && (!repeat || end - p < repeat)) ++ rc = p < end ? *p : L' '; ++ if (rc != L' ' && (!repeat || end - p < repeat)) + prop->flags &= ~L_BODILESS; + else + while (p < end) { +@@ -589,9 +617,9 @@ + } + + line = lines, prop = props; +- status = ((*lines)[pre] == ' '); ++ status = ((*lines)[pre] == L' '); + do { +- if (((*line)[pre] == ' ') == status) ++ if (((*line)[pre] == L' ') == status) + prop->flags |= L_FIRST; + ++line, ++prop; + } while (line < endline); +@@ -599,14 +627,14 @@ + + + static void marksuperf( +- const char * const * lines, const char * const * endline, lineprop *props ++ const wchar_t * const * lines, const wchar_t * const * endline, lineprop *props + ) + /* lines points to the first line of a segment, and endline to one */ + /* line beyond the last line in the segment. Sets L_SUPERF bits in */ + /* the flags fields of the props array whenever the corresponding */ + /* line is superfluous. L_BODILESS bits must already be set. */ + { +- const char * const *line, *p; ++ const wchar_t * const *line, *p; + lineprop *prop, *mprop, dummy; + int inbody, num, mnum; + +@@ -619,7 +647,7 @@ + for (line = lines, prop = props; line < endline; ++line, ++prop) + if (isvacant(prop)) { + for (num = 0, p = *line; *p; ++p) +- if (*p != ' ') ++num; ++ if (*p != L' ') ++num; + if (inbody || num < mnum) + mnum = num, mprop = prop; + inbody = 0; +@@ -631,7 +659,7 @@ + + + static void setaffixes( +- const char * const *inlines, const char * const *endline, ++ const wchar_t * const *inlines, const wchar_t * const *endline, + const lineprop *props, const charset *bodychars, + const charset *quotechars, int hang, int body, int quote, + int *pafp, int *pfs, int *pprefix, int *psuffix +@@ -644,7 +672,7 @@ + /* default value as specified in "par.doc". */ + { + int numin, pre, suf; +- const char *p; ++ const wchar_t *p; + + numin = endline - inlines; + +@@ -666,11 +694,11 @@ + } + + +-static void freelines(char **lines) ++static void freelines(wchar_t **lines) + /* Frees the elements of lines, and lines itself. */ + /* lines is a NULL-terminated array of strings. */ + { +- char **line; ++ wchar_t **line; + + for (line = lines; *line; ++line) + free(*line); +@@ -678,18 +706,21 @@ + free(lines); + } + +- + int main(int argc, const char * const *argv) + { + int help = 0, version = 0, hang = 0, prefix = -1, repeat = 0, suffix = -1, + Tab = 1, width = 72, body = 0, cap = 0, div = 0, Err = 0, expel = 0, + fit = 0, guess = 0, invis = 0, just = 0, last = 0, quote = 0, Report = 0, + touch = -1; +- int prefixbak, suffixbak, c, sawnonblank, oweblank, n, i, afp, fs; ++ int prefixbak, suffixbak, sawnonblank, oweblank, n, i, afp, fs; + charset *bodychars = NULL, *protectchars = NULL, *quotechars = NULL; +- char *parinit = NULL, *arg, **inlines = NULL, **endline, **firstline, *end, +- **nextline, **outlines = NULL, **line, ch; +- const char *env, * const whitechars = " \f\n\r\t\v"; ++ char ch; ++ wint_t c; ++ char *arg, *parinit = NULL; ++ wchar_t *end, **nextline, **inlines = NULL, **endline, **firstline, ++ **outlines = NULL, **line; ++ const char *env; ++ const char * const whitechars = " \f\n\r\t\v"; + errmsg_t errmsg = { '\0' }; + lineprop *props = NULL, *firstprop, *nextprop; + FILE *errout; +@@ -728,7 +759,7 @@ + if (env) { + parinit = malloc((strlen(env) + 1) * sizeof (char)); + if (!parinit) { +- strcpy(errmsg,outofmem); ++ wcscpy(errmsg,outofmem); + goto parcleanup; + } + strcpy(parinit,env); +@@ -756,7 +787,7 @@ + } + + if (Tab == 0) { +- strcpy(errmsg, " must not be 0.\n"); ++ wcscpy(errmsg, L" must not be 0.\n"); + goto parcleanup; + } + +@@ -764,8 +795,7 @@ + prefixbak = prefix; + suffixbak = suffix; + +-/* Main loop: */ +- ++ /* Main loop: */ + for (sawnonblank = oweblank = 0; ; ) { + for (;;) { + c = getchar(); +@@ -778,7 +808,7 @@ + if (csmember(ch, protectchars)) { + sawnonblank = 1; + if (oweblank) { +- puts(""); ++ fputwc('\n', stdout); + oweblank = 0; + } + while (ch != '\n') { +@@ -797,8 +827,7 @@ + inlines = + readlines(&props, protectchars, quotechars, Tab, invis, quote, errmsg); + if (*errmsg) goto parcleanup; +- +- for (endline = inlines; *endline; ++endline); ++ for (endline = inlines; *endline; ++endline) ; + if (endline == inlines) { + free(inlines); + inlines = NULL; +@@ -807,19 +836,20 @@ + + sawnonblank = 1; + if (oweblank) { +- puts(""); ++ fputwc('\n', stdout); + oweblank = 0; + } + +- delimit((const char * const *) inlines, +- (const char * const *) endline, ++ delimit((const wchar_t * const *) inlines, ++ (const wchar_t * const *) endline, + bodychars, repeat, body, div, 0, 0, props); + + if (expel) +- marksuperf((const char * const *) inlines, +- (const char * const *) endline, props); ++ marksuperf((const wchar_t * const *) inlines, ++ (const wchar_t * const *) endline, props); + + firstline = inlines, firstprop = props; ++ + do { + if (isbodiless(firstprop)) { + if (!isinvis(firstprop) && !(expel && issuperf(firstprop))) { +@@ -827,18 +857,18 @@ + if (!repeat || (firstprop->rc == ' ' && !firstprop->s)) { + while (end > *firstline && end[-1] == ' ') --end; + *end = '\0'; +- puts(*firstline); ++ fwprintf(stdout, L"%ls\n", *firstline); + } + else { + n = width - firstprop->p - firstprop->s; + if (n < 0) { +- sprintf(errmsg,impossibility,5); ++ swprintf(errmsg,errmsg_size,impossibility,5); + goto parcleanup; + } +- printf("%.*s", firstprop->p, *firstline); ++ fwprintf(stdout, L"%.*ls", firstprop->p, *firstline); + for (i = n; i; --i) +- putchar(*(unsigned char *)&firstprop->rc); +- puts(end - firstprop->s); ++ fputwc(firstprop->rc, stdout); ++ fwprintf(stdout, L"%ls\n", end - firstprop->s); + } + } + ++firstline, ++firstprop; +@@ -850,26 +880,24 @@ + ++nextline, ++nextprop); + + prefix = prefixbak, suffix = suffixbak; +- setaffixes((const char * const *) firstline, +- (const char * const *) nextline, firstprop, bodychars, ++ setaffixes((const wchar_t * const *) firstline, ++ (const wchar_t * const *) nextline, firstprop, bodychars, + quotechars, hang, body, quote, &afp, &fs, &prefix, &suffix); + if (width <= prefix + suffix) { +- sprintf(errmsg, +- " (%d) <= (%d) + (%d)\n", ++ swprintf(errmsg,errmsg_size, ++ L" (%d) <= (%d) + (%d)\n", + width, prefix, suffix); + goto parcleanup; + } + + outlines = +- reformat((const char * const *) firstline, +- (const char * const *) nextline, ++ reformat((const wchar_t * const *) firstline, ++ (const wchar_t * const *) nextline, + afp, fs, hang, prefix, suffix, width, cap, + fit, guess, just, last, Report, touch, errmsg); + if (*errmsg) goto parcleanup; +- + for (line = outlines; *line; ++line) +- puts(*line); +- ++ fwprintf(stdout, L"%ls\n", *line); + freelines(outlines); + outlines = NULL; + +@@ -894,8 +922,12 @@ + if (outlines) freelines(outlines); + + errout = Err ? stderr : stdout; +- if (*errmsg) fprintf(errout, "par error:\n%.*s", errmsg_size, errmsg); +- if (version) fputs("par 1.52\n",errout); ++ if (*errmsg) fwprintf(errout, L"par error:\n%.*ls", errmsg_size, errmsg); ++#ifdef NOWIDTH ++ if (version) fputws(L"par 1.52-i18n.3 (without wcwidth() support)\n",errout); ++#else ++ if (version) fputws(L"par 1.52-i18n.3\n",errout); ++#endif + if (help) fputs(usagemsg,errout); + + return *errmsg ? EXIT_FAILURE : EXIT_SUCCESS; +Index: par-1.52/reformat.c +=================================================================== +--- par-1.52.orig/reformat.c 2006-10-13 07:32:10.000000000 +0530 ++++ par-1.52/reformat.c 2006-10-13 07:37:39.000000000 +0530 +@@ -16,6 +16,7 @@ + #include + #include + #include ++#include + + #undef NULL + #define NULL ((void *) 0) +@@ -33,14 +34,15 @@ + typedef unsigned char wflag_t; + + typedef struct word { +- const char *chrs; /* Pointer to the characters in the word */ ++ const wchar_t *chrs; /* Pointer to the characters in the word */ + /* (NOT terminated by '\0'). */ + struct word *prev, /* Pointer to previous word. */ + *next, /* Pointer to next word. */ + /* Supposing this word were the first... */ + *nextline; /* Pointer to first word in next line. */ + int score, /* Value of the objective function. */ +- length; /* Length of this word. */ ++ length, /* Length (in widechar) of this word. */ ++ width; /* Visual width of this word. */ + wflag_t flags; /* Notable properties of this word. */ + } word; + +@@ -57,17 +59,36 @@ + #define iscurious(w) (((w)->flags & 2) != 0) + #define iscapital(w) (((w)->flags & 4) != 0) + ++static int getWidth(const wchar_t *beg, const wchar_t *end) ++/* Compute (visual) width of a word. This function is aware */ ++/* about double-width characters used in oriental langages. */ ++{ ++ int ret, tmp; ++ ++ for (ret = 0; beg != end; beg++) { ++#ifdef NOWIDTH ++ tmp = 1; ++#else ++ tmp = wcwidth(*beg); ++#endif ++ if (tmp < 0) ++ tmp = 0; ++ ret += tmp; ++ } ++ ++ return ret; ++} + + static int checkcapital(word *w) + /* Returns 1 if *w is capitalized according to the definition */ + /* in par.doc (assuming is 0), or 0 if not. */ + { +- const char *p, *end; ++ const wchar_t *p, *end; + + for (p = w->chrs, end = p + w->length; +- p < end && !isalnum(*(unsigned char *)p); ++ p < end && !iswalnum(*p); + ++p); +- return p < end && !islower(*(unsigned char *)p); ++ return p < end && !iswlower(*p); + } + + +@@ -75,19 +96,19 @@ + /* Returns 1 if *w is curious according to */ + /* the definition in par.doc, or 0 if not. */ + { +- const char *start, *p; +- char ch; ++ const wchar_t *start, *p; ++ wchar_t ch; + + for (start = w->chrs, p = start + w->length; p > start; --p) { + ch = p[-1]; +- if (isalnum(*(unsigned char *)&ch)) return 0; +- if (ch == '.' || ch == '?' || ch == '!' || ch == ':') break; ++ if (iswalnum(*(wchar_t *)&ch)) return 0; ++ if (ch == L'.' || ch == L'?' || ch == L'!' || ch == L':') break; + } + + if (p <= start + 1) return 0; + + --p; +- do if (isalnum(*(unsigned char *)--p)) return 1; ++ do if (iswalnum(*(wchar_t *)--p)) return 1; + while (p > start); + + return 0; +@@ -108,18 +129,18 @@ + + if (!head->next) return L; + +- for (w1 = tail, linelen = w1->length; ++ for (w1 = tail, linelen = w1->width; + w1 != head && linelen <= L; +- linelen += isshifted(w1), w1 = w1->prev, linelen += 1 + w1->length) { ++ linelen += isshifted(w1), w1 = w1->prev, linelen += 1 + w1->width) { + w1->score = last ? linelen : L; + w1->nextline = NULL; + } + + for ( ; w1 != head; w1 = w1->prev) { + w1->score = -1; +- for (linelen = w1->length, w2 = w1->next; ++ for (linelen = w1->width, w2 = w1->next; + linelen <= L; +- linelen += 1 + isshifted(w2) + w2->length, w2 = w2->next) { ++ linelen += 1 + isshifted(w2) + w2->width, w2 = w2->next) { + score = w2->score; + if (linelen < score) score = linelen; + if (score >= w1->score) { +@@ -168,7 +189,7 @@ + + shortest = simplebreaks(head,tail,target,last); + if (shortest < 0) { +- sprintf(errmsg,impossibility,1); ++ swprintf(errmsg,errmsg_size,impossibility,1); + return; + } + +@@ -178,9 +199,9 @@ + w1 = tail; + do { + w1->score = -1; +- for (linelen = w1->length, w2 = w1->next; ++ for (linelen = w1->width, w2 = w1->next; + linelen <= target; +- linelen += 1 + isshifted(w2) + w2->length, w2 = w2->next) { ++ linelen += 1 + isshifted(w2) + w2->width, w2 = w2->next) { + extra = target - linelen; + minlen = shortest; + if (w2) +@@ -202,7 +223,7 @@ + } while (w1 != head); + + if (head->next->score < 0) +- sprintf(errmsg,impossibility,2); ++ swprintf(errmsg,errmsg_size,impossibility,2); + } + + +@@ -225,9 +246,9 @@ + w1 = tail; + do { + w1->score = L; +- for (numgaps = 0, extra = L - w1->length, w2 = w1->next; ++ for (numgaps = 0, extra = L - w1->width, w2 = w1->next; + extra >= 0; +- ++numgaps, extra -= 1 + isshifted(w2) + w2->length, w2 = w2->next) { ++ ++numgaps, extra -= 1 + isshifted(w2) + w2->width, w2 = w2->next) { + gap = numgaps ? (extra + numgaps - 1) / numgaps : L; + if (w2) + score = w2->score; +@@ -247,7 +268,7 @@ + + maxgap = head->next->score; + if (maxgap >= L) { +- strcpy(errmsg, "Cannot justify.\n"); ++ wcscpy(errmsg, L"Cannot justify.\n"); + return; + } + +@@ -257,9 +278,9 @@ + w1 = tail; + do { + w1->score = -1; +- for (numgaps = 0, extra = L - w1->length, w2 = w1->next; ++ for (numgaps = 0, extra = L - w1->width, w2 = w1->next; + extra >= 0; +- ++numgaps, extra -= 1 + isshifted(w2) + w2->length, w2 = w2->next) { ++ ++numgaps, extra -= 1 + isshifted(w2) + w2->width, w2 = w2->next) { + gap = numgaps ? (extra + numgaps - 1) / numgaps : L; + if (w2) + score = w2->score; +@@ -288,40 +309,39 @@ + } while (w1 != head); + + if (head->next->score < 0) +- sprintf(errmsg,impossibility,3); ++ swprintf(errmsg,errmsg_size,impossibility,3); + } + + +-char **reformat( +- const char * const *inlines, const char * const *endline, int afp, int fs, ++wchar_t **reformat( ++ const wchar_t * const *inlines, const wchar_t * const *endline, int afp, int fs, + int hang, int prefix, int suffix, int width, int cap, int fit, int guess, + int just, int last, int Report, int touch, errmsg_t errmsg + ) + { + int numin, affix, L, onfirstword = 1, linelen, numout, numgaps, extra, phase; +- const char * const *line, **suffixes = NULL, **suf, *end, *p1, *p2; +- char *q1, *q2, **outlines = NULL; ++ const wchar_t * const *line, **suffixes = NULL, **suf, *end, *p1, *p2; ++ wchar_t *q1, *q2, **outlines = NULL; + word dummy, *head, *tail, *w1, *w2; + buffer *pbuf = NULL; + + /* Initialization: */ +- + *errmsg = '\0'; + dummy.next = dummy.prev = NULL; + dummy.flags = 0; + head = tail = &dummy; + numin = endline - inlines; + if (numin <= 0) { +- sprintf(errmsg,impossibility,4); ++ swprintf(errmsg,errmsg_size,impossibility,4); + goto rfcleanup; + } + numgaps = extra = 0; /* unnecessary, but quiets compiler warnings */ + + /* Allocate space for pointers to the suffixes: */ + +- suffixes = malloc(numin * sizeof (const char *)); ++ suffixes = malloc(numin * sizeof (const wchar_t *)); + if (!suffixes) { +- strcpy(errmsg,outofmem); ++ wcscpy(errmsg,outofmem); + goto rfcleanup; + } + +@@ -334,8 +354,8 @@ + do { + for (end = *line; *end; ++end); + if (end - *line < affix) { +- sprintf(errmsg, +- "Line %d shorter than + = %d + %d = %d\n", ++ swprintf(errmsg,errmsg_size, ++ L"Line %d shorter than + = %d + %d = %d\n", + line - inlines + 1, prefix, suffix, affix); + goto rfcleanup; + } +@@ -343,17 +363,17 @@ + *suf = end; + p1 = *line + prefix; + for (;;) { +- while (p1 < end && *p1 == ' ') ++p1; ++ while (p1 < end && *p1 == L' ') ++p1; + if (p1 == end) break; + p2 = p1; + if (onfirstword) { + p1 = *line + prefix; + onfirstword = 0; + } +- while (p2 < end && *p2 != ' ') ++p2; ++ while (p2 < end && *p2 != L' ') ++p2; + w1 = malloc(sizeof (word)); + if (!w1) { +- strcpy(errmsg,outofmem); ++ wcscpy(errmsg,outofmem); + goto rfcleanup; + } + w1->next = NULL; +@@ -361,6 +381,7 @@ + tail = tail->next = w1; + w1->chrs = p1; + w1->length = p2 - p1; ++ w1->width = getWidth(p1, p2); + w1->flags = 0; + p1 = p2; + } +@@ -377,6 +398,7 @@ + if (iscurious(w1)) { + if (w1->chrs[w1->length] && w1->chrs + w1->length + 1 == w2->chrs) { + w2->length += w1->length + 1; ++ w2->width += w1->width + 1; + w2->chrs = w1->chrs; + w2->prev = w1->prev; + w2->prev->next = w2; +@@ -397,20 +419,20 @@ + + if (Report) + for (w2 = head->next; w2; w2 = w2->next) { +- if (w2->length > L) { +- linelen = w2->length; ++ if (w2->width > L) { ++ linelen = w2->width; + if (linelen > errmsg_size - 17) + linelen = errmsg_size - 17; +- sprintf(errmsg, "Word too long: %.*s\n", linelen, w2->chrs); ++ swprintf(errmsg,errmsg_size, L"Word too long: %.*ls\n", linelen, w2->chrs); + goto rfcleanup; + } + } + else + for (w2 = head->next; w2; w2 = w2->next) +- while (w2->length > L) { ++ while (w2->width > L) { + w1 = malloc(sizeof (word)); + if (!w1) { +- strcpy(errmsg,outofmem); ++ wcscpy(errmsg,outofmem); + goto rfcleanup; + } + w1->next = w2; +@@ -420,7 +442,9 @@ + w1->chrs = w2->chrs; + w2->chrs += L; + w1->length = L; ++ w1->width = getWidth(w1->chrs, w1->chrs + L); + w2->length -= L; ++ w2->width -= w1->width; + w1->flags = 0; + if (iscapital(w2)) { + w1->flags |= W_CAPITAL; +@@ -444,9 +468,9 @@ + L = 0; + w1 = head->next; + while (w1) { +- for (linelen = w1->length, w2 = w1->next; ++ for (linelen = w1->width, w2 = w1->next; + w2 != w1->nextline; +- linelen += 1 + isshifted(w2) + w2->length, w2 = w2->next); ++ linelen += 1 + isshifted(w2) + w2->width, w2 = w2->next); + if (linelen > L) L = linelen; + w1 = w2; + } +@@ -454,67 +478,67 @@ + + /* Construct the lines: */ + +- pbuf = newbuffer(sizeof (char *), errmsg); ++ pbuf = newbuffer(sizeof (wchar_t *), errmsg); + if (*errmsg) goto rfcleanup; + + numout = 0; + w1 = head->next; + while (numout < hang || w1) { + if (w1) +- for (w2 = w1->next, numgaps = 0, extra = L - w1->length; ++ for (w2 = w1->next, numgaps = 0, extra = L - w1->width; + w2 != w1->nextline; +- ++numgaps, extra -= 1 + isshifted(w2) + w2->length, w2 = w2->next); ++ ++numgaps, extra -= 1 + isshifted(w2) + w2->width, w2 = w2->next); + linelen = suffix || (just && (w2 || last)) ? + L + affix : + w1 ? prefix + L - extra : prefix; +- q1 = malloc((linelen + 1) * sizeof (char)); ++ q1 = malloc((linelen + 1) * sizeof (wchar_t)); + if (!q1) { +- strcpy(errmsg,outofmem); ++ wcscpy(errmsg,outofmem); + goto rfcleanup; + } + additem(pbuf, &q1, errmsg); + if (*errmsg) goto rfcleanup; + ++numout; + q2 = q1 + prefix; +- if (numout <= numin) memcpy(q1, inlines[numout - 1], prefix); +- else if (numin > hang ) memcpy(q1, endline[-1], prefix); ++ if (numout <= numin) memcpy(q1, inlines[numout - 1], prefix * sizeof(wchar_t)); ++ else if (numin > hang ) memcpy(q1, endline[-1], prefix * sizeof(wchar_t)); + else { + if (afp > prefix) afp = prefix; +- memcpy(q1, endline[-1], afp); ++ memcpy(q1, endline[-1], afp * sizeof(wchar_t)); + q1 += afp; +- while (q1 < q2) *q1++ = ' '; ++ while (q1 < q2) *q1++ = L' '; + } + q1 = q2; + if (w1) { + phase = numgaps / 2; + for (w2 = w1; ; ) { +- memcpy(q1, w2->chrs, w2->length); ++ memcpy(q1, w2->chrs, w2->length * sizeof(wchar_t)); + q1 += w2->length; + w2 = w2->next; + if (w2 == w1->nextline) break; +- *q1++ = ' '; ++ *q1++ = L' '; + if (just && (w1->nextline || last)) { + phase += extra; + while (phase >= numgaps) { +- *q1++ = ' '; ++ *q1++ = L' '; + phase -= numgaps; + } + } +- if (isshifted(w2)) *q1++ = ' '; ++ if (isshifted(w2)) *q1++ = L' '; + } + } + q2 += linelen - affix; +- while (q1 < q2) *q1++ = ' '; ++ while (q1 < q2) *q1++ = L' '; + q2 = q1 + suffix; +- if (numout <= numin) memcpy(q1, suffixes[numout - 1], suffix); +- else if (numin > hang ) memcpy(q1, suffixes[numin - 1], suffix); ++ if (numout <= numin) memcpy(q1, suffixes[numout - 1], suffix * sizeof(wchar_t)); ++ else if (numin > hang ) memcpy(q1, suffixes[numin - 1], suffix * sizeof(wchar_t)); + else { + if (fs > suffix) fs = suffix; +- memcpy(q1, suffixes[numin - 1], fs); ++ memcpy(q1, suffixes[numin - 1], fs * sizeof(wchar_t)); + q1 += fs; +- while(q1 < q2) *q1++ = ' '; ++ while(q1 < q2) *q1++ = L' '; + } +- *q2 = '\0'; ++ *q2 = L'\0'; + if (w1) w1 = w1->nextline; + } + +@@ -543,5 +567,6 @@ + freebuffer(pbuf); + } + ++ + return outlines; + } +Index: par-1.52/reformat.h +=================================================================== +--- par-1.52.orig/reformat.h 2006-10-13 07:32:10.000000000 +0530 ++++ par-1.52/reformat.h 2006-10-13 07:37:39.000000000 +0530 +@@ -9,10 +9,10 @@ + + + #include "errmsg.h" ++#include + +- +-char **reformat( +- const char * const *inlines, const char * const *endline, int afp, int fs, ++wchar_t **reformat( ++ const wchar_t * const *inlines, const wchar_t * const *endline, int afp, int fs, + int hang, int prefix, int suffix, int width, int cap, int fit, int guess, + int just, int last, int Report, int touch, errmsg_t errmsg + ); --- par-1.52.orig/debian/patches/catch_output_errors +++ par-1.52/debian/patches/catch_output_errors @@ -0,0 +1,50 @@ +# This patch adds an output error check when +# the E option is set. +# This patch also modifies the man page to explain why +# the output error checking is not done when E is not set. + +Index: par-1.52/par.1 +=================================================================== +--- par-1.52.orig/par.1 2007-08-24 07:31:16.000000000 +0530 ++++ par-1.52/par.1 2007-08-24 07:51:14.000000000 +0530 +@@ -1144,10 +1144,14 @@ + or environment variable syntax are accompanied by + the same usage message that the help option produces. + .LP +-Of course, trying to print an error message would be ++Unless the option ++.BI E ++is set, trying to print an error message would be + futile if an error resulted from an output function, so + .B par +-doesn't bother doing any error checking on output functions. ++doesn't bother doing any error checking on output functions if ++.BI E ++is 0. + .SH EXAMPLES + .de VS + .RS -.5i +Index: par-1.52/par.c +=================================================================== +--- par-1.52.orig/par.c 2007-08-24 07:31:16.000000000 +0530 ++++ par-1.52/par.c 2007-08-24 07:49:06.000000000 +0530 +@@ -17,6 +17,7 @@ + #include + #include + #include ++#include + + #undef NULL + #define NULL ((void *) 0) +@@ -893,6 +894,11 @@ + if (props) free(props); + if (outlines) freelines(outlines); + ++ if (Err == 1) { ++ if ( fclose(stdout) == EOF ) ++ sprintf(errmsg,"%.*s\n",errmsg_size,strerror(errno)); ++ } ++ + errout = Err ? stderr : stdout; + if (*errmsg) fprintf(errout, "par error:\n%.*s", errmsg_size, errmsg); + if (version) fputs("par 1.52\n",errout); --- par-1.52.orig/debian/copyright +++ par-1.52/debian/copyright @@ -0,0 +1,49 @@ +This package was debianized by Craig Sanders cas@taz.net.au on +Sat, 31 Mar 2001 12:35:39 +1000. + +It is currently maintained by Kapil Hari Paranjape +, Mohammed Adnène Trojette +and Jérôme Pouiller (Jezz) . + +Upstream: + +It was downloaded from http://www.nicemice.net/par/ + +The Upstream author is Adam M. Costello . + +Patches: + +The i18n patch was provided by Jérôme Pouiller (Jezz) . + +The debian patches are distributed under the same license as that of +the rest of the source. (See below.) + +Copyright: + +Each file in the source carries a header of the following form (which +was taken from par.c): + + /* Copyright 2001 by */ + /* Adam M. Costello */ + +The file "par.doc" contains the copyright notice which reads as follows: + + The files listed in the Files List section above are each Copyright + 2000 by Adam M. Costello (henceforth "I", "me"). + + I grant everyone ("you") permission to do whatever you like with + these files, provided that if you modify them you take reasonable + steps to avoid confusing or misleading people about who wrote the + modified files (both you and I) or what version they are. All + official versions of Par will have version numbers consisting of + only digits and periods. + + I encourage you to send me copies of your modifications in case I + wish to incorporate them into future versions of Par. See the Bugs + section for my address. + + Though I have tried to make sure that Par is free of bugs, I make no + guarantees about its soundness. Therefore, I am not responsible for + any damage resulting from the use of these files. + +--- --- par-1.52.orig/debian/doc-base.package +++ par-1.52/debian/doc-base.package @@ -0,0 +1,9 @@ +Document: par +Title: Debian par Manual +Author: Adam M. Costello +Abstract: paragraph reformatter +Section: text + +Format: text +Files: /usr/share/doc/par/par.doc.gz +