Compare commits

...

10 Commits

Author SHA1 Message Date
Markus Schramma d8a4ed71e2 add --timeout option 2025-09-28 08:05:41 +02:00
Dominic Radermacher e730c3b480 better help text for newline arg, rename build script 2025-08-11 15:09:36 +02:00
Dominic Radermacher d293e9427d coding style cosmetics 2025-08-11 09:57:02 +02:00
Michael Schulz 92c1e43f0c improved argv parser, enable printing of text starting with a dash 2025-08-11 09:49:18 +02:00
Dominic Radermacher 3bcde60eea update po files 2025-08-10 08:28:40 +02:00
Frost f1c34dd0d4 Send chain magic after precut
This lets you do chain mode with a precut first.
2025-08-10 08:23:56 +02:00
Frost f59e19349b Print without the default length margins
Brother's software may default to 0x0e, but that probably assumes you're making text labels and not printing images. For printing images you might want borderless (we certainly do), and for text labels you can always add the margins to the label before printing.

This commit uses 1px length margins instead of 0 to prevent some leftover black on the edges of the next print.
2025-08-10 08:22:39 +02:00
Dominic Radermacher ab80c721f6 fix compile warning 2025-08-10 07:23:11 +02:00
Dominic Radermacher d7d97eede8 fix gettext.cmake 2025-08-03 14:21:56 +02:00
Dominic Radermacher d1eeacbdd8 Added USB IDs for PT-E550W, but doesn't work yet (only prints empty tape) 2025-08-03 10:11:15 +02:00
11 changed files with 698 additions and 709 deletions

2
README
View File

@ -16,7 +16,7 @@ https://dominic.familie-radermacher.ch/projekte/ptouch-print/
Compile instructions:
./build.sh
./compile.sh
Note:

View File

@ -1,17 +1,15 @@
# Utilize gettext multilingual internationalization services
if(Gettext_FOUND)
add_custom_target(
pot-update
ALL
DEPENDS ${CMAKE_SOURCE_DIR}/po/ptouch.pot
)
add_dependencies(pot-update git-version)
# generate pot files using xgettext
find_program(GETTEXT_XGETTEXT_EXECUTABLE xgettext)
if(GETTEXT_XGETTEXT_EXECUTABLE)
add_custom_target(
pot-update
ALL
DEPENDS ${CMAKE_SOURCE_DIR}/po/ptouch.pot
)
file(GLOB_RECURSE C_FILES RELATIVE ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/src/*.c)
file(STRINGS ${CMAKE_BINARY_DIR}/version.h VERSION_LINE REGEX "VERSION")
string(REGEX MATCH "\".*\"$" PVERSION ${VERSION_LINE})
add_custom_command(
TARGET pot-update
PRE_BUILD
@ -20,40 +18,38 @@ if(Gettext_FOUND)
--keyword=N_
--force-po
--package-name=${PROJECT_NAME}
--package-version=${PVERSION}
--copyright-holder="Dominic Radermacher <dominic@familie-radermacher.ch>"
--msgid-bugs-address="dominic@familie-radermacher.ch"
--output ${CMAKE_SOURCE_DIR}/po/ptouch.pot
${C_FILES}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)
else()
message(DEBUG "Variable GETTEXT_XGETTEXT_EXECUTABLE not set")
endif()
# read available languages from LINGUAS file while ignoring comments
file(STRINGS po/LINGUAS LINGUAS REGEX "^[^#]")
# read available languages from LINGUAS file while ignoring comments
file(STRINGS po/LINGUAS LINGUAS REGEX "^[^#]")
# merge po files
if(GETTEXT_MSGMERGE_EXECUTABLE)
add_custom_target(
po-merge
ALL
DEPENDS ${CMAKE_SOURCE_DIR}/po/ptouch.pot
)
add_dependencies(po-merge pot-update)
foreach(LINGUA IN LISTS LINGUAS)
add_custom_command(
TARGET po-merge
PRE_BUILD
COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE}
--update
--quiet
${CMAKE_SOURCE_DIR}/po/${LINGUA}.po
${CMAKE_SOURCE_DIR}/po/ptouch.pot
# merge po files
find_program(GETTEXT_MSGMERGE_EXECUTABLE msgmerge)
if(GETTEXT_MSGMERGE_EXECUTABLE)
add_custom_target(
po-merge
ALL
DEPENDS ${CMAKE_SOURCE_DIR}/po/ptouch.pot
)
endforeach()
add_dependencies(po-merge pot-update)
foreach(LINGUA IN LISTS LINGUAS)
add_custom_command(
TARGET po-merge
PRE_BUILD
COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE}
--update
--quiet
${CMAKE_SOURCE_DIR}/po/${LINGUA}.po
${CMAKE_SOURCE_DIR}/po/ptouch.pot
)
endforeach()
endif()
endif()
# compile po files

View File

@ -1,288 +0,0 @@
/* Convenience header for conditional use of GNU <libintl.h>.
Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2011, 2015 Free
Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#ifndef _LIBGETTEXT_H
#define _LIBGETTEXT_H 1
/* NLS can be disabled through the configure --disable-nls option. */
#if ENABLE_NLS
/* Get declarations of GNU message catalog functions. */
# include <libintl.h>
/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by
the gettext() and ngettext() macros. This is an alternative to calling
textdomain(), and is useful for libraries. */
# ifdef DEFAULT_TEXT_DOMAIN
# undef gettext
# define gettext(Msgid) \
dgettext (DEFAULT_TEXT_DOMAIN, Msgid)
# undef ngettext
# define ngettext(Msgid1, Msgid2, N) \
dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N)
# endif
#else
/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
chokes if dcgettext is defined as a macro. So include it now, to make
later inclusions of <locale.h> a NOP. We don't include <libintl.h>
as well because people using "gettext.h" will not include <libintl.h>,
and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
is OK. */
#if defined(__sun)
# include <locale.h>
#endif
/* Many header files from the libstdc++ coming with g++ 3.3 or newer include
<libintl.h>, which chokes if dcgettext is defined as a macro. So include
it now, to make later inclusions of <libintl.h> a NOP. */
#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3)
# include <cstdlib>
# if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H
# include <libintl.h>
# endif
#endif
/* Disabled NLS.
The casts to 'const char *' serve the purpose of producing warnings
for invalid uses of the value returned from these functions.
On pre-ANSI systems without 'const', the config.h file is supposed to
contain "#define const". */
# undef gettext
# define gettext(Msgid) ((const char *) (Msgid))
# undef dgettext
# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid))
# undef dcgettext
# define dcgettext(Domainname, Msgid, Category) \
((void) (Category), dgettext (Domainname, Msgid))
# undef ngettext
# define ngettext(Msgid1, Msgid2, N) \
((N) == 1 \
? ((void) (Msgid2), (const char *) (Msgid1)) \
: ((void) (Msgid1), (const char *) (Msgid2)))
# undef dngettext
# define dngettext(Domainname, Msgid1, Msgid2, N) \
((void) (Domainname), ngettext (Msgid1, Msgid2, N))
# undef dcngettext
# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
((void) (Category), dngettext (Domainname, Msgid1, Msgid2, N))
# undef textdomain
# define textdomain(Domainname) ((const char *) (Domainname))
# undef bindtextdomain
# define bindtextdomain(Domainname, Dirname) \
((void) (Domainname), (const char *) (Dirname))
# undef bind_textdomain_codeset
# define bind_textdomain_codeset(Domainname, Codeset) \
((void) (Domainname), (const char *) (Codeset))
#endif
/* Prefer gnulib's setlocale override over libintl's setlocale override. */
#ifdef GNULIB_defined_setlocale
# undef setlocale
# define setlocale rpl_setlocale
#endif
/* A pseudo function call that serves as a marker for the automated
extraction of messages, but does not call gettext(). The run-time
translation is done at a different place in the code.
The argument, String, should be a literal string. Concatenated strings
and other string expressions won't work.
The macro's expansion is not parenthesized, so that it is suitable as
initializer for static 'char[]' or 'const char[]' variables. */
#define gettext_noop(String) String
/* The separator between msgctxt and msgid in a .mo file. */
#define GETTEXT_CONTEXT_GLUE "\004"
/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a
MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be
short and rarely need to change.
The letter 'p' stands for 'particular' or 'special'. */
#ifdef DEFAULT_TEXT_DOMAIN
# define pgettext(Msgctxt, Msgid) \
pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
#else
# define pgettext(Msgctxt, Msgid) \
pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
#endif
#define dpgettext(Domainname, Msgctxt, Msgid) \
pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \
pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category)
#ifdef DEFAULT_TEXT_DOMAIN
# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
#else
# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
#endif
#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \
npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category)
#ifdef __GNUC__
__inline
#else
#ifdef __cplusplus
inline
#endif
#endif
static const char *
pgettext_aux (const char *domain,
const char *msg_ctxt_id, const char *msgid,
int category)
{
const char *translation = dcgettext (domain, msg_ctxt_id, category);
if (translation == msg_ctxt_id)
return msgid;
else
return translation;
}
#ifdef __GNUC__
__inline
#else
#ifdef __cplusplus
inline
#endif
#endif
static const char *
npgettext_aux (const char *domain,
const char *msg_ctxt_id, const char *msgid,
const char *msgid_plural, unsigned long int n,
int category)
{
const char *translation =
dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
if (translation == msg_ctxt_id || translation == msgid_plural)
return (n == 1 ? msgid : msgid_plural);
else
return translation;
}
/* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID
can be arbitrary expressions. But for string literals these macros are
less efficient than those above. */
#include <string.h>
#if (((__GNUC__ >= 3 || __GNUG__ >= 2) && !defined __STRICT_ANSI__) \
/* || __STDC_VERSION__ >= 199901L */ )
# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 1
#else
# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 0
#endif
#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
#include <stdlib.h>
#endif
#define pgettext_expr(Msgctxt, Msgid) \
dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES)
#define dpgettext_expr(Domainname, Msgctxt, Msgid) \
dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES)
#ifdef __GNUC__
__inline
#else
#ifdef __cplusplus
inline
#endif
#endif
static const char *
dcpgettext_expr (const char *domain,
const char *msgctxt, const char *msgid,
int category)
{
size_t msgctxt_len = strlen (msgctxt) + 1;
size_t msgid_len = strlen (msgid) + 1;
const char *translation;
#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
char msg_ctxt_id[msgctxt_len + msgid_len];
#else
char buf[1024];
char *msg_ctxt_id =
(msgctxt_len + msgid_len <= sizeof (buf)
? buf
: (char *) malloc (msgctxt_len + msgid_len));
if (msg_ctxt_id != NULL)
#endif
{
memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
msg_ctxt_id[msgctxt_len - 1] = '\004';
memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
translation = dcgettext (domain, msg_ctxt_id, category);
#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
if (msg_ctxt_id != buf)
free (msg_ctxt_id);
#endif
if (translation != msg_ctxt_id)
return translation;
}
return msgid;
}
#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \
dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
#ifdef __GNUC__
__inline
#else
#ifdef __cplusplus
inline
#endif
#endif
static const char *
dcnpgettext_expr (const char *domain,
const char *msgctxt, const char *msgid,
const char *msgid_plural, unsigned long int n,
int category)
{
size_t msgctxt_len = strlen (msgctxt) + 1;
size_t msgid_len = strlen (msgid) + 1;
const char *translation;
#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
char msg_ctxt_id[msgctxt_len + msgid_len];
#else
char buf[1024];
char *msg_ctxt_id =
(msgctxt_len + msgid_len <= sizeof (buf)
? buf
: (char *) malloc (msgctxt_len + msgid_len));
if (msg_ctxt_id != NULL)
#endif
{
memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
msg_ctxt_id[msgctxt_len - 1] = '\004';
memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
if (msg_ctxt_id != buf)
free (msg_ctxt_id);
#endif
if (!(translation == msg_ctxt_id || translation == msgid_plural))
return translation;
}
return (n == 1 ? msgid : msgid_plural);
}
#endif /* _LIBGETTEXT_H */

View File

@ -106,7 +106,7 @@ size_t ptouch_get_max_width(ptouch_dev ptdev);
size_t ptouch_get_tape_width(ptouch_dev ptdev);
int ptouch_page_flags(ptouch_dev ptdev, uint8_t page_flags);
int ptouch_finalize(ptouch_dev ptdev, int chain);
int ptouch_getstatus(ptouch_dev ptdev);
int ptouch_getstatus(ptouch_dev ptdev, int timeout);
int ptouch_getmaxwidth(ptouch_dev ptdev);
int ptouch_send_d460bt_magic(ptouch_dev ptdev);
int ptouch_send_d460bt_chain(ptouch_dev ptdev);

168
po/de.po
View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ptouch-print 1.3.1\n"
"Report-Msgid-Bugs-To: dominic@familie-radermacher.ch\n"
"POT-Creation-Date: 2024-05-23 22:20-0400\n"
"POT-Creation-Date: 2025-09-28 08:03+0200\n"
"PO-Revision-Date: 2024-05-23 22:27-0400\n"
"Last-Translator: dominic@familie-radermacher.ch\n"
"Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
@ -19,217 +19,293 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.4.2\n"
#: src/libptouch.c:95 src/libptouch.c:99 src/libptouch.c:103
#: src/libptouch.c:105 src/libptouch.c:109 src/libptouch.c:113
#, c-format
msgid "out of memory\n"
msgstr "Nicht genug Speicher\n"
#: src/libptouch.c:107
#: src/libptouch.c:117
#, c-format
msgid "libusb_init() failed\n"
msgstr "ptouch_init() fehlgeschlagen\n"
#: src/libptouch.c:116
#: src/libptouch.c:126
#, c-format
msgid "failed to get device descriptor"
msgstr ""
#: src/libptouch.c:122
#: src/libptouch.c:132
#, c-format
msgid "%s found on USB bus %d, device %d\n"
msgstr "Drucker %s am USB Bus %d, Gerät %d gefunden\n"
#: src/libptouch.c:137
#: src/libptouch.c:147
#, c-format
msgid "libusb_open error :%s\n"
msgstr ""
#: src/libptouch.c:143
#: src/libptouch.c:153
#, c-format
msgid "error while detaching kernel driver: %s\n"
msgstr ""
#: src/libptouch.c:147
#: src/libptouch.c:157
#, c-format
msgid "interface claim error: %s\n"
msgstr ""
#: src/libptouch.c:158
#: src/libptouch.c:168
#, c-format
msgid ""
"No P-Touch printer found on USB (remember to put switch to position E)\n"
msgstr "Kein P-Ptouch Drucker am USB gefunden (Schalter muss auf E stehen)\n"
#: src/libptouch.c:178
#: src/libptouch.c:188
#, c-format
msgid "debug: called ptouch_send() with NULL ptdev\n"
msgstr ""
#: src/libptouch.c:195
#, c-format
msgid "write error: %s\n"
msgstr ""
#: src/libptouch.c:182
#: src/libptouch.c:199
#, fuzzy, c-format
msgid "write error: could send only %i of %ld bytes\n"
msgstr "Lesefehler: %i anstatt 32 bytes empfangen\n"
#: src/libptouch.c:302
#: src/libptouch.c:249
#, c-format
msgid "debug: called ptouch_info_cmd() with NULL ptdev\n"
msgstr ""
#: src/libptouch.c:291
#, fuzzy, c-format
msgid "debug: called ptouch_rasterstart() with NULL ptdev\n"
msgstr "ptouch_rasterstart() fehlgeschlagen\n"
#: src/libptouch.c:322
#, c-format
msgid "debug: called ptouch_finalize() with NULL ptdev\n"
msgstr ""
#: src/libptouch.c:337
#, c-format
msgid "debug: dumping raw status bytes\n"
msgstr ""
#: src/libptouch.c:326 src/libptouch.c:362
#: src/libptouch.c:356
#, c-format
msgid "debug: called ptouch_getstatus() with NULL ptdev\n"
msgstr ""
#: src/libptouch.c:366 src/libptouch.c:402
#, c-format
msgid "read error: %s\n"
msgstr ""
#: src/libptouch.c:331
#: src/libptouch.c:371
#, c-format
msgid "timeout while waiting for status response\n"
msgid "timeout (%i sec) while waiting for status response\n"
msgstr ""
#: src/libptouch.c:345
#: src/libptouch.c:385
#, c-format
msgid "unknown tape width of %imm, please report this.\n"
msgstr "Unbekannte Schriftband breite (%i mm), bitte melden\n"
#: src/libptouch.c:351
#: src/libptouch.c:391
#, c-format
msgid "got only 16 bytes... wondering what they are:\n"
msgstr "nur 16 bytes empfangen... mal gucken was die sind:\n"
#: src/libptouch.c:355
#: src/libptouch.c:395
#, c-format
msgid "read error: got %i instead of 32 bytes\n"
msgstr "Lesefehler: %i anstatt 32 bytes empfangen\n"
#: src/libptouch.c:358
#: src/libptouch.c:398
#, c-format
msgid "strange status:\n"
msgstr "Seltsamer Status:\n"
#: src/libptouch.c:360
#: src/libptouch.c:400
#, c-format
msgid "trying to flush junk\n"
msgstr ""
#: src/libptouch.c:365
#: src/libptouch.c:405
#, c-format
msgid "got another %i bytes. now try again\n"
msgstr "weitere %i bytes empfangen. probiere es nochmal.\n"
#: src/ptouch-print.c:82
#: src/libptouch.c:412
#, c-format
msgid "debug: called ptouch_get_tape_width() with NULL ptdev\n"
msgstr ""
#: src/libptouch.c:421
#, c-format
msgid "debug: called ptouch_get_max_width() with NULL ptdev\n"
msgstr ""
#: src/libptouch.c:433
#, c-format
msgid "debug: called ptouch_sendraster() with NULL ptdev\n"
msgstr ""
#: src/ptouch-print.c:146
#, c-format
msgid "nothing to print\n"
msgstr ""
#: src/ptouch-print.c:89
#: src/ptouch-print.c:154
#, c-format
msgid "image is too large (%ipx x %ipx)\n"
msgstr "Bild ist zu gross (%ipx x %ipx)\n"
#: src/ptouch-print.c:90 src/ptouch-print.c:556
#: src/ptouch-print.c:155
#, c-format
msgid "maximum printing width for this tape is %ipx\n"
msgstr "Maximal druckbare Breite für dieses Schriftband sind %ipx\n"
#: src/ptouch-print.c:104
#: src/ptouch-print.c:158
#, fuzzy, c-format
msgid "image size (%ipx x %ipx)\n"
msgstr "Bild ist zu gross (%ipx x %ipx)\n"
#: src/ptouch-print.c:168
#, c-format
msgid "ptouch_rasterstart() failed\n"
msgstr "ptouch_rasterstart() fehlgeschlagen\n"
#: src/ptouch-print.c:110
#: src/ptouch-print.c:174
#, c-format
msgid "send print information command\n"
msgstr ""
#: src/ptouch-print.c:116
#: src/ptouch-print.c:180
#, c-format
msgid "send PT-D460BT magic commands\n"
msgstr ""
#: src/ptouch-print.c:122
#: src/ptouch-print.c:186
#, c-format
msgid "send precut command\n"
msgstr ""
#: src/ptouch-print.c:133
#: src/ptouch-print.c:194
#, c-format
msgid "send PT-D460BT chain commands\n"
msgstr ""
#: src/ptouch-print.c:206
#, fuzzy, c-format
msgid "ptouch_sendraster() failed\n"
msgstr "ptouch_send() fehlgeschlagen\n"
#: src/ptouch-print.c:182
#: src/ptouch-print.c:255
#, c-format
msgid "writing image '%s' failed\n"
msgstr "Schreiben der Bilddatei '%s' fehlgeschlagen\n"
#: src/ptouch-print.c:206
#: src/ptouch-print.c:277
#, c-format
msgid "debug: o baseline offset - %d\n"
msgstr ""
#: src/ptouch-print.c:207
#: src/ptouch-print.c:278
#, c-format
msgid "debug: text baseline offset - %d\n"
msgstr ""
#: src/ptouch-print.c:266
#: src/ptouch-print.c:337
#, c-format
msgid "render_text(): %i lines, font = '%s'\n"
msgstr ""
#: src/ptouch-print.c:269
#: src/ptouch-print.c:340
#, c-format
msgid "warning: font config not available\n"
msgstr "Warnung: fontconfig ist nicht verfügbar\n"
#: src/ptouch-print.c:273
#: src/ptouch-print.c:344
#, c-format
msgid "setting font size=%i\n"
msgstr "setze Zeichensatzgrösse=%i\n"
#: src/ptouch-print.c:277
#: src/ptouch-print.c:348
#, c-format
msgid "could not estimate needed font size\n"
msgstr "Konnte die notwendige Zeichensatzgrösse nicht bestimmen\n"
#: src/ptouch-print.c:284
#: src/ptouch-print.c:355
#, c-format
msgid "choosing font size=%i\n"
msgstr "Wähle Zeichensatzgrösse %i\n"
#: src/ptouch-print.c:300 src/ptouch-print.c:328
#: src/ptouch-print.c:371 src/ptouch-print.c:399
#, c-format
msgid "error in gdImageStringFT: %s\n"
msgstr "Fehler in Funktion gdImageStringFT(): %s\n"
#: src/ptouch-print.c:495
#: src/ptouch-print.c:563
#, c-format
msgid "ptouch-print version %s by Dominic Radermacher\n"
msgstr "ptouch-print Version %s von Dominic Radermacher\n"
msgid "Only up to %d lines are supported"
msgstr ""
#: src/ptouch-print.c:526
#: src/ptouch-print.c:576
msgid "No arguments supported"
msgstr ""
#: src/ptouch-print.c:581
msgid "Option --writepng missing"
msgstr ""
#: src/ptouch-print.c:584
msgid "Options --force_tape_width and --info can't be used together"
msgstr ""
#: src/ptouch-print.c:615
#, c-format
msgid "ptouch_init() failed\n"
msgstr "ptouch_init() fehlgeschlagen\n"
#: src/ptouch-print.c:529
#: src/ptouch-print.c:618
#, c-format
msgid "ptouch_getstatus() failed\n"
msgstr "ptouch_getstatus() fehlgeschlagen\n"
#: src/ptouch-print.c:568
#: src/ptouch-print.c:632
#, fuzzy, c-format
msgid "maximum printing width for this printer is %ldpx\n"
msgstr "Maximal druckbare Breite für dieses Schriftband sind %ipx\n"
#: src/ptouch-print.c:633
#, fuzzy, c-format
msgid "maximum printing width for this tape is %ldpx\n"
msgstr "Maximal druckbare Breite für dieses Schriftband sind %ipx\n"
#: src/ptouch-print.c:658
#, c-format
msgid "failed to load image file\n"
msgstr ""
#: src/ptouch-print.c:584
#: src/ptouch-print.c:667
#, c-format
msgid "could not render text\n"
msgstr "Konnte Text nicht rendern\n"
#: src/ptouch-print.c:616
#: src/ptouch-print.c:706
#, c-format
msgid "ptouch_finalize(%d) failed\n"
msgstr "ptouch_finalize(%d) fehlgeschlagen\n"
#, c-format
#~ msgid "ptouch-print version %s by Dominic Radermacher\n"
#~ msgstr "ptouch-print Version %s von Dominic Radermacher\n"
#, c-format
#~ msgid "Error 1 = %02x\n"
#~ msgstr "Fehlerbyte1 = %02x\n"

170
po/en.po
View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ptouch-print 1.3.1\n"
"Report-Msgid-Bugs-To: dominic@familie-radermacher.ch\n"
"POT-Creation-Date: 2024-05-23 22:20-0400\n"
"POT-Creation-Date: 2025-09-28 08:03+0200\n"
"PO-Revision-Date: 2024-05-23 22:26-0400\n"
"Last-Translator: dominic@familie-radermacher.ch\n"
"Language-Team: English <en@translate.freefriends.org>\n"
@ -18,218 +18,294 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.4.2\n"
#: src/libptouch.c:95 src/libptouch.c:99 src/libptouch.c:103
#: src/libptouch.c:105 src/libptouch.c:109 src/libptouch.c:113
#, c-format
msgid "out of memory\n"
msgstr "out of memory\n"
#: src/libptouch.c:107
#: src/libptouch.c:117
#, c-format
msgid "libusb_init() failed\n"
msgstr "libusb_init() failed\n"
#: src/libptouch.c:116
#: src/libptouch.c:126
#, c-format
msgid "failed to get device descriptor"
msgstr "failed to get device descriptor"
#: src/libptouch.c:122
#: src/libptouch.c:132
#, c-format
msgid "%s found on USB bus %d, device %d\n"
msgstr "%s found on USB bus %d, device %d\n"
#: src/libptouch.c:137
#: src/libptouch.c:147
#, c-format
msgid "libusb_open error :%s\n"
msgstr "libusb_open error :%s\n"
#: src/libptouch.c:143
#: src/libptouch.c:153
#, c-format
msgid "error while detaching kernel driver: %s\n"
msgstr "error while detaching kernel driver: %s\n"
#: src/libptouch.c:147
#: src/libptouch.c:157
#, c-format
msgid "interface claim error: %s\n"
msgstr "interface claim error: %s\n"
#: src/libptouch.c:158
#: src/libptouch.c:168
#, c-format
msgid ""
"No P-Touch printer found on USB (remember to put switch to position E)\n"
msgstr ""
"No P-Touch printer found on USB (remember to put switch to position E)\n"
#: src/libptouch.c:178
#: src/libptouch.c:188
#, c-format
msgid "debug: called ptouch_send() with NULL ptdev\n"
msgstr ""
#: src/libptouch.c:195
#, c-format
msgid "write error: %s\n"
msgstr "write error: %s\n"
#: src/libptouch.c:182
#: src/libptouch.c:199
#, fuzzy, c-format
msgid "write error: could send only %i of %ld bytes\n"
msgstr "write error: could send only %i of %i bytes\n"
#: src/libptouch.c:302
#: src/libptouch.c:249
#, c-format
msgid "debug: called ptouch_info_cmd() with NULL ptdev\n"
msgstr ""
#: src/libptouch.c:291
#, fuzzy, c-format
msgid "debug: called ptouch_rasterstart() with NULL ptdev\n"
msgstr "ptouch_rasterstart() failed\n"
#: src/libptouch.c:322
#, c-format
msgid "debug: called ptouch_finalize() with NULL ptdev\n"
msgstr ""
#: src/libptouch.c:337
#, c-format
msgid "debug: dumping raw status bytes\n"
msgstr "debug: dumping raw status bytes\n"
#: src/libptouch.c:326 src/libptouch.c:362
#: src/libptouch.c:356
#, c-format
msgid "debug: called ptouch_getstatus() with NULL ptdev\n"
msgstr ""
#: src/libptouch.c:366 src/libptouch.c:402
#, c-format
msgid "read error: %s\n"
msgstr "read error: %s\n"
#: src/libptouch.c:331
#, c-format
msgid "timeout while waiting for status response\n"
#: src/libptouch.c:371
#, fuzzy, c-format
msgid "timeout (%i sec) while waiting for status response\n"
msgstr "timeout while waiting for status response\n"
#: src/libptouch.c:345
#: src/libptouch.c:385
#, c-format
msgid "unknown tape width of %imm, please report this.\n"
msgstr "unknown tape width of %imm, please report this.\n"
#: src/libptouch.c:351
#: src/libptouch.c:391
#, c-format
msgid "got only 16 bytes... wondering what they are:\n"
msgstr "got only 16 bytes... wondering what they are:\n"
#: src/libptouch.c:355
#: src/libptouch.c:395
#, c-format
msgid "read error: got %i instead of 32 bytes\n"
msgstr "read error: got %i instead of 32 bytes\n"
#: src/libptouch.c:358
#: src/libptouch.c:398
#, c-format
msgid "strange status:\n"
msgstr "strange status:\n"
#: src/libptouch.c:360
#: src/libptouch.c:400
#, c-format
msgid "trying to flush junk\n"
msgstr "trying to flush junk\n"
#: src/libptouch.c:365
#: src/libptouch.c:405
#, c-format
msgid "got another %i bytes. now try again\n"
msgstr "got another %i bytes. now try again\n"
#: src/ptouch-print.c:82
#: src/libptouch.c:412
#, c-format
msgid "debug: called ptouch_get_tape_width() with NULL ptdev\n"
msgstr ""
#: src/libptouch.c:421
#, c-format
msgid "debug: called ptouch_get_max_width() with NULL ptdev\n"
msgstr ""
#: src/libptouch.c:433
#, c-format
msgid "debug: called ptouch_sendraster() with NULL ptdev\n"
msgstr ""
#: src/ptouch-print.c:146
#, c-format
msgid "nothing to print\n"
msgstr ""
#: src/ptouch-print.c:89
#: src/ptouch-print.c:154
#, c-format
msgid "image is too large (%ipx x %ipx)\n"
msgstr "image is too large (%ipx x %ipx)\n"
#: src/ptouch-print.c:90 src/ptouch-print.c:556
#: src/ptouch-print.c:155
#, c-format
msgid "maximum printing width for this tape is %ipx\n"
msgstr "maximum printing width for this tape is %ipx\n"
#: src/ptouch-print.c:104
#: src/ptouch-print.c:158
#, fuzzy, c-format
msgid "image size (%ipx x %ipx)\n"
msgstr "image is too large (%ipx x %ipx)\n"
#: src/ptouch-print.c:168
#, c-format
msgid "ptouch_rasterstart() failed\n"
msgstr "ptouch_rasterstart() failed\n"
#: src/ptouch-print.c:110
#: src/ptouch-print.c:174
#, c-format
msgid "send print information command\n"
msgstr ""
#: src/ptouch-print.c:116
#: src/ptouch-print.c:180
#, c-format
msgid "send PT-D460BT magic commands\n"
msgstr ""
#: src/ptouch-print.c:122
#: src/ptouch-print.c:186
#, c-format
msgid "send precut command\n"
msgstr ""
#: src/ptouch-print.c:133
#: src/ptouch-print.c:194
#, c-format
msgid "send PT-D460BT chain commands\n"
msgstr ""
#: src/ptouch-print.c:206
#, c-format
msgid "ptouch_sendraster() failed\n"
msgstr "ptouch_sendraster() failed\n"
#: src/ptouch-print.c:182
#: src/ptouch-print.c:255
#, c-format
msgid "writing image '%s' failed\n"
msgstr "writing image '%s' failed\n"
#: src/ptouch-print.c:206
#: src/ptouch-print.c:277
#, c-format
msgid "debug: o baseline offset - %d\n"
msgstr ""
#: src/ptouch-print.c:207
#: src/ptouch-print.c:278
#, c-format
msgid "debug: text baseline offset - %d\n"
msgstr ""
#: src/ptouch-print.c:266
#: src/ptouch-print.c:337
#, c-format
msgid "render_text(): %i lines, font = '%s'\n"
msgstr ""
#: src/ptouch-print.c:269
#: src/ptouch-print.c:340
#, c-format
msgid "warning: font config not available\n"
msgstr "warning: font config not available\n"
#: src/ptouch-print.c:273
#: src/ptouch-print.c:344
#, c-format
msgid "setting font size=%i\n"
msgstr "setting font size=%i\n"
#: src/ptouch-print.c:277
#: src/ptouch-print.c:348
#, c-format
msgid "could not estimate needed font size\n"
msgstr "could not estimate needed font size\n"
#: src/ptouch-print.c:284
#: src/ptouch-print.c:355
#, c-format
msgid "choosing font size=%i\n"
msgstr "choosing font size=%i\n"
#: src/ptouch-print.c:300 src/ptouch-print.c:328
#: src/ptouch-print.c:371 src/ptouch-print.c:399
#, c-format
msgid "error in gdImageStringFT: %s\n"
msgstr "error in gdImageStringFT: %s\n"
#: src/ptouch-print.c:495
#: src/ptouch-print.c:563
#, c-format
msgid "ptouch-print version %s by Dominic Radermacher\n"
msgstr "ptouch-print version %s by Dominic Radermacher\n"
msgid "Only up to %d lines are supported"
msgstr ""
#: src/ptouch-print.c:526
#: src/ptouch-print.c:576
msgid "No arguments supported"
msgstr ""
#: src/ptouch-print.c:581
msgid "Option --writepng missing"
msgstr ""
#: src/ptouch-print.c:584
msgid "Options --force_tape_width and --info can't be used together"
msgstr ""
#: src/ptouch-print.c:615
#, c-format
msgid "ptouch_init() failed\n"
msgstr "ptouch_init() failed\n"
#: src/ptouch-print.c:529
#: src/ptouch-print.c:618
#, c-format
msgid "ptouch_getstatus() failed\n"
msgstr "ptouch_getstatus() failed\n"
#: src/ptouch-print.c:568
#: src/ptouch-print.c:632
#, fuzzy, c-format
msgid "maximum printing width for this printer is %ldpx\n"
msgstr "maximum printing width for this tape is %ipx\n"
#: src/ptouch-print.c:633
#, fuzzy, c-format
msgid "maximum printing width for this tape is %ldpx\n"
msgstr "maximum printing width for this tape is %ipx\n"
#: src/ptouch-print.c:658
#, c-format
msgid "failed to load image file\n"
msgstr ""
#: src/ptouch-print.c:584
#: src/ptouch-print.c:667
#, c-format
msgid "could not render text\n"
msgstr "could not render text\n"
#: src/ptouch-print.c:616
#: src/ptouch-print.c:706
#, c-format
msgid "ptouch_finalize(%d) failed\n"
msgstr "ptouch_finalize(%d) failed\n"
#, c-format
#~ msgid "ptouch-print version %s by Dominic Radermacher\n"
#~ msgstr "ptouch-print version %s by Dominic Radermacher\n"
#, c-format
#~ msgid "Error 1 = %02x\n"
#~ msgstr "Error 1 = %02x\n"

View File

@ -1,14 +1,14 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Free Software Foundation, Inc.
# This file is distributed under the same license as the ptouch package.
# Copyright (C) YEAR Dominic\ Radermacher\ <dominic@familie-radermacher.ch>
# This file is distributed under the same license as the ptouch-print package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: ptouch 1.3.3\n"
"Project-Id-Version: ptouch-print\n"
"Report-Msgid-Bugs-To: dominic@familie-radermacher.ch\n"
"POT-Creation-Date: 2024-05-23 22:20-0400\n"
"POT-Creation-Date: 2025-09-28 08:03+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,213 +17,285 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: src/libptouch.c:95 src/libptouch.c:99 src/libptouch.c:103
#: src/libptouch.c:105 src/libptouch.c:109 src/libptouch.c:113
#, c-format
msgid "out of memory\n"
msgstr ""
#: src/libptouch.c:107
#: src/libptouch.c:117
#, c-format
msgid "libusb_init() failed\n"
msgstr ""
#: src/libptouch.c:116
#: src/libptouch.c:126
#, c-format
msgid "failed to get device descriptor"
msgstr ""
#: src/libptouch.c:122
#: src/libptouch.c:132
#, c-format
msgid "%s found on USB bus %d, device %d\n"
msgstr ""
#: src/libptouch.c:137
#: src/libptouch.c:147
#, c-format
msgid "libusb_open error :%s\n"
msgstr ""
#: src/libptouch.c:143
#: src/libptouch.c:153
#, c-format
msgid "error while detaching kernel driver: %s\n"
msgstr ""
#: src/libptouch.c:147
#: src/libptouch.c:157
#, c-format
msgid "interface claim error: %s\n"
msgstr ""
#: src/libptouch.c:158
#: src/libptouch.c:168
#, c-format
msgid ""
"No P-Touch printer found on USB (remember to put switch to position E)\n"
msgstr ""
#: src/libptouch.c:178
#: src/libptouch.c:188
#, c-format
msgid "debug: called ptouch_send() with NULL ptdev\n"
msgstr ""
#: src/libptouch.c:195
#, c-format
msgid "write error: %s\n"
msgstr ""
#: src/libptouch.c:182
#: src/libptouch.c:199
#, c-format
msgid "write error: could send only %i of %ld bytes\n"
msgstr ""
#: src/libptouch.c:302
#: src/libptouch.c:249
#, c-format
msgid "debug: called ptouch_info_cmd() with NULL ptdev\n"
msgstr ""
#: src/libptouch.c:291
#, c-format
msgid "debug: called ptouch_rasterstart() with NULL ptdev\n"
msgstr ""
#: src/libptouch.c:322
#, c-format
msgid "debug: called ptouch_finalize() with NULL ptdev\n"
msgstr ""
#: src/libptouch.c:337
#, c-format
msgid "debug: dumping raw status bytes\n"
msgstr ""
#: src/libptouch.c:326 src/libptouch.c:362
#: src/libptouch.c:356
#, c-format
msgid "debug: called ptouch_getstatus() with NULL ptdev\n"
msgstr ""
#: src/libptouch.c:366 src/libptouch.c:402
#, c-format
msgid "read error: %s\n"
msgstr ""
#: src/libptouch.c:331
#: src/libptouch.c:371
#, c-format
msgid "timeout while waiting for status response\n"
msgid "timeout (%i sec) while waiting for status response\n"
msgstr ""
#: src/libptouch.c:345
#: src/libptouch.c:385
#, c-format
msgid "unknown tape width of %imm, please report this.\n"
msgstr ""
#: src/libptouch.c:351
#: src/libptouch.c:391
#, c-format
msgid "got only 16 bytes... wondering what they are:\n"
msgstr ""
#: src/libptouch.c:355
#: src/libptouch.c:395
#, c-format
msgid "read error: got %i instead of 32 bytes\n"
msgstr ""
#: src/libptouch.c:358
#: src/libptouch.c:398
#, c-format
msgid "strange status:\n"
msgstr ""
#: src/libptouch.c:360
#: src/libptouch.c:400
#, c-format
msgid "trying to flush junk\n"
msgstr ""
#: src/libptouch.c:365
#: src/libptouch.c:405
#, c-format
msgid "got another %i bytes. now try again\n"
msgstr ""
#: src/ptouch-print.c:82
#: src/libptouch.c:412
#, c-format
msgid "debug: called ptouch_get_tape_width() with NULL ptdev\n"
msgstr ""
#: src/libptouch.c:421
#, c-format
msgid "debug: called ptouch_get_max_width() with NULL ptdev\n"
msgstr ""
#: src/libptouch.c:433
#, c-format
msgid "debug: called ptouch_sendraster() with NULL ptdev\n"
msgstr ""
#: src/ptouch-print.c:146
#, c-format
msgid "nothing to print\n"
msgstr ""
#: src/ptouch-print.c:89
#: src/ptouch-print.c:154
#, c-format
msgid "image is too large (%ipx x %ipx)\n"
msgstr ""
#: src/ptouch-print.c:90 src/ptouch-print.c:556
#: src/ptouch-print.c:155
#, c-format
msgid "maximum printing width for this tape is %ipx\n"
msgstr ""
#: src/ptouch-print.c:104
#: src/ptouch-print.c:158
#, c-format
msgid "image size (%ipx x %ipx)\n"
msgstr ""
#: src/ptouch-print.c:168
#, c-format
msgid "ptouch_rasterstart() failed\n"
msgstr ""
#: src/ptouch-print.c:110
#: src/ptouch-print.c:174
#, c-format
msgid "send print information command\n"
msgstr ""
#: src/ptouch-print.c:116
#: src/ptouch-print.c:180
#, c-format
msgid "send PT-D460BT magic commands\n"
msgstr ""
#: src/ptouch-print.c:122
#: src/ptouch-print.c:186
#, c-format
msgid "send precut command\n"
msgstr ""
#: src/ptouch-print.c:133
#: src/ptouch-print.c:194
#, c-format
msgid "ptouch_sendraster() failed\n"
msgstr ""
#: src/ptouch-print.c:182
#, c-format
msgid "writing image '%s' failed\n"
msgid "send PT-D460BT chain commands\n"
msgstr ""
#: src/ptouch-print.c:206
#, c-format
msgid "debug: o baseline offset - %d\n"
msgid "ptouch_sendraster() failed\n"
msgstr ""
#: src/ptouch-print.c:207
#: src/ptouch-print.c:255
#, c-format
msgid "debug: text baseline offset - %d\n"
msgstr ""
#: src/ptouch-print.c:266
#, c-format
msgid "render_text(): %i lines, font = '%s'\n"
msgstr ""
#: src/ptouch-print.c:269
#, c-format
msgid "warning: font config not available\n"
msgstr ""
#: src/ptouch-print.c:273
#, c-format
msgid "setting font size=%i\n"
msgid "writing image '%s' failed\n"
msgstr ""
#: src/ptouch-print.c:277
#, c-format
msgid "debug: o baseline offset - %d\n"
msgstr ""
#: src/ptouch-print.c:278
#, c-format
msgid "debug: text baseline offset - %d\n"
msgstr ""
#: src/ptouch-print.c:337
#, c-format
msgid "render_text(): %i lines, font = '%s'\n"
msgstr ""
#: src/ptouch-print.c:340
#, c-format
msgid "warning: font config not available\n"
msgstr ""
#: src/ptouch-print.c:344
#, c-format
msgid "setting font size=%i\n"
msgstr ""
#: src/ptouch-print.c:348
#, c-format
msgid "could not estimate needed font size\n"
msgstr ""
#: src/ptouch-print.c:284
#: src/ptouch-print.c:355
#, c-format
msgid "choosing font size=%i\n"
msgstr ""
#: src/ptouch-print.c:300 src/ptouch-print.c:328
#: src/ptouch-print.c:371 src/ptouch-print.c:399
#, c-format
msgid "error in gdImageStringFT: %s\n"
msgstr ""
#: src/ptouch-print.c:495
#: src/ptouch-print.c:563
#, c-format
msgid "ptouch-print version %s by Dominic Radermacher\n"
msgid "Only up to %d lines are supported"
msgstr ""
#: src/ptouch-print.c:526
#: src/ptouch-print.c:576
msgid "No arguments supported"
msgstr ""
#: src/ptouch-print.c:581
msgid "Option --writepng missing"
msgstr ""
#: src/ptouch-print.c:584
msgid "Options --force_tape_width and --info can't be used together"
msgstr ""
#: src/ptouch-print.c:615
#, c-format
msgid "ptouch_init() failed\n"
msgstr ""
#: src/ptouch-print.c:529
#: src/ptouch-print.c:618
#, c-format
msgid "ptouch_getstatus() failed\n"
msgstr ""
#: src/ptouch-print.c:568
#: src/ptouch-print.c:632
#, c-format
msgid "maximum printing width for this printer is %ldpx\n"
msgstr ""
#: src/ptouch-print.c:633
#, c-format
msgid "maximum printing width for this tape is %ldpx\n"
msgstr ""
#: src/ptouch-print.c:658
#, c-format
msgid "failed to load image file\n"
msgstr ""
#: src/ptouch-print.c:584
#: src/ptouch-print.c:667
#, c-format
msgid "could not render text\n"
msgstr ""
#: src/ptouch-print.c:616
#: src/ptouch-print.c:706
#, c-format
msgid "ptouch_finalize(%d) failed\n"
msgstr ""

View File

@ -28,6 +28,12 @@ once in any order, and will be executed in the given order.
.TP
.BR \-\-debug
Enables printing of debugging information.
.TP
.BR \-\-timeout\ \fI<time>
Set the seconds ptouch-print is waiting for finishing a previous ptouch-print command.
Default is 1 second. 0 (zero) means wait forever.
Useful if ptouch-print is used in a script multiple times, and the device is waiting for the user
to use the mechanical cutter.
.SS "Font selection options"
.TP

View File

@ -26,8 +26,8 @@
#include <sys/stat.h> /* open() */
#include <fcntl.h> /* open() */
#include <time.h> /* nanosleep(), struct timespec */
#include <libintl.h> /* gettext() */
#include "gettext.h" /* gettext(), ngettext() */
#include "ptouch.h"
#define _(s) gettext(s)
@ -67,6 +67,9 @@ struct _pt_dev_info ptdevs[] = {
{0x04f9, 0x205f, "PT-E500", 128, 180, FLAG_RASTER_PACKBITS},
/* Note about the PT-E500: was reported by Jesse Becker with the
remark that it also needs some padding (white pixels) */
{0x04f9, 0x2060, "PT-E550W", 128, 180, FLAG_UNSUP_RASTER},
/* Note about the PT-E550W: was reported by Tim Biermann but does not
work yet (only prints empty tape with FLAG_RASTER_PACKBITS|FLAG_HAS_PRECUT) */
{0x04f9, 0x2061, "PT-P700", 128, 180, FLAG_RASTER_PACKBITS|FLAG_P700_INIT|FLAG_HAS_PRECUT},
{0x04f9, 0x2062, "PT-P750W", 128, 180, FLAG_RASTER_PACKBITS|FLAG_P700_INIT},
{0x04f9, 0x2064, "PT-P700 (PLite Mode)", 128, 180, FLAG_PLITE},
@ -225,10 +228,11 @@ int ptouch_send_d460bt_magic(ptouch_dev ptdev)
uint8_t cmd[7];
/* n1 and n2 are the length margin/spacing, in px? (uint16_t value, little endian) */
/* A value of 0x06 is equivalent to the width margin on 6mm tape */
/* A value of 0x01 adds barely any margin, suitable for image printing */
/* The default for P-Touch software is 0x0e */
/* n3 must be 0x4D or the print gets corrupted! */
/* n4 seems to be ignored or reserved. */
memcpy(cmd, "\x1b\x69\x64\x0e\x00\x4d\x00", 7);
memcpy(cmd, "\x1b\x69\x64\x01\x00\x4d\x00", 7);
return ptouch_send(ptdev, (uint8_t *)cmd, sizeof(cmd));
}
@ -341,11 +345,11 @@ void ptouch_rawstatus(uint8_t raw[32])
return;
}
int ptouch_getstatus(ptouch_dev ptdev)
int ptouch_getstatus(ptouch_dev ptdev, int timeout)
{
char cmd[]="\x1biS"; /* 1B 69 53 = ESC i S = Status info request */
uint8_t buf[32] = {};
int i, r, tx=0, tries=0;
int i, r, tx=0, tries=0, maxtries=timeout*10;
struct timespec w;
if (!ptdev) {
@ -363,8 +367,8 @@ int ptouch_getstatus(ptouch_dev ptdev)
return -1;
}
++tries;
if (tries > 10) {
fprintf(stderr, _("timeout while waiting for status response\n"));
if (timeout && tries > maxtries) {
fprintf(stderr, _("timeout (%i sec) while waiting for status response\n"), timeout);
return -1;
}
}

View File

@ -17,6 +17,7 @@
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <argp.h>
#include <stdio.h> /* printf() */
#include <stdlib.h> /* exit(), malloc() */
#include <stdbool.h>
@ -29,13 +30,36 @@
#include <locale.h> /* LC_ALL */
#include "version.h"
#include "gettext.h" /* gettext(), ngettext() */
#include "ptouch.h"
#define _(s) gettext(s)
#define MAX_LINES 4 /* maybe this should depend on tape size */
#define P_NAME "ptouch-print"
struct arguments {
bool chain;
int copies;
bool debug;
bool info;
char *font_file;
int font_size;
int forced_tape_width;
char *save_png;
int verbose;
int timeout;
};
typedef enum { JOB_CUTMARK, JOB_IMAGE, JOB_PAD, JOB_TEXT, JOB_UNDEFINED } job_type_t;
typedef struct job {
job_type_t type;
int n;
char *lines[MAX_LINES];
struct job *next;
} job_t;
gdImage *image_load(const char *file);
void rasterline_setpixel(uint8_t* rasterline, size_t size, int pixel);
int get_baselineoffset(char *text, char *font, int fsz);
@ -47,18 +71,58 @@ gdImage *img_append(gdImage *in_1, gdImage *in_2);
gdImage *img_cutmark(int print_width);
gdImage *render_text(char *font, char *line[], int lines, int print_width);
void unsupported_printer(ptouch_dev ptdev);
void usage(char *progname);
int parse_args(int argc, char **argv);
void add_job(job_type_t type, int n, char *line);
static error_t parse_opt(int key, char *arg, struct argp_state *state);
// char *font_file = "/usr/share/fonts/TTF/Ubuntu-M.ttf";
// char *font_file = "Ubuntu:medium";
char *font_file = "DejaVuSans";
char *save_png = NULL;
int verbose = 0;
int fontsize = 0;
bool debug = false;
bool chain = false;
int forced_tape_width = 0;
const char *argp_program_version = P_NAME " " VERSION;
const char *argp_program_bug_address = "Dominic Radermacher <dominic@familie-radermacher.ch>";
static char doc[] = "ptouch-print is a command line tool to print labels on Brother P-Touch printers on Linux.";
static char args_doc[] = "";
static struct argp_option options[] = {
// name, key, arg, flags, doc, group
{ 0, 0, 0, 0, "options:", 1},
{ "debug", 1, 0, 0, "Enable debug output", 1},
{ "font", 2, "<file>", 0, "Use font <file> or <name>", 1},
{ "fontsize", 3, "<size>", 0, "Manually set font size", 1},
{ "writepng", 4, "<file>", 0, "Instead of printing, write output to png <file>", 1},
{ "force-tape-width", 5, "<px>", 0, "Set tape width in pixels, use together with --writepng without a printer connected", 1},
{ "copies", 6, "<number>", 0, "Sets the number of identical prints", 1},
{ "timeout", 7, "<seconds>", 0, "Set timeout waiting for finishing previous job. Default:1, 0 means infinity", 1},
{ 0, 0, 0, 0, "print commands:", 2},
{ "image", 'i', "<file>", 0, "Print the given image which must be a 2 color (black/white) png", 2},
{ "text", 't', "<text>", 0, "Print line of <text>. If the text contains spaces, use quotation marks taround it", 2},
{ "cutmark", 'c', 0, 0, "Print a mark where the tape should be cut", 2},
{ "pad", 'p', "<n>", 0, "Add n pixels padding (blank tape)", 2},
{ "chain", 10, 0, 0, "Skip final feed of label and any automatic cut", 2},
{ "newline", 'n', "<text>", 0, "Add text in a new line (up to 4 lines)", 2},
{ 0, 0, 0, 0, "other commands:", 3},
{ "info", 20, 0, 0, "Show info about detected tape", 3},
{ "list-supported", 21, 0, 0, "Show printers supported by this version", 3},
{ 0 }
};
static struct argp argp = { options, parse_opt, args_doc, doc, 0, 0, 0 };
struct arguments arguments = {
.chain = false,
.copies = 1,
.debug = false,
.info = false,
//.font_file = "/usr/share/fonts/TTF/Ubuntu-M.ttf",
//.font_file = "Ubuntu:medium",
.font_file = "DejaVuSans",
.font_size = 0,
.forced_tape_width = 0,
.save_png = NULL,
.verbose = 0,
.timeout = 1
};
job_t *jobs = NULL;
job_t *last_added_job = NULL;
/* --------------------------------------------------------------------
-------------------------------------------------------------------- */
@ -95,7 +159,7 @@ int print_img(ptouch_dev ptdev, gdImage *im, int chain)
int offset = ((int)max_pixels / 2) - (gdImageSY(im)/2); /* always print centered */
printf("max_pixels=%ld, offset=%d\n", max_pixels, offset);
if ((ptdev->devinfo->flags & FLAG_RASTER_PACKBITS) == FLAG_RASTER_PACKBITS) {
if (debug) {
if (arguments.debug) {
printf("enable PackBits mode\n");
}
ptouch_enable_packbits(ptdev);
@ -106,28 +170,31 @@ int print_img(ptouch_dev ptdev, gdImage *im, int chain)
}
if ((ptdev->devinfo->flags & FLAG_USE_INFO_CMD) == FLAG_USE_INFO_CMD) {
ptouch_info_cmd(ptdev, gdImageSX(im));
if (debug) {
if (arguments.debug) {
printf(_("send print information command\n"));
}
}
if ((ptdev->devinfo->flags & FLAG_D460BT_MAGIC) == FLAG_D460BT_MAGIC) {
if (chain) {
ptouch_send_d460bt_chain(ptdev);
if (debug) {
printf(_("send PT-D460BT chain commands\n"));
}
}
ptouch_send_d460bt_magic(ptdev);
if (debug) {
if (arguments.debug) {
printf(_("send PT-D460BT magic commands\n"));
}
}
if ((ptdev->devinfo->flags & FLAG_HAS_PRECUT) == FLAG_HAS_PRECUT) {
ptouch_send_precut_cmd(ptdev, 1);
if (debug) {
if (arguments.debug) {
printf(_("send precut command\n"));
}
}
/* send chain command after precut, to allow precutting before chain */
if ((ptdev->devinfo->flags & FLAG_D460BT_MAGIC) == FLAG_D460BT_MAGIC) {
if (chain) {
ptouch_send_d460bt_chain(ptdev);
if (arguments.debug) {
printf(_("send PT-D460BT chain commands\n"));
}
}
}
for (int k = 0; k < gdImageSX(im); ++k) {
memset(rasterline, 0, sizeof(rasterline));
for (int i = 0; i < gdImageSY(im); ++i) {
@ -206,7 +273,7 @@ int get_baselineoffset(char *text, char *font, int fsz)
int o_offset = brect[1];
gdImageStringFT(NULL, &brect[0], -1, font, fsz, 0.0, 0, 0, text);
int text_offset = brect[1];
if (debug) {
if (arguments.debug) {
printf(_("debug: o baseline offset - %d\n"), o_offset);
printf(_("debug: text baseline offset - %d\n"), text_offset);
}
@ -266,14 +333,14 @@ gdImage *render_text(char *font, char *line[], int lines, int print_width)
char *p;
gdImage *im = NULL;
if (debug) {
if (arguments.debug) {
printf(_("render_text(): %i lines, font = '%s'\n"), lines, font);
}
if (gdFTUseFontConfig(1) != GD_TRUE) {
printf(_("warning: font config not available\n"));
}
if (fontsize > 0) {
fsz = fontsize;
if (arguments.font_size > 0) {
fsz = arguments.font_size;
printf(_("setting font size=%i\n"), fsz);
} else {
for (i = 0; i < lines; ++i) {
@ -287,8 +354,8 @@ gdImage *render_text(char *font, char *line[], int lines, int print_width)
}
printf(_("choosing font size=%i\n"), fsz);
}
for(i = 0; i < lines; ++i) {
tmp = needed_width(line[i], font_file, fsz);
for (i = 0; i < lines; ++i) {
tmp = needed_width(line[i], arguments.font_file, fsz);
if (tmp > x) {
x = tmp;
}
@ -309,7 +376,7 @@ gdImage *render_text(char *font, char *line[], int lines, int print_width)
max_height = lineheight;
}
}
if (debug) {
if (arguments.debug) {
printf("debug: needed (max) height is %ipx\n", max_height);
}
if ((max_height * lines) > print_width) {
@ -320,14 +387,14 @@ gdImage *render_text(char *font, char *line[], int lines, int print_width)
int unused_px = print_width - (max_height * lines);
/* now render lines */
for (i = 0; i < lines; ++i) {
int ofs = get_baselineoffset(line[i], font_file, fsz);
int ofs = get_baselineoffset(line[i], arguments.font_file, fsz);
//int pos = ((i)*(print_width/(lines)))+(max_height)-ofs-1;
int pos = ((i)*(print_width/(lines)))+(max_height)-ofs;
pos += (unused_px/lines) / 2;
if (debug) {
if (arguments.debug) {
printf("debug: line %i pos=%i ofs=%i\n", i+1, pos, ofs);
}
int off_x = offset_x(line[i], font_file, fsz);
int off_x = offset_x(line[i], arguments.font_file, fsz);
if ((p = gdImageStringFT(im, &brect[0], -black, font, fsz, 0.0, off_x, pos, line[i])) != NULL) {
printf(_("error in gdImageStringFT: %s\n"), p);
}
@ -363,18 +430,18 @@ gdImage *img_append(gdImage *in_1, gdImage *in_2)
}
gdImageColorAllocate(out, 255, 255, 255);
gdImageColorAllocate(out, 0, 0, 0);
if (debug) {
if (arguments.debug) {
printf("debug: created new img with size %d * %d\n", length, width);
}
if (in_1 != NULL) {
gdImageCopy(out, in_1, 0, 0, 0, 0, gdImageSX(in_1), gdImageSY(in_1));
if (debug) {
if (arguments.debug) {
printf("debug: copied part 1\n");
}
}
if (in_2 != NULL) {
gdImageCopy(out, in_2, i_1_x, 0, 0, 0, gdImageSX(in_2), gdImageSY(in_2));
if (debug) {
if (arguments.debug) {
printf("copied part 2\n");
}
}
@ -418,118 +485,114 @@ gdImage *img_padding(int print_width, int length)
return out;
}
void usage(char *progname)
void add_job(job_type_t type, int n, char *line)
{
printf("usage: %s [options] <print-command(s)>\n", progname);
printf("options:\n");
printf("\t--debug\t\t\tenable debug output\n");
printf("\t--font <file>\t\tuse font <file> or <name>\n");
printf("\t--fontsize <size>\tManually set fontsize\n");
printf("\t--writepng <file>\tinstead of printing, write output to png file\n");
printf("\t--force-tape-width <px>\tSet tape width in pixels, use together with\n");
printf("\t\t\t\t--writepng without a printer connected.\n");
printf("\t--copies <number>\tSets the number of identical prints\n");
printf("print commands:\n");
printf("\t--image <file>\t\tprint the given image which must be a 2 color\n");
printf("\t\t\t\t(black/white) png\n");
printf("\t--text <text>\t\tPrint 1-4 lines of text.\n");
printf("\t\t\t\tIf the text contains spaces, use quotation marks\n\t\t\t\taround it.\n");
printf("\t--cutmark\t\tPrint a mark where the tape should be cut\n");
printf("\t--pad <n>\t\tAdd n pixels padding (blank tape)\n");
printf("\t--chain\t\t\tSkip final feed of label and any automatic cut\n");
printf("other commands:\n");
printf("\t--version\t\tshow version info (required for bug report)\n");
printf("\t--info\t\t\tshow info about detected tape\n");
printf("\t--list-supported\tshow printers supported by this version\n");
exit(1);
job_t *new_job = (job_t*)malloc(sizeof(job_t));
if (!new_job) {
fprintf(stderr, "Memory allocation failed\n");
return;
}
new_job->type = type;
if (type == JOB_TEXT && n > MAX_LINES) {
n = MAX_LINES;
}
new_job->n = n;
new_job->lines[0] = line;
for (int i=1; i<MAX_LINES; ++i) {
new_job->lines[i] = NULL;
}
new_job->next = NULL;
if (!last_added_job) { // just created the first job
jobs = last_added_job = new_job;
return;
}
last_added_job->next = new_job;
last_added_job = new_job;
}
/* here we don't print anything, but just try to catch syntax errors */
int parse_args(int argc, char **argv)
static error_t parse_opt(int key, char *arg, struct argp_state *state)
{
int lines, i;
struct arguments *arguments = (struct arguments *)state->input;
for (i = 1; i < argc; ++i) {
if (*argv[i] != '-') {
switch (key) {
case 1: // debug
arguments->debug = true;
break;
}
if (strcmp(&argv[i][1], "-font") == 0) {
if (i+1 < argc) {
font_file = argv[++i];
} else {
usage(argv[0]);
case 2: // font
arguments->font_file = arg;
break;
case 3: // fontsize
arguments->font_size = strtol(arg, NULL, 10);
break;
case 4: // writepng
arguments->save_png = arg;
break;
case 5: // force-tape-width
arguments->forced_tape_width = strtol(arg, NULL, 10);
break;
case 6: // copies
arguments->copies = strtol(arg, NULL, 10);
break;
case 7: // timeout
arguments->timeout = strtol(arg, NULL, 10);
break;
case 'i': // image
add_job(JOB_IMAGE, 1, arg);
break;
case 't': // text
add_job(JOB_TEXT, 1, arg);
break;
case 'c': // cutmark
add_job(JOB_CUTMARK, 0, NULL);
break;
case 'p': // pad
add_job(JOB_PAD, atoi(arg), NULL);
break;
case 10: // chain
arguments->chain = true;
break;
case 'n': // newline
if (!last_added_job || last_added_job->type != JOB_TEXT) {
add_job(JOB_TEXT, 1, arg);
break;
}
} else if (strcmp(&argv[i][1], "-fontsize") == 0) {
if (i+1 < argc) {
++i;
} else {
usage(argv[0]);
if (last_added_job->n >= MAX_LINES) { // max number of lines reached
argp_failure(state, 1, EINVAL, _("Only up to %d lines are supported"), MAX_LINES);
break;
}
} else if (strcmp(&argv[i][1], "-writepng") == 0) {
if (i+1 < argc) {
save_png = argv[++i];
} else {
usage(argv[0]);
}
} else if (strcmp(&argv[i][1], "-force-tape-width") == 0) {
if (i+1 < argc) {
forced_tape_width = strtol(argv[++i], NULL, 10);
} else {
usage(argv[0]);
}
} else if (strcmp(&argv[i][1], "-cutmark") == 0) {
continue; /* not done here */
} else if (strcmp(&argv[i][1], "-chain") == 0) {
chain = true;
} else if (strcmp(&argv[i][1], "-debug") == 0) {
debug = true;
} else if (strcmp(&argv[i][1], "-info") == 0) {
continue; /* not done here */
} else if (strcmp(&argv[i][1], "-copies") == 0) {
if (i+1 < argc) {
++i;
} else {
usage(argv[0]);
}
} else if (strcmp(&argv[i][1], "-image") == 0) {
if (i+1 < argc) {
++i;
} else {
usage(argv[0]);
}
} else if (strcmp(&argv[i][1], "-pad") == 0) {
if (i+1 < argc) {
++i;
} else {
usage(argv[0]);
}
} else if (strcmp(&argv[i][1], "-text") == 0) {
for (lines = 0; (lines < MAX_LINES) && (i < argc); ++lines) {
if ((i+1 >= argc) || (argv[i+1][0] == '-')) {
break;
}
++i;
}
} else if (strcmp(&argv[i][1], "-version") == 0) {
printf(_("ptouch-print version %s by Dominic Radermacher\n"), VERSION);
exit(0);
} else if (strcmp(&argv[i][1], "-list-supported") == 0) {
last_added_job->lines[last_added_job->n++] = arg;
break;
case 20: // info
arguments->info = true;
break;
case 21: // list-supported
ptouch_list_supported();
exit(0);
} else {
usage(argv[0]);
}
case ARGP_KEY_ARG:
argp_failure(state, 1, E2BIG, _("No arguments supported"));
break;
case ARGP_KEY_END:
// final argument validation
if (arguments->forced_tape_width && !arguments->save_png) {
argp_failure(state, 1, ENOTSUP, _("Option --writepng missing"));
}
if (arguments->forced_tape_width && arguments->info) {
argp_failure(state, 1, ENOTSUP, _("Options --force_tape_width and --info can't be used together"));
}
break;
default:
return ARGP_ERR_UNKNOWN;
}
if (forced_tape_width && !save_png) {
forced_tape_width = 0;
}
return i;
return 0;
}
int main(int argc, char *argv[])
{
int lines = 0, copies = 1, print_width = 0;
char *line[MAX_LINES];
int print_width = 0;
gdImage *im = NULL;
gdImage *out = NULL;
ptouch_dev ptdev = NULL;
@ -539,20 +602,19 @@ int main(int argc, char *argv[])
if (!textdomain_dir) {
textdomain_dir = "/usr/share/locale/";
}
bindtextdomain("ptouch-print", textdomain_dir);
textdomain("ptouch-print");
int i = parse_args(argc, argv);
if (i != argc) {
usage(argv[0]);
}
if (!forced_tape_width) {
bindtextdomain(P_NAME, "/usr/share/locale/");
textdomain(P_NAME);
argp_parse(&argp, argc, argv, 0, 0, &arguments);
if (!arguments.forced_tape_width) {
if ((ptouch_open(&ptdev)) < 0) {
return 5;
}
if (ptouch_init(ptdev) != 0) {
printf(_("ptouch_init() failed\n"));
}
if (ptouch_getstatus(ptdev) != 0) {
if (ptouch_getstatus(ptdev, arguments.timeout) != 0) {
printf(_("ptouch_getstatus() failed\n"));
return 1;
}
@ -563,100 +625,85 @@ int main(int argc, char *argv[])
print_width = max_print_width;
}
} else { // --forced_tape_width together with --writepng
print_width = forced_tape_width;
print_width = arguments.forced_tape_width;
}
for (i = 1; i < argc; ++i) {
if (*argv[i] != '-') {
break;
if (arguments.info) {
printf(_("maximum printing width for this printer is %ldpx\n"), ptouch_get_max_width(ptdev));
printf(_("maximum printing width for this tape is %ldpx\n"), ptouch_get_tape_width(ptdev));
printf("media type = %02x (%s)\n", ptdev->status->media_type, pt_mediatype(ptdev->status->media_type));
printf("media width = %d mm\n", ptdev->status->media_width);
printf("tape color = %02x (%s)\n", ptdev->status->tape_color, pt_tapecolor(ptdev->status->tape_color));
printf("text color = %02x (%s)\n", ptdev->status->text_color, pt_textcolor(ptdev->status->text_color));
printf("error = %04x\n", ptdev->status->error);
if (arguments.debug) {
ptouch_rawstatus((uint8_t *)ptdev->status);
}
if (strcmp(&argv[i][1], "-font") == 0) {
if (i+1 < argc) {
font_file = argv[++i];
} else {
usage(argv[0]);
exit(0);
}
// iterate through all print jobs
for (job_t *job = jobs; job != NULL; job = job->next) {
if (arguments.debug) {
printf("job %p: type=%d | n=%d", job, job->type, job->n);
for (int i=0; i<MAX_LINES; ++i) {
printf(" | %s", job->lines[i]);
}
} else if (strcmp(&argv[i][1], "-fontsize") == 0) {
if (i+1 < argc) {
fontsize = strtol(argv[++i], NULL, 10);
} else {
usage(argv[0]);
}
} else if (strcmp(&argv[i][1], "-force-tape-width") == 0) {
if (forced_tape_width && save_png) {
++i;
continue;
} else {
usage(argv[0]);
}
} else if (strcmp(&argv[i][1], "-writepng") == 0) {
i++;
continue;
} else if (strcmp(&argv[i][1], "-info") == 0) {
printf(_("maximum printing width for this printer is %ldpx\n"), ptouch_get_max_width(ptdev));
printf(_("maximum printing width for this tape is %ldpx\n"), ptouch_get_tape_width(ptdev));
printf("media type = %02x (%s)\n", ptdev->status->media_type, pt_mediatype(ptdev->status->media_type));
printf("media width = %d mm\n", ptdev->status->media_width);
printf("tape color = %02x (%s)\n", ptdev->status->tape_color, pt_tapecolor(ptdev->status->tape_color));
printf("text color = %02x (%s)\n", ptdev->status->text_color, pt_textcolor(ptdev->status->text_color));
printf("error = %04x\n", ptdev->status->error);
if (debug) {
ptouch_rawstatus((uint8_t *)ptdev->status);
}
exit(0);
} else if (strcmp(&argv[i][1], "-image") == 0) {
if ((im = image_load(argv[++i])) == NULL) {
printf(_("failed to load image file\n"));
return 1;
}
out = img_append(out, im);
gdImageDestroy(im);
im = NULL;
} else if (strcmp(&argv[i][1], "-text") == 0) {
for (lines = 0; (lines < MAX_LINES) && (i < argc); ++lines) {
if ((i+1 >= argc) || (argv[i+1][0] == '-')) {
break;
printf(" | next=%p\n", job->next);
}
switch (job->type) {
case JOB_IMAGE:
if ((im = image_load(job->lines[0])) == NULL) {
printf(_("failed to load image file\n"));
return 1;
}
++i;
line[lines] = argv[i];
}
if (lines) {
if ((im = render_text(font_file, line, lines, print_width)) == NULL) {
out = img_append(out, im);
gdImageDestroy(im);
im = NULL;
break;
case JOB_TEXT:
if ((im = render_text(arguments.font_file, job->lines, job->n, print_width)) == NULL) {
printf(_("could not render text\n"));
return 1;
}
out = img_append(out, im);
gdImageDestroy(im);
im = NULL;
}
} else if (strcmp(&argv[i][1], "-cutmark") == 0) {
im = img_cutmark(print_width);
out = img_append(out, im);
gdImageDestroy(im);
im = NULL;
} else if (strcmp(&argv[i][1], "-pad") == 0) {
int length=strtol(argv[++i], NULL, 10);
im = img_padding(print_width, length);
out = img_append(out, im);
gdImageDestroy(im);
im = NULL;
} else if (strcmp(&argv[i][1], "-chain") == 0) {
chain = true;
} else if (strcmp(&argv[i][1], "-debug") == 0) {
debug = true;
} else if (strcmp(&argv[i][1], "-copies") == 0) {
copies = strtol(argv[++i], NULL, 10);
} else {
usage(argv[0]);
break;
case JOB_CUTMARK:
im = img_cutmark(print_width);
out = img_append(out, im);
gdImageDestroy(im);
im = NULL;
break;
case JOB_PAD:
im = img_padding(print_width, job->n);
out = img_append(out, im);
gdImageDestroy(im);
im = NULL;
break;
default:
break;
}
}
// clean up job list
for (job_t *job = jobs; job != NULL; ) {
job_t *next = job->next;
free(job);
job = next;
}
jobs = last_added_job = NULL;
if (out) {
if (save_png) {
write_png(out, save_png);
if (arguments.save_png) {
write_png(out, arguments.save_png);
} else {
for (i = 0; i < copies; ++i) {
print_img(ptdev, out, chain);
if (ptouch_finalize(ptdev, ( chain || (i < copies-1) ) ) != 0) {
printf(_("ptouch_finalize(%d) failed\n"), chain);
for (int i = 0; i < arguments.copies; ++i) {
print_img(ptdev, out, arguments.chain);
if (ptouch_finalize(ptdev, ( arguments.chain || (i < arguments.copies-1) ) ) != 0) {
printf(_("ptouch_finalize(%d) failed\n"), arguments.chain);
return 2;
}
}
@ -666,7 +713,7 @@ int main(int argc, char *argv[])
if (im != NULL) {
gdImageDestroy(im);
}
if (!forced_tape_width) {
if (!arguments.forced_tape_width) {
ptouch_close(ptdev);
}
libusb_exit(NULL);