Initial revision

This commit is contained in:
factor 2008-07-13 21:15:55 +00:00
commit 52aa6fdb27
99 changed files with 24846 additions and 0 deletions

351
backend/2of5.c Normal file
View File

@ -0,0 +1,351 @@
/* 2of5.c - Handles Code 2 of 5 barcodes */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
static char *C25MatrixTable[10] = {"113311", "311131", "131131", "331111", "113131", "313111",
"133111", "111331", "311311", "131311"};
static char *C25IndustTable[10] = {"1111313111", "3111111131", "1131111131", "3131111111", "1111311131",
"3111311111", "1131311111", "1111113131", "3111113111", "1131113111"};
static char *C25InterTable[10] = {"11331", "31113", "13113", "33111", "11313", "31311", "13311", "11133",
"31131", "13131"};
int matrix_two_of_five(struct zint_symbol *symbol, unsigned char source[])
{ /* Code 2 of 5 Standard (Code 2 of 5 Matrix) */
int i, errno;
char dest[1000];
errno = 0;
strcpy(dest, "");
if(strlen(source) > 80) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(NESET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
/* start character */
concat (dest, "411111");
for(i = 0; i <= strlen(source); i++) {
lookup(NESET, C25MatrixTable, source[i], dest);
}
/* Stop character */
concat (dest, "41111");
expand(symbol, dest);
strcpy(symbol->text, source);
return errno;
}
int industrial_two_of_five(struct zint_symbol *symbol, unsigned char source[])
{ /* Code 2 of 5 Industrial */
int i, errno;
char dest[1000];
errno = 0;
strcpy(dest, "");
if(strlen(source) > 45) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(NESET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid character in data");
return errno;
}
/* start character */
concat (dest, "313111");
for(i = 0; i <= strlen(source); i++) {
lookup(NESET, C25IndustTable, source[i], dest);
}
/* Stop character */
concat (dest, "31113");
expand(symbol, dest);
strcpy(symbol->text, source);
return errno;
}
int iata_two_of_five(struct zint_symbol *symbol, unsigned char source[])
{ /* Code 2 of 5 IATA */
int i, errno;
char dest[1000];
errno = 0;
strcpy(dest, "");
if(strlen(source) > 45) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(NESET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
/* start */
concat (dest, "1111");
for(i = 0; i < strlen(source); i++) {
lookup(NESET, C25IndustTable, source[i], dest);
}
/* stop */
concat (dest, "311");
expand(symbol, dest);
strcpy(symbol->text, source);
return errno;
}
int logic_two_of_five(struct zint_symbol *symbol, unsigned char source[])
{ /* Code 2 of 5 Data Logic */
int i, errno;
char dest[1000];
errno = 0;
strcpy(dest, "");
if(strlen(source) > 80) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(NESET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
/* start character */
concat (dest, "1111");
for(i = 0; i <= strlen(source); i++) {
lookup(NESET, C25MatrixTable, source[i], dest);
}
/* Stop character */
concat (dest, "311");
expand(symbol, dest);
strcpy(symbol->text, source);
return errno;
}
int interleaved_two_of_five(struct zint_symbol *symbol, unsigned char source[])
{ /* Code 2 of 5 Interleaved */
int i, j, k, errno;
char bars[7], spaces[7], mixed[14], dest[1000];
errno = 0;
strcpy(dest, "");
if(strlen(source) > 90) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(NESET, source);
if (errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
/* Input must be an even number of characters for Interlaced 2 of 5 to work:
if an odd number of characters has been entered then add a leading zero */
if ((strlen(source)%2) != 0)
{
/* there are an odd number of input characters */
unsigned int length;
char temp[100];
length = strlen(source);
strcpy(temp, source);
source[0] = '0';
for(i = 0; i <= length; i++)
{
source[i + 1] = temp[i];
}
}
/* start character */
concat(dest, "1111");
for(i = 0; i < strlen(source); i+=2 )
{
/* look up the bars and the spaces and put them in two strings */
strcpy(bars, "");
lookup(NESET, C25InterTable, source[i], bars);
strcpy(spaces, "");
lookup(NESET, C25InterTable, source[i + 1], spaces);
/* then merge (interlace) the strings together */
k = 0;
for(j = 0; j <= 4; j++)
{
mixed[k] = bars[j]; k++;
mixed[k] = spaces[j]; k++;
}
mixed[k] = '\0';
concat (dest, mixed);
}
/* Stop character */
concat (dest, "311");
expand(symbol, dest);
strcpy(symbol->text, source);
return errno;
}
int itf14(struct zint_symbol *symbol, unsigned char source[])
{
int i, errno, h;
unsigned int count, check_digit;
errno = 0;
count = 0;
h = strlen(source);
if(h != 13) {
strcpy(symbol->errtxt, "error: input wrong length");
return ERROR_TOO_LONG;
}
errno = is_sane(NESET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid character in data");
return errno;
}
/* Calculate the check digit - the same method used for EAN-13 */
for (i = h - 1; i >= 0; i--)
{
count += ctoi(source[i]);
if (!((i%2) == 0))
{
count += 2 * ctoi(source[i]);
}
}
check_digit = 10 - (count%10);
if (check_digit == 10) { check_digit = 0; }
source[h] = itoc(check_digit);
source[h + 1] = '\0';
errno = interleaved_two_of_five(symbol, source);
strcpy(symbol->text, source);
return errno;
}
int dpleit(struct zint_symbol *symbol, unsigned char source[])
{ /* Deutshe Post Leitcode */
int i, errno;
unsigned int h, count, check_digit;
errno = 0;
count = 0;
h = strlen(source);
if(h != 13) {
strcpy(symbol->errtxt, "error: input wrong length");
return ERROR_TOO_LONG;
}
errno = is_sane(NESET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
for (i = h - 1; i >= 0; i--)
{
count += 4 * ctoi(source[i]);
if (!((i%2) == 0))
{
count += 5 * ctoi(source[i]);
}
}
check_digit = 10 - (count%10);
if (check_digit == 10) { check_digit = 0; }
source[h] = itoc(check_digit);
source[h + 1] = '\0';
errno = interleaved_two_of_five(symbol, source);
strcpy(symbol->text, source);
return errno;
}
int dpident(struct zint_symbol *symbol, unsigned char source[])
{ /* Deutsche Post Identcode */
int i, errno;
unsigned int h, count, check_digit;
count = 0;
h = strlen(source);
if(h != 11) {
strcpy(symbol->errtxt, "erro: input wrong length");
return ERROR_TOO_LONG;
}
errno = is_sane(NESET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
for (i = h - 1; i >= 0; i--)
{
count += 4 * ctoi(source[i]);
if (!((i%2) == 0))
{
count += 5 * ctoi(source[i]);
}
}
check_digit = 10 - (count%10);
if (check_digit == 10) { check_digit = 0; }
source[h] = itoc(check_digit);
source[h + 1] = '\0';
errno = interleaved_two_of_five(symbol, source);
strcpy(symbol->text, source);
return errno;
}

674
backend/COPYING Normal file
View File

@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

109
backend/DEVELOPER Normal file
View File

@ -0,0 +1,109 @@
Contents
--------
Here is a guide to which bit of source code does what.
2of5.c:
Matrix 2 of 5
Industrial 2 of 5
IATA 2 of 5
Data Logic
Interleaved 2 of 5
ITF-14
Deutche Post Leitcode
Deutche Post Identcode
auspost.c:
Australia Post Standard Customer Barcode
Australia Post Customer Barcode 2
Australia Post Customer Barcode 3
Australia Post Reply Paid Barcode
Australia Post Routing Barcode
Australia Post Redirect Barcode
aztec.c:
Aztec Mesa
code128.c:
Code 128
Code 128 Subset B
NVE-18
GS1-128 (UCC/EAN-128)
code16k.c:
Code 16k
code.c:
Code 11
Code 39
Pharmazentral Nummer (PZN)
Extended Code 39 (Code 39+)
Code 93
LOGMARS
composite.c:
CC-A Composite Symbology
CC-B Composite Symbology
CC-C Composite Symbology
dmatrix.c:
Data Matrix (Semacode)
imail.c:
USPS OneCode (Intelligent Mail)
maxicode.c:
UPS Maxicode
medical.c:
Pharma Code
Two Track Pharma Code
Codabar
pdf417.c:
PDF417
Truncated PDF417
MicroPDF417
plessey.c:
UK Plessey Code (bidirectional)
MSI Plessey (no check)
MSI Plessey (Mod 10 check)
MSI Plessey (Mod 11 check)
MSI Plessey (Mod 10 Mod 10 check)
MSI Plessey (Mod 10 Mod 11 check)
postal.c:
PostNet
PLANET
Facing Identification Mark (FIM)
Royal Mail 4-State Country Code (RM4SCC)
Korean Postal Authority Code (Disabled)
Flattermarken
qr.c:
QR Code (libqrencode)
rss.c:
GS1 DataBar (DataBar-14) (RSS-14)
GS1 DataBar Stacked (RSS-14 Stacked)
GS1 DataBar Stacked Omnidirectional (DataBar-14 Stacked Omnidirectional)
(RSS-14 Stacked Omnidirectional)
GS1 DataBar Limited (RSS Limited)
GS1 DataBar Expanded (RSS Expanded)
GS1 DataBar Expanded Stacked (RSS Expanded Stacked)
telepen.c:
Telepen ASCII
Telepen Numeric
upcean.c:
UPC-A
UPC-E
EAN-2 add-on
EAN-5 add-on
EAN-8
EAN-13
SBN (verification)
ISBN (verification)
ISBN-13 (verification)

51
backend/Makefile Normal file
View File

@ -0,0 +1,51 @@
# Linux makefile for libzint
#
# make compiles with QR Code support
# make libzint_noqr compiles without QR Code support
# make install copies to /usr/local/lib
# make uninstall removes library
# make clean cleans up a previous compilation and any object or editor files
#
CC := gcc
INCLUDE := -I/usr/local/include
COMMON:= common.c png.c library.c ps.c large.c reedsol.c
COMMON_OBJ:= common.o png.o library.o ps.o large.o reedsol.o
ONEDIM:= code.c code128.c 2of5.c upcean.c telepen.c medical.c plessey.c rss.c
ONEDIM_OBJ:= code.o code128.o 2of5.o upcean.o telepen.o medical.o plessey.o rss.o
POSTAL:= postal.c auspost.c imail.c
POSTAL_OBJ:= postal.o auspost.o imail.o
TWODIM:= code16k.c dmatrix.c dm200.c pdf417.c maxicode.c composite.c
TWODIM_OBJ:= code16k.o dmatrix.o dm200.o pdf417.o maxicode.o composite.o
LIBS:= `libpng12-config --I_opts --L_opts --ldflags` -lz -lm
libzint: code.c code128.c 2of5.c upcean.c medical.c telepen.c plessey.c postal.c auspost.c imail.c code16k.c dmatrix.c dm200.c reedsol.c pdf417.c maxicode.c rss.c common.c png.c library.c ps.c qr.c large.c composite.c
$(CC) -fPIC -g -c $(ONEDIM)
$(CC) -fPIC -g -c $(POSTAL)
$(CC) -fPIC -g -c $(TWODIM) qr.c
$(CC) -fPIC -g -c $(COMMON)
$(CC) -g -shared -Wl,-soname,libzint.so -o libzint.so.1.6.0 $(INCLUDE) $(COMMON_OBJ) $(ONEDIM_OBJ) $(TWODIM_OBJ) qr.o $(POSTAL_OBJ) $(LIBS) -lqrencode
libzint_noqr: code.c code128.c 2of5.c upcean.c medical.c telepen.c plessey.c postal.c auspost.c imail.c code16k.c dmatrix.c dm200.c reedsol.c pdf417.c maxicode.c rss.c common.c png.c library.c ps.c no_qr.c large.c composite.c
$(CC) -fPIC -g -c $(ONEDIM)
$(CC) -fPIC -g -c $(POSTAL)
$(CC) -fPIC -g -c $(TWODIM) no_qr.c
$(CC) -fPIC -g -c $(COMMON)
$(CC) -g -shared -Wl,-soname,libzint.so -o libzint.so.1.6.0 $(INCLUDE) $(COMMON_OBJ) $(ONEDIM_OBJ) $(TWODIM_OBJ) no_qr.o $(POSTAL_OBJ) $(LIBS)
.PHONY: install uninstall clean dist
install:
ldconfig -n $(PWD)
mv libzint.* /usr/local/lib
cp zint.h /usr/local/include
uninstall:
rm /usr/local/lib/libzint.*
rm /usr/local/include/zint.h
clean:
rm -f libzint.* *.o *.a *~

240
backend/auspost.c Normal file
View File

@ -0,0 +1,240 @@
/* auspost.c - Handles Australia Post 4-State Barcode */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#define GDSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz #"
static char *AusNTable[10] = {"00", "01", "02", "10", "11", "12", "20", "21", "22", "30"};
static char *AusCTable[64] = {"222", "300", "301", "302", "310", "311", "312", "320", "321", "322",
"000", "001", "002", "010", "011", "012", "020", "021", "022", "100", "101", "102", "110",
"111", "112", "120", "121", "122", "200", "201", "202", "210", "211", "212", "220", "221",
"023", "030", "031", "032", "033", "103", "113", "123", "130", "131", "132", "133", "203",
"213", "223", "230", "231", "232", "233", "303", "313", "323", "330", "331", "332", "333",
"003", "013"};
static char *AusBarTable[64] = {"000", "001", "002", "003", "010", "011", "012", "013", "020", "021",
"022", "023", "030", "031", "032", "033", "100", "101", "102", "103", "110", "111", "112",
"113", "120", "121", "122", "123", "130", "131", "132", "133", "200", "201", "202", "203",
"210", "211", "212", "213", "220", "221", "222", "223", "230", "231", "232", "233", "300",
"301", "302", "303", "310", "311", "312", "313", "320", "321", "322", "323", "330", "331",
"332", "333"};
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
#include "reedsol.h"
void rs_error(char data_pattern[])
{
/* Adds Reed-Solomon error correction to auspost */
int reader, triple_writer;
char triple[31], inv_triple[31];
char result[5];
triple_writer = 0;
for(reader = 2; reader < strlen(data_pattern); reader+= 3)
{
triple[triple_writer] = 0;
switch(data_pattern[reader])
{
case '1': triple[triple_writer] += 16; break;
case '2': triple[triple_writer] += 32; break;
case '3': triple[triple_writer] += 48; break;
}
switch(data_pattern[reader + 1])
{
case '1': triple[triple_writer] += 4; break;
case '2': triple[triple_writer] += 8; break;
case '3': triple[triple_writer] += 12; break;
}
switch(data_pattern[reader + 2])
{
case '1': triple[triple_writer] += 1; break;
case '2': triple[triple_writer] += 2; break;
case '3': triple[triple_writer] += 3; break;
}
triple_writer++;
}
for(reader = 0; reader < triple_writer; reader++)
{
inv_triple[reader] = triple[(triple_writer - 1) - reader];
}
rs_init_gf(0x43);
rs_init_code(4, 1);
rs_encode(triple_writer, inv_triple, result);
for(reader = 4; reader > 0; reader--)
{
concat(data_pattern, AusBarTable[result[reader - 1]]);
}
}
int australia_post(struct zint_symbol *symbol, unsigned char source[])
{
/* Handles Australia Posts's 4 State Codes */
/* Customer Standard Barcode, Barcode 2 or Barcode 3 system determined automatically
(i.e. the FCC doesn't need to be specified by the user) dependent
on the length of the input string */
/* The contents of data_pattern conform to the following standard:
0 = Tracker, Ascender and Descender
1 = Tracker and Ascender
2 = Tracker and Descender
3 = Tracker only */
char data_pattern[200];
char fcc[3], dpid[10];
unsigned int loopey, reader;
int writer;
strcpy (data_pattern, "");
int errno;
errno = 0;
/* Do all of the length checking first to avoid stack smashing */
if(symbol->symbology == BARCODE_AUSPOST) {
/* Format control code (FCC) */
switch(strlen(source))
{
case 8: strcpy(fcc, "11"); break;
case 13: strcpy(fcc, "59"); break;
case 16: strcpy(fcc, "59"); errno = is_sane(NESET, source); break;
case 18: strcpy(fcc, "62"); break;
case 23: strcpy(fcc, "62"); errno = is_sane(NESET, source); break;
default: strcpy(symbol->errtxt, "error: auspost input is wrong length");
return ERROR_TOO_LONG;
break;
}
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
} else {
if(strlen(source) != 8) {
strcpy(symbol->errtxt, "error: auspost input is wrong length");
return ERROR_TOO_LONG;
}
switch(symbol->symbology) {
case BARCODE_AUSREPLY: strcpy(fcc, "45"); break;
case BARCODE_AUSROUTE: strcpy(fcc, "87"); break;
case BARCODE_AUSREDIRECT: strcpy(fcc, "92"); break;
}
}
errno = is_sane(GDSET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
/* Verifiy that the first 8 characters are numbers */
for(loopey = 0; loopey < 8; loopey++) {
dpid[loopey] = source[loopey];
}
dpid[8] = '\0';
errno = is_sane(NESET, dpid);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in DPID");
return errno;
}
/* Start character */
concat(data_pattern, "13");
/* Encode the FCC */
for(reader = 0; reader < 2; reader++)
{
lookup(NESET, AusNTable, fcc[reader], data_pattern);
}
/* printf("AUSPOST FCC: %s ", fcc); */
/* Delivery Point Identifier (DPID) */
for(reader = 0; reader < 8; reader++)
{
lookup(NESET, AusNTable, dpid[reader], data_pattern);
}
/* Customer Information */
if(strlen(source) > 8)
{
if((strlen(source) == 13) || (strlen(source) == 18)) {
for(reader = 8; reader < strlen(source); reader++) {
lookup(GDSET, AusCTable, source[reader], data_pattern);
}
}
if((strlen(source) == 16) || (strlen(source) == 23)) {
for(reader = 8; reader < strlen(source); reader++) {
lookup(NESET, AusNTable, source[reader], data_pattern);
}
}
}
/* Filler bar */
if(strlen(data_pattern) == 22) {
concat(data_pattern, "3");
}
if(strlen(data_pattern) == 37) {
concat(data_pattern, "3");
}
if(strlen(data_pattern) == 52) {
concat(data_pattern, "3");
}
/* Reed Solomon error correction */
rs_error(data_pattern);
/* Stop character */
concat(data_pattern, "13");
/* Turn the symbol into a bar pattern ready for plotting */
writer = 0;
for(loopey = 0; loopey < strlen(data_pattern); loopey++)
{
if((data_pattern[loopey] == '1') || (data_pattern[loopey] == '0'))
{
symbol->encoded_data[0][writer] = '1';
}
symbol->encoded_data[1][writer] = '1';
if((data_pattern[loopey] == '2') || (data_pattern[loopey] == '0'))
{
symbol->encoded_data[2][writer] = '1';
}
writer += 2;
}
symbol->row_height[0] = 4;
symbol->row_height[1] = 2;
symbol->row_height[2] = 4;
symbol->rows = 3;
symbol->width = writer - 1;
return errno;
}

435
backend/code.c Normal file
View File

@ -0,0 +1,435 @@
/* code.c - Handles Code 11, 39, 39+ and 93 */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/* In version 0.5 this file was 1,553 lines long! */
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
#define NASET "0123456789-"
static char *C11Table[11] = {"111121", "211121", "121121", "221111", "112121", "212111", "122111",
"111221", "211211", "211111", "112111"};
/* Code 39 tables checked against ISO/IEC 16388:2007 */
#define TCSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%abcd"
/* Incorporates Table A1 */
static char *C39Table[43] = { "1112212111", "2112111121", "1122111121", "2122111111", "1112211121",
"2112211111", "1122211111", "1112112121", "2112112111", "1122112111", "2111121121",
"1121121121", "2121121111", "1111221121", "2111221111", "1121221111", "1111122121",
"2111122111", "1121122111", "1111222111", "2111111221", "1121111221", "2121111211",
"1111211221", "2111211211", "1121211211", "1111112221", "2111112211", "1121112211",
"1111212211", "2211111121", "1221111121", "2221111111", "1211211121", "2211211111",
"1221211111", "1211112121", "2211112111", "1221112111", "1212121111", "1212111211",
"1211121211", "1112121211"};
/* Code 39 character assignments (Table 1) */
static char *EC39Ctrl[128] = {"%U", "$A", "$B", "$C", "$D", "$E", "$F", "$G", "$H", "$I", "$J", "$K",
"$L", "$M", "$N", "$O", "$P", "$Q", "$R", "$S", "$T", "$U", "$V", "$W", "$X", "$Y", "$Z",
"%A", "%B", "%C", "%D", "%E", " ", "/A", "/B", "/C", "/D", "/E", "/F", "/G", "/H", "/I", "/J",
"/K", "/L", "-", ".", "/O", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "/Z", "%F",
"%G", "%H", "%I", "%J", "%V", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "%K", "%L", "%M", "%N", "%O",
"%W", "+A", "+B", "+C", "+D", "+E", "+F", "+G", "+H", "+I", "+J", "+K", "+L", "+M", "+N", "+O",
"+P", "+Q", "+R", "+S", "+T", "+U", "+V", "+W", "+X", "+Y", "+Z", "%P", "%Q", "%R", "%S", "%T"};
/* Encoding the full ASCII character set in Code 39 (Table A2) */
static char *C93Ctrl[128] = {"bU", "aA", "aB", "aC", "aD", "aE", "aF", "aG", "aH", "aI", "aJ", "aK",
"aL", "aM", "aN", "aO", "aP", "aQ", "aR", "aS", "aT", "aU", "aV", "aW", "aX", "aY", "aZ",
"bA", "bB", "bC", "bD", "bE", " ", "cA", "cB", "cC", "cD", "cE", "cF", "cG", "cH", "cI", "cJ",
"cK", "cL", "cM", "cN", "cO", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "cZ", "bF",
"bG", "bH", "bI", "bJ", "bV", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bK", "bL", "bM", "bN", "bO",
"bW", "dA", "dB", "dC", "dD", "dE", "dF", "dG", "dH", "dI", "dJ", "dK", "dL", "dM", "dN", "dO",
"dP", "dQ", "dR", "dS", "dT", "dU", "dV", "dW", "dX", "dY", "dZ", "bP", "bQ", "bR", "bS", "bT"};
static char *C93Table[47] = {"131112", "111213", "111312", "111411", "121113", "121212", "121311",
"111114", "131211", "141111", "211113", "211212", "211311", "221112", "221211", "231111",
"112113", "112212", "112311", "122112", "132111", "111123", "111222", "111321", "121122",
"131121", "212112", "212211", "211122", "211221", "221121", "222111", "112122", "112221",
"122121", "123111", "121131", "311112", "311211", "321111", "112131", "113121", "211131",
"121221", "312111", "311121", "122211"};
/* *********************** CODE 11 ******************** */
int code_11(struct zint_symbol *symbol, unsigned char source[])
{ /* Code 11 */
unsigned int i;
int h, c_digit, c_weight, c_count, k_digit, k_weight, k_count;
int weight[1000], errno;
char dest[1000];
errno = 0;
strcpy(dest, "");
if(strlen(source) > 80) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(NASET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
c_weight = 1;
c_count = 0;
k_weight = 1;
k_count = 0;
/* start character */
concat (dest, "112211");
/* Draw main body of barcode */
for(i = 0; i < strlen(source); i++) {
lookup(NASET, C11Table, source[i], dest);
weight[i] = ctoi(source[i]);
}
/* Calculate C checksum */
for(h = (strlen(source) - 1); h >= 0; h--) {
c_count += (c_weight * weight[h]);
c_weight++;
if(c_weight > 10) {
c_weight = 1;
}
}
c_digit = c_count%11;
/* Draw C checksum */
lookup(NASET, C11Table, itoc(c_digit), dest);
weight[strlen(source)] = c_digit;
/* Calculate K checksum */
for(h = strlen(source); h >= 0; h--) {
k_count += (k_weight * weight[h]);
k_weight++;
if(k_weight > 9) {
k_weight = 1;
}
}
k_digit = k_count%11;
/* Draw K checksum */
lookup(NASET, C11Table, itoc(k_digit), dest);
/* Stop character */
concat (dest, "11221");
h = strlen(source);
source[h] = itoc(c_digit);
source[h + 1] = itoc(k_digit);
source[h + 2] = '\0';
expand(symbol, dest);
strcpy(symbol->text, source);
return errno;
}
int c39(struct zint_symbol *symbol, unsigned char source[])
{ /* Code 39 */
unsigned int i;
unsigned int counter;
char check_digit;
int h, errno;
char dest[1000];
errno = 0;
counter = 0;
strcpy(dest, "");
to_upper(source);
if(strlen(source) > 45) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(TCSET , source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
/* Start character */
concat(dest, "1211212111");
for(i = 0; i < strlen(source); i++) {
lookup(TCSET, C39Table, source[i], dest);
counter += posn(TCSET, source[i]);
}
if(((symbol->symbology == BARCODE_LOGMARS) || (symbol->symbology == BARCODE_CODE39_43)) || (symbol->symbology == BARCODE_EXCODE39_43)) {
counter = counter % 43;
if(counter < 10) {
check_digit = itoc(counter);
} else {
if(counter < 36) {
check_digit = (counter - 10) + 'A';
} else {
switch(counter) {
case 36: check_digit = '-'; break;
case 37: check_digit = '.'; break;
case 38: check_digit = ' '; break;
case 39: check_digit = '$'; break;
case 40: check_digit = '/'; break;
case 41: check_digit = '+'; break;
case 42: check_digit = 37; break;
}
}
}
lookup(TCSET, C39Table, check_digit, dest);
/* Display a space check digit as _, otherwise it looks like an error */
if(check_digit == ' ') {
check_digit = '_';
}
h = strlen(source);
source[h] = check_digit;
source[h + 1] = '\0';
}
/* Stop character */
concat (dest, "121121211");
if(symbol->symbology == BARCODE_LOGMARS) {
/* LOGMARS uses wider 'wide' bars than normal Code 39 */
for(i = 0; i < strlen(dest); i++) {
if(dest[i] == '2') {
dest[i] = '3';
}
}
}
expand(symbol, dest);
if((symbol->symbology == BARCODE_CODE39) || (symbol->symbology == BARCODE_CODE39_43)) {
strcpy(symbol->text, "*");
concat(symbol->text, source);
concat(symbol->text, "*");
} else {
strcpy(symbol->text, source);
}
return errno;
}
int pharmazentral(struct zint_symbol *symbol, unsigned char source[])
{ /* Pharmazentral Nummer (PZN) */
int i, errno;
unsigned int h, count, check_digit;
errno = 0;
count = 0;
h = strlen(source);
if(h != 6) {
strcpy(symbol->errtxt, "error: input wrong length");
return ERROR_TOO_LONG;
}
errno = is_sane(NESET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
for (i = 0; i < h; i++)
{
count += (i + 2) * ctoi(source[i]);
}
for(i = h + 1; i >= 1; i--)
{
source[i] = source[i - 1];
}
source[0] = '-';
check_digit = count%11;
if (check_digit == 11) { check_digit = 0; }
source[h + 1] = itoc(check_digit);
source[h + 2] = '\0';
errno = c39(symbol, source);
strcpy(symbol->text, source);
return errno;
}
/* ************** EXTENDED CODE 39 *************** */
int ec39(struct zint_symbol *symbol, unsigned char source[])
{ /* Extended Code 39 - ISO/IEC 16388:2007 Annex A */
char buffer[100];
unsigned int i;
strcpy(buffer, "");
int ascii_value;
int errno;
errno = 0;
if(strlen(source) > 45) {
/* only stops strings which are far too long - actual length of the barcode
depends on the type of data being encoded - if it's too long it's picked up
by c39() */
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
for(i = 0; i < strlen(source); i++) {
if(source[i] > 127) {
/* Cannot encode extended ASCII */
strcpy(symbol->errtxt, "error: invalid characters in input data");
return ERROR_INVALID_DATA;
}
}
/* Creates a buffer string and places control characters into it */
for(i = 0; i < strlen(source); i++) {
ascii_value = source[i];
concat(buffer, EC39Ctrl[ascii_value]);
}
/* Then sends the buffer to the C39 function */
errno = c39(symbol, buffer);
strcpy(symbol->text, source);
return errno;
}
/* ******************** CODE 93 ******************* */
int c93(struct zint_symbol *symbol, unsigned char source[])
{ /* Code 93 is an advancement on Code 39 and the definition is a lot tighter */
/* TCSET includes the extra characters a, b, c and d to represent Code 93 specific
shift characters 1, 2, 3 and 4 respectively. These characters are never used by
c39() and ec39() */
unsigned int i;
int h, weight, c, k, values[100], errno;
char buffer[100], temp[2];
char set_copy[] = TCSET;
strcpy(buffer, "");
int ascii_value;
char dest[1000];
errno = 0;
strcpy(dest, "");
if(strlen(source) > 45) {
/* This stops rediculously long input - the actual length of the barcode
depends on the type of data */
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
for(i = 0; i < strlen(source); i++) {
if(source[i] > 127) {
/* Cannot encode extended ASCII */
strcpy(symbol->errtxt, "error: invalid characters in input data");
return ERROR_INVALID_DATA;
}
}
/* Start character */
concat(dest, "111141");
/* Message Content */
for(i = 0; i < strlen(source); i++) {
ascii_value = source[i];
concat(buffer, C93Ctrl[ascii_value]);
}
/* Now we can check the true length of the barcode */
if(strlen(buffer) > 45) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
for(i = 0; i < strlen(buffer); i++) {
values[i] = posn(TCSET, buffer[i]);
}
/* Putting the data into dest[] is not done until after check digits are calculated */
/* Check digit C */
c = 0;
weight = 1;
for(h = strlen(buffer) - 1; h >= 0; h--)
{
c += values[h] * weight;
weight ++;
if(weight == 21)
{
weight = 1;
}
}
c = c % 47;
/* Because concat() requires a string as its second argument the check digit is converted
to a character which is then put in temp[] before being added to buffer[] - its
a bit long winded but avoids putting yet another function into common.c */
values[strlen(buffer)] = c;
temp[0] = set_copy[c];
temp[1] = '\0';
concat(buffer, temp);
/* Check digit K */
k = 0;
weight = 1;
for(h = strlen(buffer) - 1; h >= 0; h--)
{
k += values[h] * weight;
weight ++;
if(weight == 16)
{
weight = 1;
}
}
k = k % 47;
temp[0] = set_copy[k];
temp[1] = '\0';
concat(buffer, temp);
for(i = 0; i < strlen(buffer); i++) {
lookup(TCSET, C93Table, buffer[i], dest);
}
/* Stop character */
concat(dest, "1111411");
h = strlen(source);
source[h] = set_copy[c];
source[h + 1] = set_copy[k];
source[h + 2] = '\0';
expand(symbol, dest);
strcpy(symbol->text, source);
return errno;
}

846
backend/code128.c Normal file
View File

@ -0,0 +1,846 @@
/* code128.c - Handles Code 128 and derivatives */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "common.h"
#define TRUE 1
#define FALSE 0
#define SHIFTA 90
#define LATCHA 91
#define SHIFTB 92
#define LATCHB 93
#define SHIFTC 94
#define LATCHC 95
#define AORB 96
#define ABORC 97
int list[2][170];
/* Code 128 tables checked against ISO/IEC 15417:2007 */
static char *C128Table[107] = {"212222", "222122", "222221", "121223", "121322", "131222", "122213",
"122312", "132212", "221213", "221312", "231212", "112232", "122132", "122231", "113222",
"123122", "123221", "223211", "221132", "221231", "213212", "223112", "312131", "311222",
"321122", "321221", "312212", "322112", "322211", "212123", "212321", "232121", "111323",
"131123", "131321", "112313", "132113", "132311", "211313", "231113", "231311", "112133",
"112331", "132131", "113123", "113321", "133121", "313121", "211331", "231131", "213113",
"213311", "213131", "311123", "311321", "331121", "312113", "312311", "332111", "314111",
"221411", "431111", "111224", "111422", "121124", "121421", "141122", "141221", "112214",
"112412", "122114", "122411", "142112", "142211", "241211", "221114", "413111", "241112",
"134111", "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112",
"421211", "212141", "214121", "412121", "111143", "111341", "131141", "114113", "114311",
"411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232",
"2331112"};
/* Code 128 character encodation - Table 1 */
int parunmodd(unsigned char llyth)
{
int modd;
modd = 0;
if(llyth <= 31) { modd = SHIFTA; }
if((llyth >= 32) && (llyth <= 95)) { modd = AORB; }
if((llyth >= 48) && (llyth <= 57)) { modd = ABORC; }
if((llyth >= 96) && (llyth <= 127)) { modd = SHIFTB; }
if((llyth >= 128) && (llyth <= 159)) { modd = SHIFTA; }
if((llyth >= 160) && (llyth <= 223)) { modd = AORB; }
if(llyth >= 224) { modd = SHIFTB; }
return modd;
}
void grwp(int *indexliste)
{
int i, j;
/* bring together same type blocks */
if(*(indexliste) > 1) {
i = 1;
while(i < *(indexliste)) {
if(list[1][i - 1] == list[1][i]) {
/* bring together */
list[0][i - 1] = list[0][i - 1] + list[0][i];
j = i + 1;
/* decreace the list */
while(j < *(indexliste)) {
list[0][j - 1] = list[0][j];
list[1][j - 1] = list[1][j];
j++;
}
*(indexliste) = *(indexliste) - 1;
i--;
}
i++;
}
}
}
void dxsmooth(int *indexliste)
{ /* Implements rules from ISO 15417 Annex E */
int i, this, last, next, length;
for(i = 0; i < *(indexliste); i++) {
this = list[1][i];
length = list[0][i];
if(i != 0) { last = list[1][i - 1]; } else { last = FALSE; }
if(i != *(indexliste) - 1) { next = list[1][i + 1]; } else { next = FALSE; }
if(i == 0) { /* first block */
if((*(indexliste) == 1) && ((length == 2) && (this == ABORC))) { /* Rule 1a */ list[1][i] = LATCHC; }
if(this == ABORC) {
if(length >= 4) {/* Rule 1b */ list[1][i] = LATCHC; } else { list[1][i] = AORB; this = AORB; }
}
if(this == SHIFTA) { /* Rule 1c */ list[1][i] = LATCHA; }
if((this == AORB) && (next == SHIFTA)) { /* Rule 1c */ list[1][i] = LATCHA; this = LATCHA; }
if(this == AORB) { /* Rule 1d */ list[1][i] = LATCHB; }
} else {
if((this == ABORC) && (length >= 4)) { /* Rule 3 */ list[1][i] = LATCHC; this = LATCHC; }
if(this == ABORC) { list[1][i] = AORB; this = AORB; }
if((this == AORB) && (last == LATCHA)) { list[1][i] = LATCHA; this = LATCHA; }
if((this == AORB) && (last == LATCHB)) { list[1][i] = LATCHB; this = LATCHB; }
if((this == AORB) && (next == SHIFTA)) { list[1][i] = LATCHA; this = LATCHA; }
if((this == AORB) && (next == SHIFTB)) { list[1][i] = LATCHB; this = LATCHB; }
if(this == AORB) { list[1][i] = LATCHB; this = LATCHB; }
if((this == SHIFTA) && (length > 1)) { /* Rule 4 */ list[1][i] = LATCHA; this = LATCHA; }
if((this == SHIFTB) && (length > 1)) { /* Rule 5 */ list[1][i] = LATCHB; this = LATCHB; }
if((this == SHIFTA) && (last == LATCHA)) { list[1][i] = LATCHA; this = LATCHA; }
if((this == SHIFTB) && (last == LATCHB)) { list[1][i] = LATCHB; this = LATCHB; }
} /* Rule 2 is implimented elsewhere, Rule 6 is implied */
}
grwp(indexliste);
}
void c128_set_a(unsigned char source, char dest[], int values[], int *bar_chars)
{ /* Translate Code 128 Set A characters into barcodes */
/* This set handles all control characters NULL to US */
if(source > 127) {
concat(dest, C128Table[source + 64 - 128]);
values[(*bar_chars)] = source + 64 - 128;
} else {
concat(dest, C128Table[source + 64]);
values[(*bar_chars)] = source + 64;
}
(*bar_chars)++;
}
void c128_set_b(unsigned char source, char dest[], int values[], int *bar_chars)
{ /* Translate Code 128 Set B characters into barcodes */
/* This set handles all characters which are not part of long numbers and not control characters */
if(source > 127) {
concat(dest, C128Table[source - 32 - 128]);
values[(*bar_chars)] = source - 32 - 128;
} else {
concat(dest, C128Table[source - 32]);
values[(*bar_chars)] = source - 32;
}
(*bar_chars)++;
}
void c128_set_c(unsigned char source_a, unsigned char source_b, char dest[], int values[], int *bar_chars)
{ /* Translate Code 128 Set C characters into barcodes */
/* This set handles numbers in a compressed form */
int weight;
weight = (10 * ctoi(source_a)) + ctoi(source_b);
concat(dest, C128Table[weight]);
values[(*bar_chars)] = weight;
(*bar_chars)++;
}
int code_128(struct zint_symbol *symbol, unsigned char source[])
{ /* Handle Code 128 and NVE-18 */
int i, j, k, e_count, values[170], bar_characters, read, total_sum, nve_check;
int errornum, indexchaine, indexliste;
char set[170], fset[170], mode, last_set, last_fset;
float glyph_count;
char dest[1000];
errornum = 0;
strcpy(dest, "");
j = 0;
e_count = 0;
bar_characters = 0;
nve_check = 0;
for(i = 0; i < 170; i++) {
values[i] = 0;
set[i] = ' ';
fset[i] = ' ';
}
if(strlen(source) > 160) {
/* This only blocks rediculously long input - the actual length of the
resulting barcode depends on the type of data, so this is trapped later */
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
/* Add check digit if encoding an NVE18 symbol */
if(symbol->symbology == BARCODE_NVE18) {
errornum = is_sane(NESET, source);
if(errornum == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errornum;
}
if(strlen(source) != 17) {
strcpy(symbol->errtxt, "error: input wrong length");
return ERROR_TOO_LONG;
}
for(i = strlen(source) + 2; i > 1; i--) {
source[i] = source[i - 2];
}
source[0] = '0';
source[1] = '0';
total_sum = 0;
for(i = 0; i < 19; i++)
{
if((i % 2) == 0) {
total_sum += 3 * ctoi(source[i]);
} else {
total_sum += ctoi(source[i]);
}
}
nve_check = 10 - total_sum%10;
source[strlen(source) + 1] = '\0';
source[strlen(source)] = itoc(nve_check);
}
/* Detect extended ASCII characters */
for(i = 0; i < strlen(source); i++) {
if(source[i] >=128) {
fset[i] = 'f';
}
}
fset[i] = '\0';
/* Decide when to latch to extended mode - Annex E note 3 */
for(i = 0; i < strlen(source); i++) {
j = 0;
if(fset[i] == 'f') {
do {
j++;
} while(source[i + j] == 'f');
if((j >= 5) || ((j >= 3) && ((i + j) == strlen(source)))) {
for(k = 0; k <= j; k++) {
source[i + k] = 'F';
}
}
}
}
/* Decide on mode using same system as PDF417 and rules of ISO 15417 Annex E */
indexliste = 0;
indexchaine = 0;
mode = parunmodd(source[indexchaine]);
if((symbol->symbology == BARCODE_CODE128B) && (mode == ABORC)) {
mode = AORB;
}
for(i = 0; i < 170; i++) {
list[0][i] = 0;
}
do {
list[1][indexliste] = mode;
while ((list[1][indexliste] == mode) && (indexchaine < strlen(source))) {
list[0][indexliste]++;
indexchaine++;
mode = parunmodd(source[indexchaine]);
if((symbol->symbology == BARCODE_CODE128B) && (mode == ABORC)) {
mode = AORB;
}
}
indexliste++;
} while (indexchaine < strlen(source));
dxsmooth(&indexliste);
/* Resolve odd length LATCHC blocks */
if((list[1][0] == LATCHC) && ((list[0][0] % 2) == 1)) {
/* Rule 2 */
list[0][1]++;
list[0][0]--;
}
if(indexliste > 1) {
for(i = 1; i < indexliste; i++) {
if((list[1][i] == LATCHC) && ((list[0][i] % 2) == 1)) {
/* Rule 3b */
list[0][i - 1]++;
list[0][i]--;
}
}
}
/* Put set data into set[] */
read = 0;
for(i = 0; i < indexliste; i++) {
for(j = 0; j < list[0][i]; j++) {
switch(list[1][i]) {
case SHIFTA: set[read] = 'a'; break;
case LATCHA: set[read] = 'A'; break;
case SHIFTB: set[read] = 'b'; break;
case LATCHB: set[read] = 'B'; break;
case LATCHC: set[read] = 'C'; break;
}
read++;
}
}
/* Now we can calculate how long the barcode is going to be - and stop it from
being too long */
last_set = ' ';
last_fset = ' ';
glyph_count = 0.0;
for(i = 0; i < strlen(source); i++) {
if((set[i] == 'a') || (set[i] == 'b')) {
glyph_count = glyph_count + 1.0;
}
if(fset[i] == 'f') {
glyph_count = glyph_count + 1.0;
}
if(((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) {
if(set[i] != last_set) {
last_set = set[i];
glyph_count = glyph_count + 1.0;
}
}
if(i == 0) {
if(fset[i] == 'F') {
last_fset = 'F';
glyph_count = glyph_count + 2.0;
}
} else {
if((fset[i] == 'F') && (fset[i - 1] != 'F')) {
last_fset = 'F';
glyph_count = glyph_count + 2.0;
}
if((fset[i] != 'F') && (fset[i - 1] == 'F')) {
last_fset = ' ';
glyph_count = glyph_count + 2.0;
}
}
if(set[i] == 'C') {
glyph_count = glyph_count + 0.5;
} else {
glyph_count = glyph_count + 1.0;
}
}
if(glyph_count > 80.0) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
/* So now we know what start character to use - we can get on with it! */
switch(set[0])
{
case 'A': /* Start A */
concat(dest, C128Table[103]);
values[0] = 103;
break;
case 'B': /* Start B */
concat(dest, C128Table[104]);
values[0] = 104;
break;
case 'C': /* Start C */
concat(dest, C128Table[105]);
values[0] = 105;
break;
}
bar_characters++;
if(symbol->symbology == BARCODE_NVE18) {
concat(dest, C128Table[102]);
values[1] = 102;
bar_characters++;
}
if(fset[0] == 'F') {
switch(set[0]) {
case 'A':
concat(dest, C128Table[101]);
concat(dest, C128Table[101]);
values[bar_characters] = 101;
values[bar_characters + 1] = 101;
break;
case 'B':
concat(dest, C128Table[100]);
concat(dest, C128Table[100]);
values[bar_characters] = 100;
values[bar_characters + 1] = 100;
break;
}
bar_characters += 2;
}
/* Encode the data */
read = 0;
do {
if((read != 0) && (set[read] != set[read - 1]))
{ /* Latch different code set */
switch(set[read])
{
case 'A': concat(dest, C128Table[101]);
values[bar_characters] = 101;
bar_characters++;
break;
case 'B': concat(dest, C128Table[100]);
values[bar_characters] = 100;
bar_characters++;
break;
case 'C': concat(dest, C128Table[99]);
values[bar_characters] = 99;
bar_characters++;
break;
}
}
if((read != 0) && (fset[read] != fset[read - 1])) {
if(fset[read] == 'F') {
/* Latch beginning of extended mode */
switch(set[0]) {
case 'A':
concat(dest, C128Table[101]);
concat(dest, C128Table[101]);
values[bar_characters] = 101;
values[bar_characters + 1] = 101;
break;
case 'B':
concat(dest, C128Table[100]);
concat(dest, C128Table[100]);
values[bar_characters] = 100;
values[bar_characters + 1] = 100;
break;
}
bar_characters += 2;
}
if(fset[read - 1] == 'F') {
/* Latch end of extended mode */
switch(set[0]) {
case 'A':
concat(dest, C128Table[101]);
concat(dest, C128Table[101]);
values[bar_characters] = 101;
values[bar_characters + 1] = 101;
break;
case 'B':
concat(dest, C128Table[100]);
concat(dest, C128Table[100]);
values[bar_characters] = 100;
values[bar_characters + 1] = 100;
break;
}
bar_characters += 2;
}
}
if(fset[i] == 'f') {
/* Shift extended mode */
switch(set[i]) {
case 'A':
concat(dest, C128Table[101]);
values[bar_characters] = 101;
break;
case 'B':
concat(dest, C128Table[100]);
values[bar_characters] = 100;
break;
}
bar_characters++;
}
if((set[i] == 'a') || (set[i] == 'b')) {
/* Insert shift character */
concat(dest, C128Table[98]);
values[bar_characters] = 98;
bar_characters++;
}
switch(set[read])
{ /* Encode data characters */
case 'A': c128_set_a(source[read], dest, values, &bar_characters);
read++;
break;
case 'B': c128_set_b(source[read], dest, values, &bar_characters);
read++;
break;
case 'C': c128_set_c(source[read], source[read + 1], dest, values, &bar_characters);
read += 2;
break;
}
} while (read < strlen(source));
/* check digit calculation */
total_sum = 0;
for(i = 0; i < bar_characters; i++)
{
if(i > 0)
{
values[i] *= i;
}
total_sum += values[i];
}
concat(dest, C128Table[total_sum%103]);
/* Stop character */
concat(dest, C128Table[106]);
expand(symbol, dest);
strcpy(symbol->text, source);
return errornum;
}
int ean_128(struct zint_symbol *symbol, unsigned char source[])
{ /* Handle EAN-128 (Now known as GS1-128) */
int i, j, k, e_count, values[170], bar_characters, read, total_sum;
int errornum, indexchaine, indexliste, ai_latch;
char set[170], mode, last_set, reduced[170], ai_string[4];
float glyph_count;
char dest[1000];
int last_ai, separator_row, linkage_flag;
errornum = 0;
strcpy(dest, "");
linkage_flag = 0;
j = 0;
e_count = 0;
bar_characters = 0;
separator_row = 0;
for(i = 0; i < 170; i++) {
values[i] = 0;
set[i] = ' ';
}
if(strlen(source) > 160) {
/* This only blocks rediculously long input - the actual length of the
resulting barcode depends on the type of data, so this is trapped later */
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
/* Detect extended ASCII characters */
for(i = 0; i < strlen(source); i++) {
if(source[i] >=128) {
strcpy(symbol->errtxt, "error: extended ASCII characters not supported by GS1-128");
return ERROR_INVALID_DATA;
}
}
if(source[0] != '[') {
strcpy(symbol->errtxt, "error: input string doesn't start with AI");
return ERROR_INVALID_DATA;
}
/* if part of a composite symbol make room for the separator pattern */
if(symbol->symbology == BARCODE_EAN128_CC) {
separator_row = symbol->rows;
symbol->row_height[symbol->rows] = 1;
symbol->rows += 1;
}
/* Resolve AI data - put resulting string in 'reduced' */
j = 0;
last_ai = 0;
ai_latch = 1;
for(i = 0; i < strlen(source); i++) {
if((source[i] != '[') && (source[i] != ']')) {
reduced[j] = source[i];
j++;
}
if(source[i] == '[') {
/* Start of an AI string */
if(ai_latch == 0) {
reduced[j] = '[';
j++;
}
ai_string[0] = source[i + 1];
ai_string[1] = source[i + 2];
ai_string[2] = '\0';
last_ai = atoi(ai_string);
ai_latch = 0;
/* The following values from GS1 specification figure 5.3.8.2.1 - 1
"Element Strings with Pre-Defined Length Using Application Identifiers" */
if((last_ai >= 0) && (last_ai <= 4)) { ai_latch = 1; }
if((last_ai >= 11) && (last_ai <= 20)) { ai_latch = 1; }
if(last_ai == 23) { ai_latch = 1; } /* legacy support - see 5.3.8.2.2 */
if((last_ai >= 31) && (last_ai <= 36)) { ai_latch = 1; }
if(last_ai == 41) { ai_latch = 1; }
}
/* The ']' character is simply dropped from the input */
}
reduced[j] = '\0';
/* the character '[' in the reduced string refers to the FNC1 character */
/* Note that no attempt is made to verify that the data to be encoded does
actually conform to the right data length - that is required of the person or
program inputting the data */
/* Decide on mode using same system as PDF417 and rules of ISO 15417 Annex E */
indexliste = 0;
indexchaine = 0;
mode = parunmodd(reduced[indexchaine]);
if(reduced[indexchaine] == '[') {
mode = ABORC;
}
for(i = 0; i < 170; i++) {
list[0][i] = 0;
}
do {
list[1][indexliste] = mode;
while ((list[1][indexliste] == mode) && (indexchaine < strlen(reduced))) {
list[0][indexliste]++;
indexchaine++;
mode = parunmodd(reduced[indexchaine]);
if(reduced[indexchaine] == '[') {
if(indexchaine % 2 == 0) {
mode = ABORC;
} else {
mode = AORB;
}
}
}
indexliste++;
} while (indexchaine < strlen(reduced));
dxsmooth(&indexliste);
/* Resolve odd length LATCHC blocks */
if((list[1][0] == LATCHC) && ((list[0][0] % 2) == 1)) {
/* Rule 2 */
list[0][1]++;
list[0][0]--;
}
if(indexliste > 1) {
for(i = 1; i < indexliste; i++) {
if((list[1][i] == LATCHC) && ((list[0][i] % 2) == 1)) {
/* Rule 3b */
list[0][i - 1]++;
list[0][i]--;
}
}
}
/* Put set data into set[] */
read = 0;
for(i = 0; i < indexliste; i++) {
for(j = 0; j < list[0][i]; j++) {
switch(list[1][i]) {
case SHIFTA: set[read] = 'a'; break;
case LATCHA: set[read] = 'A'; break;
case SHIFTB: set[read] = 'b'; break;
case LATCHB: set[read] = 'B'; break;
case LATCHC: set[read] = 'C'; break;
}
read++;
}
}
/* Now we can calculate how long the barcode is going to be - and stop it from
being too long */
last_set = ' ';
glyph_count = 0.0;
for(i = 0; i < strlen(reduced); i++) {
if((set[i] == 'a') || (set[i] == 'b')) {
glyph_count = glyph_count + 1.0;
}
if(((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) {
if(set[i] != last_set) {
last_set = set[i];
glyph_count = glyph_count + 1.0;
}
}
if(set[i] == 'C') {
glyph_count = glyph_count + 0.5;
} else {
glyph_count = glyph_count + 1.0;
}
}
if(glyph_count > 80.0) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
/* So now we know what start character to use - we can get on with it! */
switch(set[0])
{
case 'A': /* Start A */
concat(dest, C128Table[103]);
values[0] = 103;
break;
case 'B': /* Start B */
concat(dest, C128Table[104]);
values[0] = 104;
break;
case 'C': /* Start C */
concat(dest, C128Table[105]);
values[0] = 105;
break;
}
bar_characters++;
concat(dest, C128Table[102]);
values[1] = 102;
bar_characters++;
/* Encode the data */
read = 0;
do {
if((read != 0) && (set[read] != set[read - 1]))
{ /* Latch different code set */
switch(set[read])
{
case 'A': concat(dest, C128Table[101]);
values[bar_characters] = 101;
bar_characters++;
break;
case 'B': concat(dest, C128Table[100]);
values[bar_characters] = 100;
bar_characters++;
break;
case 'C': concat(dest, C128Table[99]);
values[bar_characters] = 99;
bar_characters++;
break;
}
}
if((set[i] == 'a') || (set[i] == 'b')) {
/* Insert shift character */
concat(dest, C128Table[98]);
values[bar_characters] = 98;
bar_characters++;
}
if(reduced[read] != '[') {
switch(set[read])
{ /* Encode data characters */
case 'A': c128_set_a(reduced[read], dest, values, &bar_characters);
read++;
break;
case 'B': c128_set_b(reduced[read], dest, values, &bar_characters);
read++;
break;
case 'C': c128_set_c(reduced[read], reduced[read + 1], dest, values, &bar_characters);
read += 2;
break;
}
} else {
concat(dest, C128Table[102]);
values[bar_characters] = 102;
bar_characters++;
read++;
}
} while (read < strlen(reduced));
/* "...note that the linkage flag is an extra code set character between
the last data character and the Symbol Check Character" (GS1 Specification) */
/* Linkage flags in GS1-128 are determined by ISO/IEC 24723 section 7.4 */
switch(symbol->option_1) {
case 1:
case 2:
/* CC-A or CC-B 2D component */
switch(set[strlen(reduced) - 1]) {
case 'A': linkage_flag = 100; break;
case 'B': linkage_flag = 99; break;
case 'C': linkage_flag = 101; break;
}
break;
case 3:
/* CC-C 2D component */
switch(set[strlen(reduced) - 1]) {
case 'A': linkage_flag = 99; break;
case 'B': linkage_flag = 101; break;
case 'C': linkage_flag = 100; break;
}
break;
}
if(linkage_flag != 0) {
concat(dest, C128Table[linkage_flag]);
values[bar_characters] = linkage_flag;
bar_characters++;
}
/* check digit calculation */
total_sum = 0;
for(i = 0; i < bar_characters; i++)
{
if(i > 0)
{
values[i] *= i;
}
total_sum += values[i];
}
concat(dest, C128Table[total_sum%103]);
/* Stop character */
concat(dest, C128Table[106]);
expand(symbol, dest);
/* Add the separator pattern for composite symbols */
if(symbol->symbology == BARCODE_EAN128_CC) {
for(i = 0; i < symbol->width; i++) {
if(symbol->encoded_data[separator_row + 1][i] != '1') {
symbol->encoded_data[separator_row][i] = '1';
}
}
}
for(i = 0; i <= strlen(source); i++) {
if((source[i] != '[') && (source[i] != ']')) {
symbol->text[i] = source[i];
}
if(source[i] == '[') {
symbol->text[i] = '(';
}
if(source[i] == ']') {
symbol->text[i] = ')';
}
}
return errornum;
}

477
backend/code16k.c Normal file
View File

@ -0,0 +1,477 @@
/* code16k.c - Handles Code 16k stacked symbology */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/* Updated to comply with BS EN 12323:2005 */
/* up to 77 characters or 154 numbers */
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
#define TRUE 1
#define FALSE 0
#define SHIFTA 90
#define LATCHA 91
#define SHIFTB 92
#define LATCHB 93
#define SHIFTC 94
#define LATCHC 95
#define AORB 96
#define ABORC 97
#define CANDB 98
#define CANDBB 99
int list[2][170];
/* EN 12323 Table 1 - "Code 16K" character encodations */
static char *C16KTable[107] = {"212222", "222122", "222221", "121223", "121322", "131222", "122213",
"122312", "132212", "221213", "221312", "231212", "112232", "122132", "122231", "113222",
"123122", "123221", "223211", "221132", "221231", "213212", "223112", "312131", "311222",
"321122", "321221", "312212", "322112", "322211", "212123", "212321", "232121", "111323",
"131123", "131321", "112313", "132113", "132311", "211313", "231113", "231311", "112133",
"112331", "132131", "113123", "113321", "133121", "313121", "211331", "231131", "213113",
"213311", "213131", "311123", "311321", "331121", "312113", "312311", "332111", "314111",
"221411", "431111", "111224", "111422", "121124", "121421", "141122", "141221", "112214",
"112412", "122114", "122411", "142112", "142211", "241211", "221114", "413111", "241112",
"134111", "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112",
"421211", "212141", "214121", "412121", "111143", "111341", "131141", "114113", "114311",
"411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232",
"211133"};
/* EN 12323 Table 3 and Table 4 - Start patterns and stop patterns */
static char *C16KStartStop[8] = {"3211", "2221", "2122", "1411", "1132", "1231", "1114", "3112"};
/* EN 12323 Table 5 - Start and stop values defining row numbers */
static int C16KStartValues[16] = {0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7};
static int C16KStopValues[16] = {0, 1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3};
int parunmodd(unsigned char llyth);
void grwp(int *indexliste);
void reysmooth(int *indexliste)
{ /* Implements rules from EN 12323 */
int i, this, last, next, length;
for(i = 0; i < *(indexliste); i++) {
this = list[1][i];
length = list[0][i];
if(i != 0) { last = list[1][i - 1]; } else { last = FALSE; }
if(i != *(indexliste) - 1) { next = list[1][i + 1]; } else { next = FALSE; }
if(i == 0) { /* first block */
if((*(indexliste) == 1) && ((length == 2) && (this == ABORC))) { /* Rule 1a */ list[1][i] = LATCHC; }
if(this == ABORC) {
if(length >= 4) {/* Rule 1b */ list[1][i] = LATCHC; } else { list[1][i] = AORB; this = AORB; }
}
if(this == SHIFTA) { /* Rule 1c */ list[1][i] = LATCHA; }
if((this == AORB) && (next == SHIFTA)) { /* Rule 1c */ list[1][i] = LATCHA; this = LATCHA; }
if(this == AORB) { /* Rule 1d */ list[1][i] = LATCHB; }
} else {
if((this == ABORC) && (length >= 4)) { /* Rule 3 */ list[1][i] = LATCHC; this = LATCHC; }
if(this == ABORC) { list[1][i] = AORB; this = AORB; }
if((this == AORB) && (last == LATCHA)) { list[1][i] = LATCHA; this = LATCHA; }
if((this == AORB) && (last == LATCHB)) { list[1][i] = LATCHB; this = LATCHB; }
if((this == AORB) && (next == SHIFTA)) { list[1][i] = LATCHA; this = LATCHA; }
if((this == AORB) && (next == SHIFTB)) { list[1][i] = LATCHB; this = LATCHB; }
if(this == AORB) { list[1][i] = LATCHB; this = LATCHB; }
if((this == SHIFTA) && (length > 1)) { /* Rule 4 */ list[1][i] = LATCHA; this = LATCHA; }
if((this == SHIFTB) && (length > 1)) { /* Rule 5 */ list[1][i] = LATCHB; this = LATCHB; }
if((this == SHIFTA) && (last == LATCHA)) { list[1][i] = LATCHA; this = LATCHA; }
if((this == SHIFTB) && (last == LATCHB)) { list[1][i] = LATCHB; this = LATCHB; }
} /* Rule 2 is implimented elsewhere, Rule 6 is implied */
}
grwp(indexliste);
}
void c16k_set_a(unsigned char source, int values[], int *bar_chars)
{
if(source > 127) {
values[(*bar_chars)] = source + 64 - 128;
} else {
values[(*bar_chars)] = source + 64;
}
(*bar_chars)++;
}
void c16k_set_b(unsigned char source, int values[], int *bar_chars)
{
if(source > 127) {
values[(*bar_chars)] = source - 32 - 128;
} else {
values[(*bar_chars)] = source - 32;
}
(*bar_chars)++;
}
void c16k_set_c(unsigned char source_a, unsigned char source_b, int values[], int *bar_chars)
{
int weight;
weight = (10 * ctoi(source_a)) + ctoi(source_b);
values[(*bar_chars)] = weight;
(*bar_chars)++;
}
int code16k(struct zint_symbol *symbol, unsigned char source[])
{
char width_pattern[100];
int current_row, rows_needed, flip_flop, looper, first_check, second_check;
int indexliste, indexchaine, pads_needed;
char set[160], fset[160], mode, last_set, last_fset;
unsigned int i, j, k, m, e_count, read, mx_reader, writer;
unsigned int values[160];
unsigned int bar_characters;
strcpy(width_pattern, "");
float glyph_count;
int errornum, first_sum, second_sum;
errornum = 0;
if(strlen(source) > 157) {
strcpy(symbol->errtxt, "error: input too long");
return 6;
}
e_count = 0;
bar_characters = 0;
for(i = 0; i < 160; i++) {
values[i] = 0;
set[i] = ' ';
fset[i] = ' ';
}
/* Detect extended ASCII characters */
for(i = 0; i < strlen(source); i++) {
if(source[i] >=128) {
fset[i] = 'f';
}
}
fset[i] = '\0';
/* Decide when to latch to extended mode */
for(i = 0; i < strlen(source); i++) {
j = 0;
if(fset[i] == 'f') {
do {
j++;
} while(source[i + j] == 'f');
if((j >= 5) || ((j >= 3) && ((i + j) == strlen(source)))) {
for(k = 0; k <= j; k++) {
source[i + k] = 'F';
}
}
}
}
/* Detect mode A, B and C characters */
indexliste = 0;
indexchaine = 0;
mode = parunmodd(source[indexchaine]);
for(i = 0; i < 160; i++) {
list[0][i] = 0;
}
do {
list[1][indexliste] = mode;
while ((list[1][indexliste] == mode) && (indexchaine < strlen(source))) {
list[0][indexliste]++;
indexchaine++;
mode = parunmodd(source[indexchaine]);
}
indexliste++;
} while (indexchaine < strlen(source));
reysmooth(&indexliste);
/* Resolve odd length LATCHC blocks */
if((list[1][0] == LATCHC) && ((list[0][0] % 2) == 1)) {
for(i = 1; i <= indexliste; i++) {
list[0][i] = list[0][i - 1];
list[1][i] = list[1][i - 1];
}
list[0][1]--;
list[0][0] = 1;
list[1][0] = LATCHB;
indexliste++;
}
if(indexliste > 1) {
for(i = 1; i < indexliste; i++) {
if((list[1][i] == LATCHC) && ((list[0][i] % 2) == 1)) {
list[0][i - 1]++;
list[0][i]--;
}
}
}
/* Put set data into set[] */
read = 0;
for(i = 0; i < indexliste; i++) {
for(j = 0; j < list[0][i]; j++) {
switch(list[1][i]) {
case SHIFTA: set[read] = 'a'; break;
case LATCHA: set[read] = 'A'; break;
case SHIFTB: set[read] = 'b'; break;
case LATCHB: set[read] = 'B'; break;
case LATCHC: set[read] = 'C'; break;
}
read++;
}
}
/* Make sure the data will fit in the symbol */
last_set = ' ';
last_fset = ' ';
glyph_count = 0.0;
for(i = 0; i < strlen(source); i++) {
if((set[i] == 'a') || (set[i] == 'b')) {
glyph_count = glyph_count + 1.0;
}
if(fset[i] == 'f') {
glyph_count = glyph_count + 1.0;
}
if(((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) {
if(set[i] != last_set) {
last_set = set[i];
glyph_count = glyph_count + 1.0;
}
}
if(i == 0) {
if((set[i] == 'B') && (set[1] == 'C')) {
glyph_count = glyph_count - 1.0;
}
if((set[i] == 'B') && (set[1] == 'B')) {
if(set[2] == 'C') {
glyph_count = glyph_count - 1.0;
}
}
if(fset[i] == 'F') {
last_fset = 'F';
glyph_count = glyph_count + 2.0;
}
} else {
if((fset[i] == 'F') && (fset[i - 1] != 'F')) {
last_fset = 'F';
glyph_count = glyph_count + 2.0;
}
if((fset[i] != 'F') && (fset[i - 1] == 'F')) {
last_fset = ' ';
glyph_count = glyph_count + 2.0;
}
}
if(set[i] == 'C') {
glyph_count = glyph_count + 0.5;
} else {
glyph_count = glyph_count + 1.0;
}
}
if(glyph_count > 77.0) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
/* Calculate how tall the symbol will be */
glyph_count = glyph_count + 2.0;
i = glyph_count;
rows_needed = (i/5);
if(i%5 > 0) { rows_needed++; }
/* start with the mode character - Table 2 */
m = 0;
switch(set[0]) {
case 'A': m = 0; break;
case 'B': m = 1; break;
case 'C': m = 2; break;
}
if((set[0] == 'B') && (set[1] == 'C')) { m = 5; }
if(((set[0] == 'B') && (set[1] == 'B')) && (set[2] == 'C')) { m = 6; }
values[bar_characters] = (7 * (rows_needed - 2)) + m; /* see 4.3.4.2 */
bar_characters++;
if(fset[0] == 'F') {
switch(set[0]) {
case 'A':
values[bar_characters] = 101;
values[bar_characters + 1] = 101;
break;
case 'B':
values[bar_characters] = 100;
values[bar_characters + 1] = 100;
break;
}
bar_characters += 2;
}
/* Encode the data */
read = 0;
do {
if((read != 0) && (set[read] != set[read - 1]))
{ /* Latch different code set */
switch(set[read])
{
case 'A':
values[bar_characters] = 101;
bar_characters++;
break;
case 'B':
values[bar_characters] = 100;
bar_characters++;
break;
case 'C':
if(!((read == 1) && (set[0] == 'B'))) { /* Not Mode C/Shift B */
if(!((read == 2) && ((set[0] == 'B') && (set[1] == 'B')))) {
/* Not Mode C/Double Shift B */
values[bar_characters] = 99;
bar_characters++;
}
}
break;
}
}
if((read != 0) && (fset[read] != fset[read - 1])) {
if(fset[read] == 'F') {
/* Latch beginning of extended mode */
switch(set[0]) {
case 'A':
values[bar_characters] = 101;
values[bar_characters + 1] = 101;
break;
case 'B':
values[bar_characters] = 100;
values[bar_characters + 1] = 100;
break;
}
bar_characters += 2;
}
if(fset[read - 1] == 'F') {
/* Latch end of extended mode */
switch(set[0]) {
case 'A':
values[bar_characters] = 101;
values[bar_characters + 1] = 101;
break;
case 'B':
values[bar_characters] = 100;
values[bar_characters + 1] = 100;
break;
}
bar_characters += 2;
}
}
if(fset[i] == 'f') {
/* Shift extended mode */
switch(set[i]) {
case 'A':
values[bar_characters] = 101;
break;
case 'B':
values[bar_characters] = 100;
break;
}
bar_characters++;
}
if((set[i] == 'a') || (set[i] == 'b')) {
/* Insert shift character */
values[bar_characters] = 98;
bar_characters++;
}
switch(set[read])
{ /* Encode data characters */
case 'A': c16k_set_a(source[read], values, &bar_characters);
read++;
break;
case 'B': c16k_set_b(source[read], values, &bar_characters);
read++;
break;
case 'C': c16k_set_c(source[read], source[read + 1], values, &bar_characters);
read += 2;
break;
}
} while (read < strlen(source));
pads_needed = 5 - ((bar_characters + 2) % 5);
if(pads_needed == 5) {
pads_needed = 0;
}
for(i = 0; i < pads_needed; i++) {
values[bar_characters] = 106;
bar_characters++;
}
first_sum = 0;
second_sum = 0;
for(i = 0; i < bar_characters; i++)
{
first_sum += (i+2) * values[i];
second_sum += (i+1) * values[i];
}
first_check = first_sum % 107;
second_sum += first_check * (bar_characters + 1);
second_check = second_sum % 107;
values[bar_characters] = first_check;
values[bar_characters + 1] = second_check;
bar_characters += 2;
for(current_row = 0; current_row < rows_needed; current_row++) {
strcpy(width_pattern, "");
concat(width_pattern, C16KStartStop[C16KStartValues[current_row]]);
concat(width_pattern, "1");
for(i = 0; i < 5; i++) {
concat(width_pattern, C16KTable[values[(current_row * 5) + i]]);
}
concat(width_pattern, C16KStartStop[C16KStopValues[current_row]]);
/* Write the information into the symbol */
writer = 0;
flip_flop = 1;
for (mx_reader = 0; mx_reader < strlen(width_pattern); mx_reader++) {
for(looper = 0; looper < ctoi(width_pattern[mx_reader]); looper++) {
if(flip_flop == 1) {
symbol->encoded_data[current_row][writer] = '1';
writer++; }
else {
symbol->encoded_data[current_row][writer] = '0';
writer++; }
}
if(flip_flop == 0) { flip_flop = 1; } else { flip_flop = 0; }
}
symbol->row_height[current_row] = 8;
}
symbol->rows = rows_needed;
symbol->width = 70;
return errornum;
}

126
backend/common.c Normal file
View File

@ -0,0 +1,126 @@
/* common.c - Contains functions needed for a number of barcodes */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
#define SSET "0123456789ABCDEF"
void concat(char dest[], char source[])
{ /* Concatinates dest[] with the contents of source[], copying /0 as well */
unsigned int i, j;
j = strlen(dest);
for(i = 0; i <= strlen(source); i++) {
dest[i + j] = source[i]; }
}
int ctoi(char source)
{ /* Converts a character 0-9 to its equivalent integer value */
if((source >= '0') && (source <= '9'))
return (source - '0');
return(source - 'A' + 10);
}
char itoc(int source)
{ /* Converts an integer value to its hexadecimal character */
if ((source >= 0) && (source <= 9)) {
return ('0' + source); }
else {
return ('A' + (source - 10)); }
}
void to_upper(unsigned char source[])
{ /* Converts lower case characters to upper case in a string source[] */
unsigned int i;
for (i = 0; i < strlen(source); i++) {
if ((source[i] >= 'a') && (source[i] <= 'z')) {
source [i] = (source[i] - 'a') + 'A'; }
}
}
int is_sane(char test_string[], unsigned char source[])
{ /* Verifies that a string only uses valid characters */
unsigned int i, j, latch;
for(i = 0; i < strlen(source); i++) {
latch = FALSE;
for(j = 0; j < strlen(test_string); j++) {
if (source[i] == test_string[j]) { latch = TRUE; } }
if (!(latch)) {
return ERROR_INVALID_DATA; }
}
return 0;
}
int posn(char set_string[], char data)
{ /* Returns the position of data in set_string */
unsigned int i;
for(i = 0; i < strlen(set_string); i++) {
if (data == set_string[i]) { return i; } }
return 0;
}
void lookup(char set_string[], char *table[], char data, char dest[])
{ /* Replaces huge switch statements for looking up in tables */
unsigned int i;
for(i = 0; i < strlen(set_string); i++) {
if (data == set_string[i]) { concat(dest, table[i]); } }
}
void expand(struct zint_symbol *symbol, char data[])
{ /* Expands from a width pattern to a bit pattern */
int reader, writer, i;
char latch;
writer = 0;
latch = '1';
for(reader = 0; reader < strlen(data); reader++) {
for(i = 0; i < ctoi(data[reader]); i++) {
symbol->encoded_data[symbol->rows][writer] = latch;
writer++;
}
if(latch == '1') {
latch = '0';
} else {
latch = '1';
}
}
if(symbol->symbology != BARCODE_PHARMA) {
if(writer > symbol->width) {
symbol->width = writer;
}
} else {
/* Pharmacode One ends with a space - adjust for this */
if(writer > symbol->width + 2) {
symbol->width = writer - 2;
}
}
symbol->rows = symbol->rows + 1;
}

38
backend/common.h Normal file
View File

@ -0,0 +1,38 @@
/* common.h - Header for all common functions in common.c */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart (zint@hotmail.co.uk)
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 2 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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/* Used in some logic */
#define FALSE 0
#define TRUE 1
/* The most commonly used set */
#define NESET "0123456789"
#include "zint.h"
void concat(char dest[], char source[]);
int ctoi(char source);
char itoc(int source);
void to_upper(unsigned char source[]);
int is_sane(char test_string[], unsigned char source[]);
void lookup(char set_string[], char *table[], char data, char dest[]);
int posn(char set_string[], char data);
void expand(struct zint_symbol *symbol, char data[]);

1916
backend/composite.c Normal file

File diff suppressed because it is too large Load Diff

62
backend/composite.h Normal file
View File

@ -0,0 +1,62 @@
/* composite.c - Tables for UCC.EAN Composite Symbols */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#define NUMERIC 110
#define ALPHA 97
#define ISOIEC 105
#define INVALID_CHAR 100
#define ANY_ENC 120
#define ALPHA_OR_ISO 121
/* CC-A component coefficients from ISO/IEC 24728:2006 Annex F */
static int ccaCoeffs[30] = {
/* k = 4 */
522, 568, 723, 809,
/* k = 5 */
427, 919, 460, 155, 566,
/* k = 6 */
861, 285, 19, 803, 17, 766,
/* k = 7 */
76, 925, 537, 597, 784, 691, 437,
/* k = 8 */
237, 308, 436, 284, 646, 653, 428, 379
};
/* rows, error codewords, k-offset of valid CC-A sizes from ISO/IEC 24723:2006 Table 9 */
static int ccaVariants[51] = {
5, 6, 7, 8, 9, 10, 12, 4, 5, 6, 7, 8, 3, 4, 5, 6, 7,
4, 4, 5, 5, 6, 6, 7, 4, 5, 6, 7, 7, 4, 5, 6, 7, 8,
0, 0, 4, 4, 9, 9, 15, 0, 4, 9, 15, 15, 0, 4, 9, 15, 22
};
/* following is Left RAP, Centre RAP, Right RAP and Start Cluster from ISO/IEC 24723:2006 tables 10 and 11 */
static int aRAPTable[68] = {
39, 1, 32, 8, 14, 43, 20, 11, 1, 5, 15, 21, 40, 43, 46, 34, 29,
0, 0, 0, 0, 0, 0, 0, 43, 33, 37, 47, 1, 20, 23, 2, 14, 9,
19, 33, 12, 40, 4, 23, 52, 23, 13, 17, 27, 33, 52, 3, 6, 46, 41,
6, 0, 3, 3, 3, 0, 3, 3, 0, 3, 6, 6, 0, 0, 0, 0, 3
};
/* Row Address Patterns are as defined in pdf417.h */

961
backend/dm200.c Normal file
View File

@ -0,0 +1,961 @@
/**
*
* IEC16022 bar code generation
* Adrian Kennard, Andrews & Arnold Ltd
* with help from Cliff Hones on the RS coding
*
* (c) 2004 Adrian Kennard, Andrews & Arnold Ltd
* (c) 2006 Stefan Schmidt <stefan@datenfreihafen.org>
*
* 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 2 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, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <malloc.h>
#include "reedsol.h"
#include "dm200.h"
static struct ecc200matrix_s {
int H, W;
int FH, FW;
int bytes;
int datablock, rsblock;
} ecc200matrix[] = {
10, 10, 10, 10, 3, 3, 5, //
12, 12, 12, 12, 5, 5, 7, //
8, 18, 8, 18, 5, 5, 7, //
14, 14, 14, 14, 8, 8, 10, //
8, 32, 8, 16, 10, 10, 11, //
16, 16, 16, 16, 12, 12, 12, //
12, 26, 12, 26, 16, 16, 14, //
18, 18, 18, 18, 18, 18, 14, //
20, 20, 20, 20, 22, 22, 18, //
12, 36, 12, 18, 22, 22, 18, //
22, 22, 22, 22, 30, 30, 20, //
16, 36, 16, 18, 32, 32, 24, //
24, 24, 24, 24, 36, 36, 24, //
26, 26, 26, 26, 44, 44, 28, //
16, 48, 16, 24, 49, 49, 28, //
32, 32, 16, 16, 62, 62, 36, //
36, 36, 18, 18, 86, 86, 42, //
40, 40, 20, 20, 114, 114, 48, //
44, 44, 22, 22, 144, 144, 56, //
48, 48, 24, 24, 174, 174, 68, //
52, 52, 26, 26, 204, 102, 42, //
64, 64, 16, 16, 280, 140, 56, //
72, 72, 18, 18, 368, 92, 36, //
80, 80, 20, 20, 456, 114, 48, //
88, 88, 22, 22, 576, 144, 56, //
96, 96, 24, 24, 696, 174, 68, //
104, 104, 26, 26, 816, 136, 56, //
120, 120, 20, 20, 1050, 175, 68, //
132, 132, 22, 22, 1304, 163, 62, //
144, 144, 24, 24, 1558, 156, 62, // 156*4+155*2
0 // terminate
};
// simple checked response malloc
static void *safemalloc(int n)
{
void *p = malloc(n);
if (!p) {
fprintf(stderr, "Malloc(%d) failed\n", n);
exit(1);
}
return p;
}
// Annex M placement alorithm low level
static void ecc200placementbit(int *array, int NR, int NC, int r, int c,
int p, char b)
{
if (r < 0) {
r += NR;
c += 4 - ((NR + 4) % 8);
}
if (c < 0) {
c += NC;
r += 4 - ((NC + 4) % 8);
}
array[r * NC + c] = (p << 3) + b;
}
static void ecc200placementblock(int *array, int NR, int NC, int r,
int c, int p)
{
ecc200placementbit(array, NR, NC, r - 2, c - 2, p, 7);
ecc200placementbit(array, NR, NC, r - 2, c - 1, p, 6);
ecc200placementbit(array, NR, NC, r - 1, c - 2, p, 5);
ecc200placementbit(array, NR, NC, r - 1, c - 1, p, 4);
ecc200placementbit(array, NR, NC, r - 1, c - 0, p, 3);
ecc200placementbit(array, NR, NC, r - 0, c - 2, p, 2);
ecc200placementbit(array, NR, NC, r - 0, c - 1, p, 1);
ecc200placementbit(array, NR, NC, r - 0, c - 0, p, 0);
}
static void ecc200placementcornerA(int *array, int NR, int NC, int p)
{
ecc200placementbit(array, NR, NC, NR - 1, 0, p, 7);
ecc200placementbit(array, NR, NC, NR - 1, 1, p, 6);
ecc200placementbit(array, NR, NC, NR - 1, 2, p, 5);
ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4);
ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3);
ecc200placementbit(array, NR, NC, 1, NC - 1, p, 2);
ecc200placementbit(array, NR, NC, 2, NC - 1, p, 1);
ecc200placementbit(array, NR, NC, 3, NC - 1, p, 0);
}
static void ecc200placementcornerB(int *array, int NR, int NC, int p)
{
ecc200placementbit(array, NR, NC, NR - 3, 0, p, 7);
ecc200placementbit(array, NR, NC, NR - 2, 0, p, 6);
ecc200placementbit(array, NR, NC, NR - 1, 0, p, 5);
ecc200placementbit(array, NR, NC, 0, NC - 4, p, 4);
ecc200placementbit(array, NR, NC, 0, NC - 3, p, 3);
ecc200placementbit(array, NR, NC, 0, NC - 2, p, 2);
ecc200placementbit(array, NR, NC, 0, NC - 1, p, 1);
ecc200placementbit(array, NR, NC, 1, NC - 1, p, 0);
}
static void ecc200placementcornerC(int *array, int NR, int NC, int p)
{
ecc200placementbit(array, NR, NC, NR - 3, 0, p, 7);
ecc200placementbit(array, NR, NC, NR - 2, 0, p, 6);
ecc200placementbit(array, NR, NC, NR - 1, 0, p, 5);
ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4);
ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3);
ecc200placementbit(array, NR, NC, 1, NC - 1, p, 2);
ecc200placementbit(array, NR, NC, 2, NC - 1, p, 1);
ecc200placementbit(array, NR, NC, 3, NC - 1, p, 0);
}
static void ecc200placementcornerD(int *array, int NR, int NC, int p)
{
ecc200placementbit(array, NR, NC, NR - 1, 0, p, 7);
ecc200placementbit(array, NR, NC, NR - 1, NC - 1, p, 6);
ecc200placementbit(array, NR, NC, 0, NC - 3, p, 5);
ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4);
ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3);
ecc200placementbit(array, NR, NC, 1, NC - 3, p, 2);
ecc200placementbit(array, NR, NC, 1, NC - 2, p, 1);
ecc200placementbit(array, NR, NC, 1, NC - 1, p, 0);
}
// Annex M placement alorithm main function
static void ecc200placement(int *array, int NR, int NC)
{
int r, c, p;
// invalidate
for (r = 0; r < NR; r++)
for (c = 0; c < NC; c++)
array[r * NC + c] = 0;
// start
p = 1;
r = 4;
c = 0;
do {
// check corner
if (r == NR && !c)
ecc200placementcornerA(array, NR, NC, p++);
if (r == NR - 2 && !c && NC % 4)
ecc200placementcornerB(array, NR, NC, p++);
if (r == NR - 2 && !c && (NC % 8) == 4)
ecc200placementcornerC(array, NR, NC, p++);
if (r == NR + 4 && c == 2 && !(NC % 8))
ecc200placementcornerD(array, NR, NC, p++);
// up/right
do {
if (r < NR && c >= 0 && !array[r * NC + c])
ecc200placementblock(array, NR, NC, r, c, p++);
r -= 2;
c += 2;
}
while (r >= 0 && c < NC);
r++;
c += 3;
// down/left
do {
if (r >= 0 && c < NC && !array[r * NC + c])
ecc200placementblock(array, NR, NC, r, c, p++);
r += 2;
c -= 2;
}
while (r < NR && c >= 0);
r += 3;
c++;
}
while (r < NR || c < NC);
// unfilled corner
if (!array[NR * NC - 1])
array[NR * NC - 1] = array[NR * NC - NC - 2] = 1;
}
// calculate and append ecc code, and if necessary interleave
static void ecc200(unsigned char *binary, int bytes, int datablock, int rsblock)
{
int blocks = (bytes + 2) / datablock, b;
rs_init_gf(0x12d);
rs_init_code(rsblock, 1);
for (b = 0; b < blocks; b++) {
unsigned char buf[256], ecc[256];
int n, p = 0;
for (n = b; n < bytes; n += blocks)
buf[p++] = binary[n];
rs_encode(p, buf, ecc);
p = rsblock - 1; // comes back reversed
for (n = b; n < rsblock * blocks; n += blocks)
binary[bytes + n] = ecc[p--];
}
}
/*
* perform encoding for ecc200, source s len sl, to target t len tl, using
* optional encoding control string e return 1 if OK, 0 if failed. Does all
* necessary padding to tl
*/
char ecc200encode(unsigned char *t, int tl, unsigned char *s, int sl,
char *encoding, int *lenp)
{
char enc = 'a'; // start in ASCII encoding mode
int tp = 0, sp = 0;
if (strlen(encoding) < sl) {
fprintf(stderr, "Encoding string too short\n");
return 0;
}
// do the encoding
while (sp < sl && tp < tl) {
char newenc = enc; // suggest new encoding
if (tl - tp <= 1 && (enc == 'c' || enc == 't') || tl - tp <= 2
&& enc == 'x')
enc = 'a'; // auto revert to ASCII
newenc = tolower(encoding[sp]);
switch (newenc) { // encode character
case 'c': // C40
case 't': // Text
case 'x': // X12
{
char out[6], p = 0;
const char *e,
*s2 = "!\"#$%&'()*+,-./:;<=>?@[\\]_",
*s3 = 0;
if (newenc == 'c') {
e = " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
s3 = "`abcdefghijklmnopqrstuvwxyz{|}~\177";
}
if (newenc == 't') {
e = " 0123456789abcdefghijklmnopqrstuvwxyz";
s3 = "`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~\177";
}
if (newenc == 'x')
e = " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\r*>";
do {
unsigned char c = s[sp++];
char *w;
if (c & 0x80) {
if (newenc == 'x') {
fprintf(stderr,
"Cannot encode char 0x%02X in X12\n",
c);
return 0;
}
c &= 0x7f;
out[p++] = 1;
out[p++] = 30;
}
w = strchr(e, c);
if (w)
out[p++] = ((w - e) + 3) % 40;
else {
if (newenc == 'x') {
fprintf(stderr,
"Cannot encode char 0x%02X in X12\n",
c);
return 0;
}
if (c < 32) { // shift 1
out[p++] = 0;
out[p++] = c;
} else {
w = strchr(s2, c);
if (w) { // shift 2
out[p++] = 1;
out[p++] =
(w - s2);
} else {
w = strchr(s3,
c);
if (w) {
out[p++]
= 2;
out[p++]
=
(w -
s3);
} else {
fprintf
(stderr,
"Could not encode 0x%02X, should \
not happen\n", c);
return
0;
}
}
}
}
if (p == 2 && tp + 2 == tl && sp == sl)
out[p++] = 0; // shift 1 pad at end
while (p >= 3) {
int v =
out[0] * 1600 +
out[1] * 40 + out[2] + 1;
if (enc != newenc) {
if (enc == 'c'
|| enc == 't'
|| enc == 'x')
t[tp++] = 254; // escape C40/text/X12
else if (enc == 'x')
t[tp++] = 0x7C; // escape EDIFACT
if (newenc == 'c')
t[tp++] = 230;
if (newenc == 't')
t[tp++] = 239;
if (newenc == 'x')
t[tp++] = 238;
enc = newenc;
}
t[tp++] = (v >> 8);
t[tp++] = (v & 0xFF);
p -= 3;
out[0] = out[3];
out[1] = out[4];
out[2] = out[5];
}
}
while (p && sp < sl);
}
break;
case 'e': // EDIFACT
{
unsigned char out[4], p = 0;
if (enc != newenc) { // can only be from C40/Text/X12
t[tp++] = 254;
enc = 'a';
}
while (sp < sl && tolower(encoding[sp]) == 'e'
&& p < 4)
out[p++] = s[sp++];
if (p < 4) {
out[p++] = 0x1F;
enc = 'a';
} // termination
t[tp] = ((s[0] & 0x3F) << 2);
t[tp++] |= ((s[1] & 0x30) >> 4);
t[tp] = ((s[1] & 0x0F) << 4);
if (p == 2)
tp++;
else {
t[tp++] |= ((s[2] & 0x3C) >> 2);
t[tp] = ((s[2] & 0x03) << 6);
t[tp++] |= (s[3] & 0x3F);
}
}
break;
case 'a': // ASCII
if (enc != newenc) {
if (enc == 'c' || enc == 't' || enc == 'x')
t[tp++] = 254; // escape C40/text/X12
else
t[tp++] = 0x7C; // escape EDIFACT
}
enc = 'a';
if (sl - sp >= 2 && isdigit(s[sp])
&& isdigit(s[sp + 1])) {
t[tp++] =
(s[sp] - '0') * 10 + s[sp + 1] - '0' + 130;
sp += 2;
} else if (s[sp] > 127) {
t[tp++] = 235;
t[tp++] = s[sp++] - 127;
} else
t[tp++] = s[sp++] + 1;
break;
case 'b': // Binary
{
int l = 0; // how much to encode
if (encoding) {
int p;
for (p = sp;
p < sl
&& tolower(encoding[p]) == 'b';
p++)
l++;
}
t[tp++] = 231; // base256
if (l < 250)
t[tp++] = l;
else {
t[tp++] = 249 + (l / 250);
t[tp++] = (l % 250);
}
while (l-- && tp < tl) {
t[tp] = s[sp++] + (((tp + 1) * 149) % 255) + 1; // see annex H
tp++;
}
enc = 'a'; // reverse to ASCII at end
}
break;
default:
fprintf(stderr, "Unknown encoding %c\n", newenc);
return 0; // failed
}
}
if (lenp)
*lenp = tp;
if (tp < tl && enc != 'a') {
if (enc == 'c' || enc == 'x' || enc == 't')
t[tp++] = 254; // escape X12/C40/Text
else
t[tp++] = 0x7C; // escape EDIFACT
}
if (tp < tl)
t[tp++] = 129; // pad
while (tp < tl) { // more padding
int v = 129 + (((tp + 1) * 149) % 253) + 1; // see Annex H
if (v > 254)
v -= 254;
t[tp++] = v;
}
if (tp > tl || sp < sl)
return 0; // did not fit
/*
* for (tp = 0; tp < tl; tp++) fprintf (stderr, "%02X ", t[tp]); \
* fprintf (stderr, "\n");
*/
return 1; // OK
}
// Auto encoding format functions
static char encchr[] = "ACTXEB";
enum {
E_ASCII,
E_C40,
E_TEXT,
E_X12,
E_EDIFACT,
E_BINARY,
E_MAX
};
unsigned char switchcost[E_MAX][E_MAX] = {
0, 1, 1, 1, 1, 2, // From E_ASCII
1, 0, 2, 2, 2, 3, // From E_C40
1, 2, 0, 2, 2, 3, // From E_TEXT
1, 2, 2, 0, 2, 3, // From E_X12
1, 2, 2, 2, 0, 3, // From E_EDIFACT
0, 1, 1, 1, 1, 0, // From E_BINARY
};
/*
* Creates a encoding list (malloc)
* returns encoding string
* if lenp not null, target len stored
* if error, null returned
* if exact specified, then assumes shortcuts applicable for exact fit
* in target
* 1. No unlatch to return to ASCII for last encoded byte after C40 or
* Text or X12
* 2. No unlatch to return to ASCII for last 1 or 2 encoded bytes after
* EDIFACT
* 3. Final C40 or text encoding exactly in last 2 bytes can have a shift
* 0 to pad to make a tripple
* Only use the encoding from an exact request if the len matches the target,
* otherwise free the result and try again with exact=0
*/
static char *encmake(int l, unsigned char *s, int *lenp, char exact)
{
char *encoding = 0;
int p = l;
char e;
struct {
// number of bytes of source that can be encoded in a row at this point
// using this encoding mode
short s;
// number of bytes of target generated encoding from this point to end if
// already in this encoding mode
short t;
} enc[MAXBARCODE][E_MAX];
memset(&enc, 0, sizeof(enc));
if (!l)
return ""; // no length
if (l > MAXBARCODE)
return 0; // not valid
while (p--) {
char b = 0, sub;
int sl, tl, bl, t;
// consider each encoding from this point
// ASCII
sl = tl = 1;
if (isdigit(s[p]) && p + 1 < l && isdigit(s[p + 1]))
sl = 2; // double digit
else if (s[p] & 0x80)
tl = 2; // high shifted
bl = 0;
if (p + sl < l)
for (e = 0; e < E_MAX; e++)
if (enc[p + sl][e].t && ((t = enc[p + sl][e].t +
switchcost[E_ASCII]
[e]) < bl || !bl)) {
bl = t;
b = e;
}
enc[p][E_ASCII].t = tl + bl;
enc[p][E_ASCII].s = sl;
if (bl && b == E_ASCII)
enc[p][b].s += enc[p + sl][b].s;
// C40
sub = tl = sl = 0;
do {
unsigned char c = s[p + sl++];
if (c & 0x80) { // shift + upper
sub += 2;
c &= 0x7F;
}
if (c != ' ' && !isdigit(c) && !isupper(c))
sub++; // shift
sub++;
while (sub >= 3) {
sub -= 3;
tl += 2;
}
} while (sub && p + sl < l);
if (exact && sub == 2 && p + sl == l) {
// special case, can encode last block with shift 0 at end (Is this
// valid when not end of target buffer?)
sub = 0;
tl += 2;
}
if (!sub) { // can encode C40
bl = 0;
if (p + sl < l)
for (e = 0; e < E_MAX; e++)
if (enc[p + sl][e].t
&&
((t =
enc[p + sl][e].t +
switchcost[E_C40][e]) < bl
|| !bl)) {
bl = t;
b = e;
}
if (exact && enc[p + sl][E_ASCII].t == 1 && 1 < bl) {
// special case, switch to ASCII for last bytes
bl = 1;
b = E_ASCII;
}
enc[p][E_C40].t = tl + bl;
enc[p][E_C40].s = sl;
if (bl && b == E_C40)
enc[p][b].s += enc[p + sl][b].s;
}
// Text
sub = tl = sl = 0;
do {
unsigned char c = s[p + sl++];
if (c & 0x80) { // shift + upper
sub += 2;
c &= 0x7F;
}
if (c != ' ' && !isdigit(c) && !islower(c))
sub++; // shift
sub++;
while (sub >= 3) {
sub -= 3;
tl += 2;
}
} while (sub && p + sl < l);
if (exact && sub == 2 && p + sl == l) {
// special case, can encode last block with shift 0 at end (Is this
// valid when not end of target buffer?)
sub = 0;
tl += 2;
}
if (!sub && sl) { // can encode Text
bl = 0;
if (p + sl < l)
for (e = 0; e < E_MAX; e++)
if (enc[p + sl][e].t
&&
((t =
enc[p + sl][e].t +
switchcost[E_TEXT][e]) < bl
|| !bl)) {
bl = t;
b = e;
}
if (exact && enc[p + sl][E_ASCII].t == 1 && 1 < bl) { // special case, switch to ASCII for last bytes
bl = 1;
b = E_ASCII;
}
enc[p][E_TEXT].t = tl + bl;
enc[p][E_TEXT].s = sl;
if (bl && b == E_TEXT)
enc[p][b].s += enc[p + sl][b].s;
}
// X12
sub = tl = sl = 0;
do {
unsigned char c = s[p + sl++];
if (c != 13 && c != '*' && c != '>' && c != ' '
&& !isdigit(c) && !isupper(c)) {
sl = 0;
break;
}
sub++;
while (sub >= 3) {
sub -= 3;
tl += 2;
}
} while (sub && p + sl < l);
if (!sub && sl) { // can encode X12
bl = 0;
if (p + sl < l)
for (e = 0; e < E_MAX; e++)
if (enc[p + sl][e].t
&&
((t =
enc[p + sl][e].t +
switchcost[E_X12][e]) < bl
|| !bl)) {
bl = t;
b = e;
}
if (exact && enc[p + sl][E_ASCII].t == 1 && 1 < bl) {
// special case, switch to ASCII for last bytes
bl = 1;
b = E_ASCII;
}
enc[p][E_X12].t = tl + bl;
enc[p][E_X12].s = sl;
if (bl && b == E_X12)
enc[p][b].s += enc[p + sl][b].s;
}
// EDIFACT
sl = bl = 0;
if (s[p + 0] >= 32 && s[p + 0] <= 94) { // can encode 1
char bs = 0;
if (p + 1 == l && (!bl || bl < 2)) {
bl = 2;
bs = 1;
} else
for (e = 0; e < E_MAX; e++)
if (e != E_EDIFACT && enc[p + 1][e].t
&&
((t =
2 + enc[p + 1][e].t +
switchcost[E_ASCII][e])
< bl || !bl)) // E_ASCII as allowed for unlatch
{
bs = 1;
bl = t;
b = e;
}
if (p + 1 < l && s[p + 1] >= 32 && s[p + 1] <= 94) { // can encode 2
if (p + 2 == l && (!bl || bl < 2)) {
bl = 3;
bs = 2;
} else
for (e = 0; e < E_MAX; e++)
if (e != E_EDIFACT
&& enc[p + 2][e].t
&&
((t =
3 + enc[p + 2][e].t +
switchcost[E_ASCII][e])
< bl || !bl)) // E_ASCII as allowed for unlatch
{
bs = 2;
bl = t;
b = e;
}
if (p + 2 < l && s[p + 2] >= 32 && s[p + 2] <= 94) { // can encode 3
if (p + 3 == l && (!bl || bl < 3)) {
bl = 3;
bs = 3;
} else
for (e = 0; e < E_MAX; e++)
if (e != E_EDIFACT
&& enc[p + 3][e].t
&&
((t =
3 + enc[p +
3][e].t +
switchcost
[E_ASCII][e])
< bl || !bl)) // E_ASCII as allowed for unlatch
{
bs = 3;
bl = t;
b = e;
}
if (p + 4 < l && s[p + 3] >= 32 && s[p + 3] <= 94) { // can encode 4
if (p + 4 == l
&& (!bl || bl < 3)) {
bl = 3;
bs = 4;
} else {
for (e = 0; e < E_MAX;
e++)
if (enc[p + 4]
[e].t
&&
((t =
3 +
enc[p +
4][e].
t +
switchcost
[E_EDIFACT]
[e]) < bl
|| !bl)) {
bs = 4;
bl = t;
b = e;
}
if (exact
&& enc[p +
4][E_ASCII].t
&& enc[p +
4][E_ASCII].
t <= 2
&& (t =
3 + enc[p +
4]
[E_ASCII].t) <
bl) {
// special case, switch to ASCII for last 1 ot two bytes
bs = 4;
bl = t;
b = E_ASCII;
}
}
}
}
}
enc[p][E_EDIFACT].t = bl;
enc[p][E_EDIFACT].s = bs;
if (bl && b == E_EDIFACT)
enc[p][b].s += enc[p + bs][b].s;
}
// Binary
bl = 0;
for (e = 0; e < E_MAX; e++)
if (enc[p + 1][e].t
&&
((t =
enc[p + 1][e].t + switchcost[E_BINARY][e] +
((e == E_BINARY
&& enc[p + 1][e].t == 249) ? 1 : 0))
< bl || !bl)) {
bl = t;
b = e;
}
enc[p][E_BINARY].t = 1 + bl;
enc[p][E_BINARY].s = 1;
if (bl && b == E_BINARY)
enc[p][b].s += enc[p + 1][b].s;
/*
* fprintf (stderr, "%d:", p); for (e = 0; e < E_MAX; e++) fprintf \
* (stderr, " %c*%d/%d", encchr[e], enc[p][e].s, enc[p][e].t); \
* fprintf (stderr, "\n");
*/
}
encoding = safemalloc(l + 1);
p = 0;
{
char cur = E_ASCII; // starts ASCII
while (p < l) {
int t, m = 0;
char b = 0;
for (e = 0; e < E_MAX; e++)
if (enc[p][e].t
&& ((t = enc[p][e].t + switchcost[cur][e]) <
m || t == m && e == cur || !m)) {
b = e;
m = t;
}
cur = b;
m = enc[p][b].s;
if (!p && lenp)
*lenp = enc[p][b].t;
while (p < l && m--)
encoding[p++] = encchr[b];
}
}
encoding[p] = 0;
return encoding;
}
/*
* Main encoding function
* Returns the grid (malloced) containing the matrix. L corner at 0,0.
* Takes suggested size in *Wptr, *Hptr, or 0,0. Fills in actual size.
* Takes barcodelen and barcode to be encoded
* Note, if *encodingptr is null, then fills with auto picked (malloced)
* encoding
* If lenp not null, then the length of encoded data before any final
* unlatch or pad is stored
* If maxp not null, then the max storage of this size code is stored
* If eccp not null, then the number of ecc bytes used in this size is
* stored
* Returns 0 on error (writes to stderr with details).
*/
unsigned char *iec16022ecc200(int *Wptr, int *Hptr, char **encodingptr,
int barcodelen, unsigned char *barcode,
int *lenp, int *maxp, int *eccp)
{
unsigned char binary[3000]; // encoded raw data and ecc to place in barcode
int W = 0, H = 0;
char *encoding = 0;
unsigned char *grid = 0;
struct ecc200matrix_s *matrix;
memset(binary, 0, sizeof(binary));
if (encodingptr)
encoding = *encodingptr;
if (Wptr)
W = *Wptr;
if (Hptr)
H = *Hptr;
// encoding
if (W) { // known size
for (matrix = ecc200matrix; matrix->W && (matrix->W != W ||
matrix->H != H);
matrix++) ;
if (!matrix->W) {
fprintf(stderr, "Invalid size %dx%d\n", W, H);
return 0;
}
if (!encoding) {
int len;
char *e = encmake(barcodelen, barcode, &len, 1);
if (e && len != matrix->bytes) { // try not an exact fit
free(e);
e = encmake(barcodelen, barcode, &len, 0);
if (len > matrix->bytes) {
fprintf(stderr,
"Cannot make barcode fit %dx%d\n",
W, H);
return 0;
}
}
encoding = e;
}
} else {
// find a suitable encoding
if (encoding == NULL)
encoding = encmake(barcodelen, barcode, NULL, 1);
if (encoding) { // find one that fits chosen encoding
for (matrix = ecc200matrix; matrix->W; matrix++)
if (ecc200encode
(binary, matrix->bytes, barcode, barcodelen,
encoding, 0))
break;
} else {
int len;
char *e;
e = encmake(barcodelen, barcode, &len, 1);
for (matrix = ecc200matrix;
matrix->W && matrix->bytes != len; matrix++) ;
if (e && !matrix->W) { // try for non exact fit
free(e);
e = encmake(barcodelen, barcode, &len, 0);
for (matrix = ecc200matrix;
matrix->W && matrix->bytes < len;
matrix++) ;
}
encoding = e;
}
if (!matrix->W) {
fprintf(stderr,
"Cannot find suitable size, barcode too long\n");
return 0;
}
W = matrix->W;
H = matrix->H;
}
if (!ecc200encode(binary, matrix->bytes, barcode, barcodelen,
encoding, lenp)) {
fprintf(stderr, "Barcode too long for %dx%d\n", W, H);
return 0;
}
// ecc code
ecc200(binary, matrix->bytes, matrix->datablock, matrix->rsblock);
{ // placement
int x, y, NC, NR, *places;
NC = W - 2 * (W / matrix->FW);
NR = H - 2 * (H / matrix->FH);
places = safemalloc(NC * NR * sizeof(int));
ecc200placement(places, NR, NC);
grid = safemalloc(W * H);
memset(grid, 0, W * H);
for (y = 0; y < H; y += matrix->FH) {
for (x = 0; x < W; x++)
grid[y * W + x] = 1;
for (x = 0; x < W; x += 2)
grid[(y + matrix->FH - 1) * W + x] = 1;
}
for (x = 0; x < W; x += matrix->FW) {
for (y = 0; y < H; y++)
grid[y * W + x] = 1;
for (y = 0; y < H; y += 2)
grid[y * W + x + matrix->FW - 1] = 1;
}
for (y = 0; y < NR; y++) {
for (x = 0; x < NC; x++) {
int v = places[(NR - y - 1) * NC + x];
//fprintf (stderr, "%4d", v);
if (v == 1 || v > 7
&& (binary[(v >> 3) - 1] & (1 << (v & 7))))
grid[(1 + y +
2 * (y / (matrix->FH - 2))) * W +
1 + x +
2 * (x / (matrix->FW - 2))] = 1;
}
//fprintf (stderr, "\n");
}
free(places);
}
if (Wptr)
*Wptr = W;
if (Hptr)
*Hptr = H;
if (encodingptr)
*encodingptr = encoding;
if (maxp)
*maxp = matrix->bytes;
if (eccp)
*eccp =
(matrix->bytes + 2) / matrix->datablock * matrix->rsblock;
return grid;
}

47
backend/dm200.h Normal file
View File

@ -0,0 +1,47 @@
/**
*
* IEC16022 bar code generation
* Adrian Kennard, Andrews & Arnold Ltd
* with help from Cliff Hones on the RS coding
*
* (c) 2004 Adrian Kennard, Andrews & Arnold Ltd
* (c) 2006 Stefan Schmidt <stefan@datenfreihafen.org>
*
* 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 2 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, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*
* Main encoding function
* Returns the grid (malloced) containing the matrix. L corner at 0,0.
* Takes suggested size in *Wptr, *Hptr, or 0,0. Fills in actual size.
* Takes barcodelen and barcode to be encoded
* Note, if *encodingptr is null, then fills with auto picked (malloced)
* encoding.
* If lenp not null, then the length of encoded data before any final unlatch
* or pad is stored.
* If maxp not null, then the max storage of this size code is stored
* If eccp not null, then the number of ecc bytes used in this size is stored
* Returns 0 on error (writes to stderr with details).
*
*/
#ifndef __IEC16022ECC200_H
#define __IEC16022ECC200_H
unsigned char *iec16022ecc200(int *Wptr, int *Hptr, char **encodingptr,
int barcodelen, unsigned char *barcode,
int *lenp, int *maxp, int *eccp);
#define MAXBARCODE 3116
#endif /* __IEC16022ECC200_H */

181
backend/dmatrix.c Normal file
View File

@ -0,0 +1,181 @@
/* dmatrix.c - Handles Data Matrix 2-D symbology (IEC16022 ecc 200) */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
This file is a hacked-up copy of:
* IEC16022 bar code generation by
* Adrian Kennard, Andrews & Arnold Ltd
* with help from Cliff Hones on the RS coding
*
* (c) 2004 Adrian Kennard, Andrews & Arnold Ltd
* (c) 2006 Stefan Schmidt <stefan@datenfreihafen.org>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/* The original version of this code is available at:
http://www.datenfreihafen.org/projects/iec16022.html */
#define IEC16022_VERSION "0.2"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <malloc.h>
#include "dm200.h"
#include "common.h"
// simple checked response malloc
void *safemalloc(int n)
{
void *p = malloc(n);
if (!p) {
fprintf(stderr, "Malloc(%d) failed\n", n);
exit(1);
}
return p;
}
int dmatrix(struct zint_symbol *symbol, unsigned char source[])
{
int W = 0, H = 0;
int ecc = 0;
int barcodelen = 0;
char *encoding = 0;
int len = 0, maxlen = 0, ecclen = 0;
unsigned char *grid = 0;
char size[3], eccstr[3];
strcpy(size, "");
strcpy(eccstr, "200");
/* if (strlen(barcode) == 0) { // read from file
FILE *f = fopen(infile, "rb");
barcode = safemalloc(4001);
if (!f) {
strcpy(symbol->errtxt, "error: could not open file");
return 8;
}
barcodelen = fread(barcode, 1, 4000, f);
if (barcodelen < 0) {
strcpy(symbol->errtxt, "error: could not read file");
return 8;
}
barcode[barcodelen] = 0; // null terminate anyway
fclose(f);
} else */
barcodelen = strlen(source);
if(barcodelen > 780) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
// check parameters
if (strlen(size) != 0) {
char *x = strchr(size, 'x');
W = atoi(size);
if (x)
H = atoi(x + 1);
if (!H)
W = H;
}
if (eccstr)
ecc = atoi(eccstr);
if (W & 1) { // odd size
if (W != H || W < 9 || W > 49) {
strcpy(symbol->errtxt, "error: invalid Data Matrix size");
return ERROR_INVALID_OPTION;
}
if (!eccstr) {
if (W >= 17)
ecc = 140;
else if (W >= 13)
ecc = 100;
else if (W >= 11)
ecc = 80;
else
ecc = 0;
}
if (ecc && ecc != 50 && ecc != 80 && ecc != 100 && ecc != 140 ||
ecc == 50 && W < 11 || ecc == 80 && W < 13 || ecc == 100
&& W < 13 || ecc == 140 && W < 17) {
strcpy(symbol->errtxt, "error: invalid ecc value");
return ERROR_INVALID_OPTION;
}
} else if (W) { // even size
if (W < H) {
int t = W;
W = H;
H = t;
}
if (!eccstr)
ecc = 200;
if (ecc != 200) {
strcpy(symbol->errtxt, "error: invalid size for ecc 200");
return ERROR_INVALID_OPTION;
}
}
else { // auto size
if (!eccstr)
// default is even sizes only unless explicit ecc set to force odd
// sizes
ecc = 200;
}
// processing stamps
if ((W & 1) || ecc < 200) { // odd sizes
strcpy(symbol->errtxt, "error: odd sizes not supported");
return ERROR_INVALID_OPTION;
} else { // even sizes
grid =
iec16022ecc200(&W, &H, &encoding, barcodelen, source, &len,
&maxlen, &ecclen);
}
// output
if (!grid || !W) {
strcpy(symbol->errtxt, "error: Data Matrix encoding error");
return ERROR_ENCODING_PROBLEM;
}
int y;
/*for (y = H - 1; y >= 0; y--) {
int x;
for (x = 0; x < W; x++)
printf("%c",
grid[W * y + x] ? '*' : ' ');
printf("\n");
}*/
symbol->rows = H;
symbol->width = W;
for(y = H - 1; y >= 0; y--) {
int x;
for(x = 0; x < W; x++) {
if(grid[W * y + x]) {
symbol->encoded_data[(H - y) - 1][x] = '1'; }
else {
symbol->encoded_data[(H - y) - 1][x] = '0'; }
}
symbol->row_height[(H - y) - 1] = 1;
}
return 0;
}

680
backend/imail.c Normal file
View File

@ -0,0 +1,680 @@
/* imail.c - Handles Intelligent Mail (aka OneCode) for USPS */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/* The function "USPS_MSB_Math_CRC11GenerateFrameCheckSequence"
is Copyright (C) 2006 United States Postal Service */
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "common.h"
#include "large.h"
#define NASET "0123456789-"
/* The following lookup tables were generated using the code in Appendix C */
static unsigned short AppxD_I[1287] = { /* Appendix D Table 1 - 5 of 13 characters */
0x001F, 0x1F00, 0x002F, 0x1E80, 0x0037, 0x1D80, 0x003B, 0x1B80, 0x003D, 0x1780,
0x003E, 0x0F80, 0x004F, 0x1E40, 0x0057, 0x1D40, 0x005B, 0x1B40, 0x005D, 0x1740,
0x005E, 0x0F40, 0x0067, 0x1CC0, 0x006B, 0x1AC0, 0x006D, 0x16C0, 0x006E, 0x0EC0,
0x0073, 0x19C0, 0x0075, 0x15C0, 0x0076, 0x0DC0, 0x0079, 0x13C0, 0x007A, 0x0BC0,
0x007C, 0x07C0, 0x008F, 0x1E20, 0x0097, 0x1D20, 0x009B, 0x1B20, 0x009D, 0x1720,
0x009E, 0x0F20, 0x00A7, 0x1CA0, 0x00AB, 0x1AA0, 0x00AD, 0x16A0, 0x00AE, 0x0EA0,
0x00B3, 0x19A0, 0x00B5, 0x15A0, 0x00B6, 0x0DA0, 0x00B9, 0x13A0, 0x00BA, 0x0BA0,
0x00BC, 0x07A0, 0x00C7, 0x1C60, 0x00CB, 0x1A60, 0x00CD, 0x1660, 0x00CE, 0x0E60,
0x00D3, 0x1960, 0x00D5, 0x1560, 0x00D6, 0x0D60, 0x00D9, 0x1360, 0x00DA, 0x0B60,
0x00DC, 0x0760, 0x00E3, 0x18E0, 0x00E5, 0x14E0, 0x00E6, 0x0CE0, 0x00E9, 0x12E0,
0x00EA, 0x0AE0, 0x00EC, 0x06E0, 0x00F1, 0x11E0, 0x00F2, 0x09E0, 0x00F4, 0x05E0,
0x00F8, 0x03E0, 0x010F, 0x1E10, 0x0117, 0x1D10, 0x011B, 0x1B10, 0x011D, 0x1710,
0x011E, 0x0F10, 0x0127, 0x1C90, 0x012B, 0x1A90, 0x012D, 0x1690, 0x012E, 0x0E90,
0x0133, 0x1990, 0x0135, 0x1590, 0x0136, 0x0D90, 0x0139, 0x1390, 0x013A, 0x0B90,
0x013C, 0x0790, 0x0147, 0x1C50, 0x014B, 0x1A50, 0x014D, 0x1650, 0x014E, 0x0E50,
0x0153, 0x1950, 0x0155, 0x1550, 0x0156, 0x0D50, 0x0159, 0x1350, 0x015A, 0x0B50,
0x015C, 0x0750, 0x0163, 0x18D0, 0x0165, 0x14D0, 0x0166, 0x0CD0, 0x0169, 0x12D0,
0x016A, 0x0AD0, 0x016C, 0x06D0, 0x0171, 0x11D0, 0x0172, 0x09D0, 0x0174, 0x05D0,
0x0178, 0x03D0, 0x0187, 0x1C30, 0x018B, 0x1A30, 0x018D, 0x1630, 0x018E, 0x0E30,
0x0193, 0x1930, 0x0195, 0x1530, 0x0196, 0x0D30, 0x0199, 0x1330, 0x019A, 0x0B30,
0x019C, 0x0730, 0x01A3, 0x18B0, 0x01A5, 0x14B0, 0x01A6, 0x0CB0, 0x01A9, 0x12B0,
0x01AA, 0x0AB0, 0x01AC, 0x06B0, 0x01B1, 0x11B0, 0x01B2, 0x09B0, 0x01B4, 0x05B0,
0x01B8, 0x03B0, 0x01C3, 0x1870, 0x01C5, 0x1470, 0x01C6, 0x0C70, 0x01C9, 0x1270,
0x01CA, 0x0A70, 0x01CC, 0x0670, 0x01D1, 0x1170, 0x01D2, 0x0970, 0x01D4, 0x0570,
0x01D8, 0x0370, 0x01E1, 0x10F0, 0x01E2, 0x08F0, 0x01E4, 0x04F0, 0x01E8, 0x02F0,
0x020F, 0x1E08, 0x0217, 0x1D08, 0x021B, 0x1B08, 0x021D, 0x1708, 0x021E, 0x0F08,
0x0227, 0x1C88, 0x022B, 0x1A88, 0x022D, 0x1688, 0x022E, 0x0E88, 0x0233, 0x1988,
0x0235, 0x1588, 0x0236, 0x0D88, 0x0239, 0x1388, 0x023A, 0x0B88, 0x023C, 0x0788,
0x0247, 0x1C48, 0x024B, 0x1A48, 0x024D, 0x1648, 0x024E, 0x0E48, 0x0253, 0x1948,
0x0255, 0x1548, 0x0256, 0x0D48, 0x0259, 0x1348, 0x025A, 0x0B48, 0x025C, 0x0748,
0x0263, 0x18C8, 0x0265, 0x14C8, 0x0266, 0x0CC8, 0x0269, 0x12C8, 0x026A, 0x0AC8,
0x026C, 0x06C8, 0x0271, 0x11C8, 0x0272, 0x09C8, 0x0274, 0x05C8, 0x0278, 0x03C8,
0x0287, 0x1C28, 0x028B, 0x1A28, 0x028D, 0x1628, 0x028E, 0x0E28, 0x0293, 0x1928,
0x0295, 0x1528, 0x0296, 0x0D28, 0x0299, 0x1328, 0x029A, 0x0B28, 0x029C, 0x0728,
0x02A3, 0x18A8, 0x02A5, 0x14A8, 0x02A6, 0x0CA8, 0x02A9, 0x12A8, 0x02AA, 0x0AA8,
0x02AC, 0x06A8, 0x02B1, 0x11A8, 0x02B2, 0x09A8, 0x02B4, 0x05A8, 0x02B8, 0x03A8,
0x02C3, 0x1868, 0x02C5, 0x1468, 0x02C6, 0x0C68, 0x02C9, 0x1268, 0x02CA, 0x0A68,
0x02CC, 0x0668, 0x02D1, 0x1168, 0x02D2, 0x0968, 0x02D4, 0x0568, 0x02D8, 0x0368,
0x02E1, 0x10E8, 0x02E2, 0x08E8, 0x02E4, 0x04E8, 0x0307, 0x1C18, 0x030B, 0x1A18,
0x030D, 0x1618, 0x030E, 0x0E18, 0x0313, 0x1918, 0x0315, 0x1518, 0x0316, 0x0D18,
0x0319, 0x1318, 0x031A, 0x0B18, 0x031C, 0x0718, 0x0323, 0x1898, 0x0325, 0x1498,
0x0326, 0x0C98, 0x0329, 0x1298, 0x032A, 0x0A98, 0x032C, 0x0698, 0x0331, 0x1198,
0x0332, 0x0998, 0x0334, 0x0598, 0x0338, 0x0398, 0x0343, 0x1858, 0x0345, 0x1458,
0x0346, 0x0C58, 0x0349, 0x1258, 0x034A, 0x0A58, 0x034C, 0x0658, 0x0351, 0x1158,
0x0352, 0x0958, 0x0354, 0x0558, 0x0361, 0x10D8, 0x0362, 0x08D8, 0x0364, 0x04D8,
0x0383, 0x1838, 0x0385, 0x1438, 0x0386, 0x0C38, 0x0389, 0x1238, 0x038A, 0x0A38,
0x038C, 0x0638, 0x0391, 0x1138, 0x0392, 0x0938, 0x0394, 0x0538, 0x03A1, 0x10B8,
0x03A2, 0x08B8, 0x03A4, 0x04B8, 0x03C1, 0x1078, 0x03C2, 0x0878, 0x03C4, 0x0478,
0x040F, 0x1E04, 0x0417, 0x1D04, 0x041B, 0x1B04, 0x041D, 0x1704, 0x041E, 0x0F04,
0x0427, 0x1C84, 0x042B, 0x1A84, 0x042D, 0x1684, 0x042E, 0x0E84, 0x0433, 0x1984,
0x0435, 0x1584, 0x0436, 0x0D84, 0x0439, 0x1384, 0x043A, 0x0B84, 0x043C, 0x0784,
0x0447, 0x1C44, 0x044B, 0x1A44, 0x044D, 0x1644, 0x044E, 0x0E44, 0x0453, 0x1944,
0x0455, 0x1544, 0x0456, 0x0D44, 0x0459, 0x1344, 0x045A, 0x0B44, 0x045C, 0x0744,
0x0463, 0x18C4, 0x0465, 0x14C4, 0x0466, 0x0CC4, 0x0469, 0x12C4, 0x046A, 0x0AC4,
0x046C, 0x06C4, 0x0471, 0x11C4, 0x0472, 0x09C4, 0x0474, 0x05C4, 0x0487, 0x1C24,
0x048B, 0x1A24, 0x048D, 0x1624, 0x048E, 0x0E24, 0x0493, 0x1924, 0x0495, 0x1524,
0x0496, 0x0D24, 0x0499, 0x1324, 0x049A, 0x0B24, 0x049C, 0x0724, 0x04A3, 0x18A4,
0x04A5, 0x14A4, 0x04A6, 0x0CA4, 0x04A9, 0x12A4, 0x04AA, 0x0AA4, 0x04AC, 0x06A4,
0x04B1, 0x11A4, 0x04B2, 0x09A4, 0x04B4, 0x05A4, 0x04C3, 0x1864, 0x04C5, 0x1464,
0x04C6, 0x0C64, 0x04C9, 0x1264, 0x04CA, 0x0A64, 0x04CC, 0x0664, 0x04D1, 0x1164,
0x04D2, 0x0964, 0x04D4, 0x0564, 0x04E1, 0x10E4, 0x04E2, 0x08E4, 0x0507, 0x1C14,
0x050B, 0x1A14, 0x050D, 0x1614, 0x050E, 0x0E14, 0x0513, 0x1914, 0x0515, 0x1514,
0x0516, 0x0D14, 0x0519, 0x1314, 0x051A, 0x0B14, 0x051C, 0x0714, 0x0523, 0x1894,
0x0525, 0x1494, 0x0526, 0x0C94, 0x0529, 0x1294, 0x052A, 0x0A94, 0x052C, 0x0694,
0x0531, 0x1194, 0x0532, 0x0994, 0x0534, 0x0594, 0x0543, 0x1854, 0x0545, 0x1454,
0x0546, 0x0C54, 0x0549, 0x1254, 0x054A, 0x0A54, 0x054C, 0x0654, 0x0551, 0x1154,
0x0552, 0x0954, 0x0561, 0x10D4, 0x0562, 0x08D4, 0x0583, 0x1834, 0x0585, 0x1434,
0x0586, 0x0C34, 0x0589, 0x1234, 0x058A, 0x0A34, 0x058C, 0x0634, 0x0591, 0x1134,
0x0592, 0x0934, 0x05A1, 0x10B4, 0x05A2, 0x08B4, 0x05C1, 0x1074, 0x05C2, 0x0874,
0x0607, 0x1C0C, 0x060B, 0x1A0C, 0x060D, 0x160C, 0x060E, 0x0E0C, 0x0613, 0x190C,
0x0615, 0x150C, 0x0616, 0x0D0C, 0x0619, 0x130C, 0x061A, 0x0B0C, 0x061C, 0x070C,
0x0623, 0x188C, 0x0625, 0x148C, 0x0626, 0x0C8C, 0x0629, 0x128C, 0x062A, 0x0A8C,
0x062C, 0x068C, 0x0631, 0x118C, 0x0632, 0x098C, 0x0643, 0x184C, 0x0645, 0x144C,
0x0646, 0x0C4C, 0x0649, 0x124C, 0x064A, 0x0A4C, 0x0651, 0x114C, 0x0652, 0x094C,
0x0661, 0x10CC, 0x0662, 0x08CC, 0x0683, 0x182C, 0x0685, 0x142C, 0x0686, 0x0C2C,
0x0689, 0x122C, 0x068A, 0x0A2C, 0x0691, 0x112C, 0x0692, 0x092C, 0x06A1, 0x10AC,
0x06A2, 0x08AC, 0x06C1, 0x106C, 0x06C2, 0x086C, 0x0703, 0x181C, 0x0705, 0x141C,
0x0706, 0x0C1C, 0x0709, 0x121C, 0x070A, 0x0A1C, 0x0711, 0x111C, 0x0712, 0x091C,
0x0721, 0x109C, 0x0722, 0x089C, 0x0741, 0x105C, 0x0742, 0x085C, 0x0781, 0x103C,
0x0782, 0x083C, 0x080F, 0x1E02, 0x0817, 0x1D02, 0x081B, 0x1B02, 0x081D, 0x1702,
0x081E, 0x0F02, 0x0827, 0x1C82, 0x082B, 0x1A82, 0x082D, 0x1682, 0x082E, 0x0E82,
0x0833, 0x1982, 0x0835, 0x1582, 0x0836, 0x0D82, 0x0839, 0x1382, 0x083A, 0x0B82,
0x0847, 0x1C42, 0x084B, 0x1A42, 0x084D, 0x1642, 0x084E, 0x0E42, 0x0853, 0x1942,
0x0855, 0x1542, 0x0856, 0x0D42, 0x0859, 0x1342, 0x085A, 0x0B42, 0x0863, 0x18C2,
0x0865, 0x14C2, 0x0866, 0x0CC2, 0x0869, 0x12C2, 0x086A, 0x0AC2, 0x0871, 0x11C2,
0x0872, 0x09C2, 0x0887, 0x1C22, 0x088B, 0x1A22, 0x088D, 0x1622, 0x088E, 0x0E22,
0x0893, 0x1922, 0x0895, 0x1522, 0x0896, 0x0D22, 0x0899, 0x1322, 0x089A, 0x0B22,
0x08A3, 0x18A2, 0x08A5, 0x14A2, 0x08A6, 0x0CA2, 0x08A9, 0x12A2, 0x08AA, 0x0AA2,
0x08B1, 0x11A2, 0x08B2, 0x09A2, 0x08C3, 0x1862, 0x08C5, 0x1462, 0x08C6, 0x0C62,
0x08C9, 0x1262, 0x08CA, 0x0A62, 0x08D1, 0x1162, 0x08D2, 0x0962, 0x08E1, 0x10E2,
0x0907, 0x1C12, 0x090B, 0x1A12, 0x090D, 0x1612, 0x090E, 0x0E12, 0x0913, 0x1912,
0x0915, 0x1512, 0x0916, 0x0D12, 0x0919, 0x1312, 0x091A, 0x0B12, 0x0923, 0x1892,
0x0925, 0x1492, 0x0926, 0x0C92, 0x0929, 0x1292, 0x092A, 0x0A92, 0x0931, 0x1192,
0x0932, 0x0992, 0x0943, 0x1852, 0x0945, 0x1452, 0x0946, 0x0C52, 0x0949, 0x1252,
0x094A, 0x0A52, 0x0951, 0x1152, 0x0961, 0x10D2, 0x0983, 0x1832, 0x0985, 0x1432,
0x0986, 0x0C32, 0x0989, 0x1232, 0x098A, 0x0A32, 0x0991, 0x1132, 0x09A1, 0x10B2,
0x09C1, 0x1072, 0x0A07, 0x1C0A, 0x0A0B, 0x1A0A, 0x0A0D, 0x160A, 0x0A0E, 0x0E0A,
0x0A13, 0x190A, 0x0A15, 0x150A, 0x0A16, 0x0D0A, 0x0A19, 0x130A, 0x0A1A, 0x0B0A,
0x0A23, 0x188A, 0x0A25, 0x148A, 0x0A26, 0x0C8A, 0x0A29, 0x128A, 0x0A2A, 0x0A8A,
0x0A31, 0x118A, 0x0A43, 0x184A, 0x0A45, 0x144A, 0x0A46, 0x0C4A, 0x0A49, 0x124A,
0x0A51, 0x114A, 0x0A61, 0x10CA, 0x0A83, 0x182A, 0x0A85, 0x142A, 0x0A86, 0x0C2A,
0x0A89, 0x122A, 0x0A91, 0x112A, 0x0AA1, 0x10AA, 0x0AC1, 0x106A, 0x0B03, 0x181A,
0x0B05, 0x141A, 0x0B06, 0x0C1A, 0x0B09, 0x121A, 0x0B11, 0x111A, 0x0B21, 0x109A,
0x0B41, 0x105A, 0x0B81, 0x103A, 0x0C07, 0x1C06, 0x0C0B, 0x1A06, 0x0C0D, 0x1606,
0x0C0E, 0x0E06, 0x0C13, 0x1906, 0x0C15, 0x1506, 0x0C16, 0x0D06, 0x0C19, 0x1306,
0x0C23, 0x1886, 0x0C25, 0x1486, 0x0C26, 0x0C86, 0x0C29, 0x1286, 0x0C31, 0x1186,
0x0C43, 0x1846, 0x0C45, 0x1446, 0x0C49, 0x1246, 0x0C51, 0x1146, 0x0C61, 0x10C6,
0x0C83, 0x1826, 0x0C85, 0x1426, 0x0C89, 0x1226, 0x0C91, 0x1126, 0x0CA1, 0x10A6,
0x0CC1, 0x1066, 0x0D03, 0x1816, 0x0D05, 0x1416, 0x0D09, 0x1216, 0x0D11, 0x1116,
0x0D21, 0x1096, 0x0D41, 0x1056, 0x0D81, 0x1036, 0x0E03, 0x180E, 0x0E05, 0x140E,
0x0E09, 0x120E, 0x0E11, 0x110E, 0x0E21, 0x108E, 0x0E41, 0x104E, 0x0E81, 0x102E,
0x0F01, 0x101E, 0x100F, 0x1E01, 0x1017, 0x1D01, 0x101B, 0x1B01, 0x101D, 0x1701,
0x1027, 0x1C81, 0x102B, 0x1A81, 0x102D, 0x1681, 0x1033, 0x1981, 0x1035, 0x1581,
0x1039, 0x1381, 0x1047, 0x1C41, 0x104B, 0x1A41, 0x104D, 0x1641, 0x1053, 0x1941,
0x1055, 0x1541, 0x1059, 0x1341, 0x1063, 0x18C1, 0x1065, 0x14C1, 0x1069, 0x12C1,
0x1071, 0x11C1, 0x1087, 0x1C21, 0x108B, 0x1A21, 0x108D, 0x1621, 0x1093, 0x1921,
0x1095, 0x1521, 0x1099, 0x1321, 0x10A3, 0x18A1, 0x10A5, 0x14A1, 0x10A9, 0x12A1,
0x10B1, 0x11A1, 0x10C3, 0x1861, 0x10C5, 0x1461, 0x10C9, 0x1261, 0x10D1, 0x1161,
0x1107, 0x1C11, 0x110B, 0x1A11, 0x110D, 0x1611, 0x1113, 0x1911, 0x1115, 0x1511,
0x1119, 0x1311, 0x1123, 0x1891, 0x1125, 0x1491, 0x1129, 0x1291, 0x1131, 0x1191,
0x1143, 0x1851, 0x1145, 0x1451, 0x1149, 0x1251, 0x1183, 0x1831, 0x1185, 0x1431,
0x1189, 0x1231, 0x1207, 0x1C09, 0x120B, 0x1A09, 0x120D, 0x1609, 0x1213, 0x1909,
0x1215, 0x1509, 0x1219, 0x1309, 0x1223, 0x1889, 0x1225, 0x1489, 0x1229, 0x1289,
0x1243, 0x1849, 0x1245, 0x1449, 0x1283, 0x1829, 0x1285, 0x1429, 0x1303, 0x1819,
0x1305, 0x1419, 0x1407, 0x1C05, 0x140B, 0x1A05, 0x140D, 0x1605, 0x1413, 0x1905,
0x1415, 0x1505, 0x1423, 0x1885, 0x1425, 0x1485, 0x1443, 0x1845, 0x1483, 0x1825,
0x1503, 0x1815, 0x1603, 0x180D, 0x1807, 0x1C03, 0x180B, 0x1A03, 0x1813, 0x1903,
0x1823, 0x1883, 0x1843, 0x1445, 0x1249, 0x1151, 0x10E1, 0x0C46, 0x0A4A, 0x0952,
0x08E2, 0x064C, 0x0554, 0x04E4, 0x0358, 0x02E8, 0x01F0 };
static unsigned short AppxD_II[78] = { /* Appendix D Table II - 2 of 13 characters */
0x0003, 0x1800, 0x0005, 0x1400, 0x0006, 0x0C00, 0x0009, 0x1200, 0x000A, 0x0A00,
0x000C, 0x0600, 0x0011, 0x1100, 0x0012, 0x0900, 0x0014, 0x0500, 0x0018, 0x0300,
0x0021, 0x1080, 0x0022, 0x0880, 0x0024, 0x0480, 0x0028, 0x0280, 0x0030, 0x0180,
0x0041, 0x1040, 0x0042, 0x0840, 0x0044, 0x0440, 0x0048, 0x0240, 0x0050, 0x0140,
0x0060, 0x00C0, 0x0081, 0x1020, 0x0082, 0x0820, 0x0084, 0x0420, 0x0088, 0x0220,
0x0090, 0x0120, 0x0101, 0x1010, 0x0102, 0x0810, 0x0104, 0x0410, 0x0108, 0x0210,
0x0201, 0x1008, 0x0202, 0x0808, 0x0204, 0x0408, 0x0401, 0x1004, 0x0402, 0x0804,
0x0801, 0x1002, 0x1001, 0x0802, 0x0404, 0x0208, 0x0110, 0x00A0 };
static int AppxD_IV[130] = { /* Appendix D Table IV - Bar-to-Character Mapping (reverse lookup) */
67, 6, 78, 16, 86, 95, 34, 40, 45, 113, 117, 121, 62, 87, 18, 104, 41, 76, 57, 119, 115, 72, 97,
2, 127, 26, 105, 35, 122, 52, 114, 7, 24, 82, 68, 63, 94, 44, 77, 112, 70, 100, 39, 30, 107,
15, 125, 85, 10, 65, 54, 88, 20, 106, 46, 66, 8, 116, 29, 61, 99, 80, 90, 37, 123, 51, 25, 84,
129, 56, 4, 109, 96, 28, 36, 47, 11, 71, 33, 102, 21, 9, 17, 49, 124, 79, 64, 91, 42, 69, 53,
60, 14, 1, 27, 103, 126, 75, 89, 50, 120, 19, 32, 110, 92, 111, 130, 59, 31, 12, 81, 43, 55,
5, 74, 22, 101, 128, 58, 118, 48, 108, 38, 98, 93, 23, 83, 13, 73, 3 };
/***************************************************************************
** USPS_MSB_Math_CRC11GenerateFrameCheckSequence
**
** Inputs:
** ByteAttayPtr is the address of a 13 byte array holding 102 bytes which
** are right justified - ie: the leftmost 2 bits of the first byte do not
** hold data and must be set to zero.
**
** Outputs:
** return unsigned short - 11 bit Frame Check Sequence (right justified)
***************************************************************************/
extern unsigned short
USPS_MSB_Math_CRC11GenerateFrameCheckSequence( unsigned char *ByteArrayPtr )
{
unsigned short GeneratorPolynomial = 0x0F35;
unsigned short FrameCheckSequence = 0x07FF;
unsigned short Data;
int ByteIndex, Bit;
/* Do most significant byte skipping the 2 most significant bits */
Data = *ByteArrayPtr << 5;
ByteArrayPtr++;
for ( Bit = 2; Bit < 8; Bit++ )
{
if ( (FrameCheckSequence ^ Data) & 0x400 )
FrameCheckSequence = (FrameCheckSequence << 1) ^ GeneratorPolynomial;
else
FrameCheckSequence = (FrameCheckSequence << 1);
FrameCheckSequence &= 0x7FF;
Data <<= 1;
}
/* Do rest of the bytes */
for ( ByteIndex = 1; ByteIndex < 13; ByteIndex++ )
{
Data = *ByteArrayPtr << 3;
ByteArrayPtr++;
for ( Bit = 0; Bit < 8; Bit++ )
{
if ( (FrameCheckSequence ^ Data) & 0x0400 ) {
FrameCheckSequence = (FrameCheckSequence << 1) ^ GeneratorPolynomial;
} else {
FrameCheckSequence = (FrameCheckSequence << 1);
}
FrameCheckSequence &= 0x7FF;
Data <<= 1;
}
}
return FrameCheckSequence;
}
void breakup(short int fcs_bit[], unsigned short usps_crc)
{
int i;
for(i = 0; i < 13; i++) {
fcs_bit[i] = 0;
}
if(usps_crc >= 4096) {
fcs_bit[12] = 1;
usps_crc -= 4096;
}
if(usps_crc >= 2048) {
fcs_bit[11] = 1;
usps_crc -= 2048;
}
if(usps_crc >= 1024) {
fcs_bit[10] = 1;
usps_crc -= 1024;
}
if(usps_crc >= 512) {
fcs_bit[9] = 1;
usps_crc -= 512;
}
if(usps_crc >= 256) {
fcs_bit[8] = 1;
usps_crc -= 256;
}
if(usps_crc >= 128) {
fcs_bit[7] = 1;
usps_crc -= 128;
}
if(usps_crc >= 64) {
fcs_bit[6] = 1;
usps_crc -= 64;
}
if(usps_crc >= 32) {
fcs_bit[5] = 1;
usps_crc -= 32;
}
if(usps_crc >= 16) {
fcs_bit[4] = 1;
usps_crc -= 16;
}
if(usps_crc >= 8) {
fcs_bit[3] = 1;
usps_crc -= 8;
}
if(usps_crc >= 4) {
fcs_bit[2] = 1;
usps_crc -= 4;
}
if(usps_crc >= 2) {
fcs_bit[1] = 1;
usps_crc -= 2;
}
if(usps_crc == 1) {
fcs_bit[0] = 1;
}
}
int imail(struct zint_symbol *symbol, unsigned char source[])
{
char data_pattern[200];
int errno;
errno = 0;
if(strlen(source) > 32) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(NASET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
int i, j, read;
char zip[35], tracker[35], zip_adder[11], temp[2];
short int accum[112], x_reg[112], y_reg[112];
strcpy(zip, "");
strcpy(tracker, "");
unsigned char byte_array[13];
unsigned short usps_crc;
int codeword[10];
unsigned short characters[10];
short int bit_pattern[13], bar_map[130];
/* separate the tracking code from the routing code */
read = 0;
j = 0;
for(i = 0; i < strlen(source); i++) {
if(source[i] == '-') {
tracker[read] = '\0';
j = 1;
read = 0;
} else {
if(j == 0) {
/* reading tracker */
tracker[read] = source[i];
read++;
} else {
/* reading zip code */
zip[read] = source[i];
read++;
}
}
}
if(j == 0) {
tracker[read] = '\0';
} else {
zip[read] = '\0';
}
if(strlen(tracker) != 20) {
strcpy(symbol->errtxt, "error: invalid length tracking code");
return ERROR_INVALID_DATA;
}
if(strlen(zip) > 11) {
strcpy(symbol->errtxt, "error: invalid ZIP code");
return ERROR_INVALID_DATA;
}
/* *** Step 1 - Conversion of Data Fields into Binary Data *** */
/* Routing code first */
for(i = 0; i < 112; i++) {
accum[i] = 0;
}
for(read = 0; read < strlen(zip); read++) {
for(i = 0; i < 112; i++) {
x_reg[i] = accum[i];
}
for(i = 0; i < 9; i++) {
binary_add(accum, x_reg);
}
x_reg[0] = BCD[ctoi(zip[read]) * 4];
x_reg[1] = BCD[(ctoi(zip[read]) * 4) + 1];
x_reg[2] = BCD[(ctoi(zip[read]) * 4) + 2];
x_reg[3] = BCD[(ctoi(zip[read]) * 4) + 3];
for(i = 4; i < 112; i++) {
x_reg[i] = 0;
}
binary_add(accum, x_reg);
}
/* add weight to routing code */
for(i = 0; i < 112; i++) {
x_reg[i] = accum[i];
}
if(strlen(zip) > 9) {
strcpy(zip_adder, "1000100001");
} else {
if(strlen(zip) > 5) {
strcpy(zip_adder, "100001");
} else {
if(strlen(zip) > 0) {
strcpy(zip_adder, "1");
} else {
strcpy(zip_adder, "0");
}
}
}
for(i = 0; i < 112; i++) {
accum[i] = 0;
}
for(read = 0; read < strlen(zip_adder); read++) {
for(i = 0; i < 112; i++) {
y_reg[i] = accum[i];
}
for(i = 0; i < 9; i++) {
binary_add(accum, y_reg);
}
y_reg[0] = BCD[ctoi(zip_adder[read]) * 4];
y_reg[1] = BCD[(ctoi(zip_adder[read]) * 4) + 1];
y_reg[2] = BCD[(ctoi(zip_adder[read]) * 4) + 2];
y_reg[3] = BCD[(ctoi(zip_adder[read]) * 4) + 3];
for(i = 4; i < 112; i++) {
y_reg[i] = 0;
}
binary_add(accum, y_reg);
}
binary_add(accum, x_reg);
/* tracking code */
/* multiply by 10 */
for(i = 0; i < 112; i++) {
y_reg[i] = accum[i];
}
for(i = 0; i < 9; i++) {
binary_add(accum, y_reg);
}
/* add first digit of tracker */
y_reg[0] = BCD[ctoi(tracker[0]) * 4];
y_reg[1] = BCD[(ctoi(tracker[0]) * 4) + 1];
y_reg[2] = BCD[(ctoi(tracker[0]) * 4) + 2];
y_reg[3] = BCD[(ctoi(tracker[0]) * 4) + 3];
for(i = 4; i < 112; i++) {
y_reg[i] = 0;
}
binary_add(accum, y_reg);
/* multiply by 5 */
for(i = 0; i < 112; i++) {
y_reg[i] = accum[i];
}
for(i = 0; i < 4; i++) {
binary_add(accum, y_reg);
}
/* add second digit */
y_reg[0] = BCD[ctoi(tracker[1]) * 4];
y_reg[1] = BCD[(ctoi(tracker[1]) * 4) + 1];
y_reg[2] = BCD[(ctoi(tracker[1]) * 4) + 2];
y_reg[3] = BCD[(ctoi(tracker[1]) * 4) + 3];
for(i = 4; i < 112; i++) {
y_reg[i] = 0;
}
binary_add(accum, y_reg);
/* and then the rest */
for(read = 2; read < strlen(tracker); read++) {
for(i = 0; i < 112; i++) {
y_reg[i] = accum[i];
}
for(i = 0; i < 9; i++) {
binary_add(accum, y_reg);
}
y_reg[0] = BCD[ctoi(tracker[read]) * 4];
y_reg[1] = BCD[(ctoi(tracker[read]) * 4) + 1];
y_reg[2] = BCD[(ctoi(tracker[read]) * 4) + 2];
y_reg[3] = BCD[(ctoi(tracker[read]) * 4) + 3];
for(i = 4; i < 112; i++) {
y_reg[i] = 0;
}
binary_add(accum, y_reg);
}
/* printf("Binary data 1: ");
hex_dump(accum); */
/* *** Step 2 - Generation of 11-bit CRC on Binary Data *** */
accum[103] = 0;
accum[102] = 0;
strcpy(byte_array, "");
for(j = 0; j < 13; j++) {
i = 96 - (8 * j);
byte_array[j] = 0;
byte_array[j] += accum[i];
byte_array[j] += 2 * accum[i + 1];
byte_array[j] += 4 * accum[i + 2];
byte_array[j] += 8 * accum[i + 3];
byte_array[j] += 16 * accum[i + 4];
byte_array[j] += 32 * accum[i + 5];
byte_array[j] += 64 * accum[i + 6];
byte_array[j] += 128 * accum[i + 7];
}
usps_crc = USPS_MSB_Math_CRC11GenerateFrameCheckSequence(byte_array);
/* printf("FCS 2: %4.4X\n", usps_crc); */
/* *** Step 3 - Conversion from Binary Data to Codewords *** */
/* start with codeword J which is base 636 */
for(i = 0; i < 112; i++) {
x_reg[i] = 0;
y_reg[i] = 0;
}
x_reg[101] = 1;
x_reg[98] = 1;
x_reg[97] = 1;
x_reg[96] = 1;
x_reg[95] = 1;
x_reg[94] = 1;
for(i = 92; i >= 0; i--) {
y_reg[i] = islarger(accum, x_reg);
if(y_reg[i] == 1) {
binary_subtract(accum, x_reg);
}
shiftdown(x_reg);
}
codeword[9] = (accum[9] * 512) + (accum[8] * 256) + (accum[7] * 128) + (accum[6] * 64) +
(accum[5] * 32) + (accum[4] * 16) + (accum[3] * 8) + (accum[2] * 4) +
(accum[1] * 2) + accum[0];
/* then codewords I to B with base 1365 */
for(j = 8; j > 0; j--) {
for(i = 0; i < 112; i++) {
accum[i] = y_reg[i];
y_reg[i] = 0;
x_reg[i] = 0;
}
x_reg[101] = 1;
x_reg[99] = 1;
x_reg[97] = 1;
x_reg[95] = 1;
x_reg[93] = 1;
x_reg[91] = 1;
for(i = 91; i >= 0; i--) {
y_reg[i] = islarger(accum, x_reg);
if(y_reg[i] == 1) {
binary_subtract(accum, x_reg);
}
shiftdown(x_reg);
}
codeword[j] = (accum[10] * 1024) + (accum[9] * 512) + (accum[8] * 256) +
(accum[7] * 128) + (accum[6] * 64) + (accum[5] * 32) +
(accum[4] * 16) + (accum[3] * 8) + (accum[2] * 4) +
(accum[1] * 2) + accum[0];
}
codeword[0] = (y_reg[10] * 1024) + (y_reg[9] * 512) + (y_reg[8] * 256) +
(y_reg[7] * 128) + (y_reg[6] * 64) + (y_reg[5] * 32) +
(y_reg[4] * 16) + (y_reg[3] * 8) + (y_reg[2] * 4) +
(y_reg[1] * 2) + y_reg[0];
/* printf("Codewords 3: ");
for(i = 0; i < 10; i++) {
printf("%d ", codeword[i]);
}
printf("\n"); */
/* *** Step 4 - Inserting Additional Information into Codewords *** */
codeword[9] = codeword[9] * 2;
if(usps_crc >= 1024) {
codeword[0] += 659;
}
/* printf("Codewords 4b: ");
for(i = 0; i < 10; i++) {
printf("%d ", codeword[i]);
}
printf("\n"); */
/* *** Step 5 - Conversion from Codewords to Characters *** */
for(i = 0; i < 10; i++) {
if(codeword[i] < 1287) {
characters[i] = AppxD_I[codeword[i]];
} else {
characters[i] = AppxD_II[codeword[i] - 1287];
}
}
/* printf("Characters 5a: ");
for(i = 0; i < 10; i++) {
printf("%4.4X ", characters[i]);
}
printf("\n"); */
breakup(bit_pattern, usps_crc);
for(i = 0; i < 10; i++) {
if(bit_pattern[i] == 1) {
characters[i] = 0x1FFF - characters[i];
}
}
/* printf("Characters 5b: ");
for(i = 0; i < 10; i++) {
printf("%4.4X ", characters[i]);
}
printf("\n"); */
/* *** Step 6 - Conversion from Characters to the Intelligent Mail Barcode *** */
for(i = 0; i < 10; i++) {
breakup(bit_pattern, characters[i]);
for(j = 0; j < 13; j++) {
bar_map[AppxD_IV[(13 * i) + j] - 1] = bit_pattern[j];
}
}
strcpy(data_pattern, "");
temp[1] = '\0';
for(i = 0; i < 65; i++) {
j = 0;
if(bar_map[i] == 0)
j += 1;
if(bar_map[i + 65] == 0)
j += 2;
temp[0] = itoc(j);
concat(data_pattern, temp);
}
/* Translate 4-state data pattern to symbol */
read = 0;
for(i = 0; i < strlen(data_pattern); i++)
{
if((data_pattern[i] == '1') || (data_pattern[i] == '0'))
{
symbol->encoded_data[0][read] = '1';
}
symbol->encoded_data[1][read] = '1';
if((data_pattern[i] == '2') || (data_pattern[i] == '0'))
{
symbol->encoded_data[2][read] = '1';
}
read += 2;
}
symbol->row_height[0] = 2;
symbol->row_height[1] = 2;
symbol->row_height[2] = 2;
symbol->rows = 3;
symbol->width = read - 1;
return errno;
}

225
backend/large.c Normal file
View File

@ -0,0 +1,225 @@
/* large.c - Handles binary manipulation of large numbers */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <stdio.h>
#include <string.h>
static short int BCD[40] = {
0, 0, 0, 0,
1, 0, 0, 0,
0, 1, 0, 0,
1, 1, 0, 0,
0, 0, 1, 0,
1, 0, 1, 0,
0, 1, 1, 0,
1, 1, 1, 0,
0, 0, 0, 1,
1, 0, 0, 1 };
void binary_add(short int accumulator[], short int input_buffer[])
{ /* Binary addition */
int i, carry, done;
carry = 0;
for(i = 0; i < 112; i++) {
done = 0;
if(((input_buffer[i] == 0) && (accumulator[i] == 0)) && ((carry == 0) && (done == 0))) {
accumulator[i] = 0;
carry = 0;
done = 1;
}
if(((input_buffer[i] == 0) && (accumulator[i] == 0)) && ((carry == 1) && (done == 0))) {
accumulator[i] = 1;
carry = 0;
done = 1;
}
if(((input_buffer[i] == 0) && (accumulator[i] == 1)) && ((carry == 0) && (done == 0))) {
accumulator[i] = 1;
carry = 0;
done = 1;
}
if(((input_buffer[i] == 0) && (accumulator[i] == 1)) && ((carry == 1) && (done == 0))) {
accumulator[i] = 0;
carry = 1;
done = 1;
}
if(((input_buffer[i] == 1) && (accumulator[i] == 0)) && ((carry == 0) && (done == 0))) {
accumulator[i] = 1;
carry = 0;
done = 1;
}
if(((input_buffer[i] == 1) && (accumulator[i] == 0)) && ((carry == 1) && (done == 0))) {
accumulator[i] = 0;
carry = 1;
done = 1;
}
if(((input_buffer[i] == 1) && (accumulator[i] == 1)) && ((carry == 0) && (done == 0))) {
accumulator[i] = 0;
carry = 1;
done = 1;
}
if(((input_buffer[i] == 1) && (accumulator[i] == 1)) && ((carry == 1) && (done == 0))) {
accumulator[i] = 1;
carry = 1;
done = 1;
}
}
}
void binary_subtract(short int accumulator[], short int input_buffer[])
{ /* 2's compliment subtraction */
/* take input_buffer from accumulator and put answer in accumulator */
int i;
short int sub_buffer[112];
for(i = 0; i < 112; i++) {
if(input_buffer[i] == 0) {
sub_buffer[i] = 1;
} else {
sub_buffer[i] = 0;
}
}
binary_add(accumulator, sub_buffer);
sub_buffer[0] = 1;
for(i = 1; i < 112; i++) {
sub_buffer[i] = 0;
}
binary_add(accumulator, sub_buffer);
}
void shiftdown(short int buffer[])
{
int i;
buffer[102] = 0;
buffer[103] = 0;
for(i = 0; i < 102; i++) {
buffer[i] = buffer[i + 1];
}
}
void shiftup(short int buffer[])
{
int i;
for(i = 102; i > 0; i--) {
buffer[i] = buffer[i - 1];
}
buffer[0] = 0;
}
short int islarger(short int accum[], short int reg[])
{
/* Returns 1 if accum[] is larger than reg[], else 0 */
int i, latch, larger;
latch = 0;
i = 103;
larger = 0;
do {
if((accum[i] == 1) && (reg[i] == 0)) {
latch = 1;
larger = 1;
}
if((accum[i] == 0) && (reg[i] == 1)) {
latch = 1;
}
i--;
} while ((latch == 0) && (i >= -1));
return larger;
}
void binary_load(short int reg[], char data[])
{
int read, i;
short int temp[112];
for(i = 0; i < 112; i++) {
reg[i] = 0;
}
for(read = 0; read < strlen(data); read++) {
for(i = 0; i < 112; i++) {
temp[i] = reg[i];
}
for(i = 0; i < 9; i++) {
binary_add(reg, temp);
}
temp[0] = BCD[ctoi(data[read]) * 4];
temp[1] = BCD[(ctoi(data[read]) * 4) + 1];
temp[2] = BCD[(ctoi(data[read]) * 4) + 2];
temp[3] = BCD[(ctoi(data[read]) * 4) + 3];
for(i = 4; i < 112; i++) {
temp[i] = 0;
}
binary_add(reg, temp);
}
}
void hex_dump(short int input_buffer[])
{
int i, digit, byte_space;
byte_space = 1;
for(i = 100; i >= 0; i-=4) {
digit = 0;
digit += 1 * input_buffer[i];
digit += 2 * input_buffer[i + 1];
digit += 4 * input_buffer[i + 2];
digit += 8 * input_buffer[i + 3];
switch(digit) {
case 0: printf("0"); break;
case 1: printf("1"); break;
case 2: printf("2"); break;
case 3: printf("3"); break;
case 4: printf("4"); break;
case 5: printf("5"); break;
case 6: printf("6"); break;
case 7: printf("7"); break;
case 8: printf("8"); break;
case 9: printf("9"); break;
case 10: printf("A"); break;
case 11: printf("B"); break;
case 12: printf("C"); break;
case 13: printf("D"); break;
case 14: printf("E"); break;
case 15: printf("F"); break;
}
if(byte_space == 1) {
byte_space = 0;
} else {
byte_space = 1;
printf(" ");
}
}
printf("\n");
}

42
backend/large.h Normal file
View File

@ -0,0 +1,42 @@
/* large.h - Handles binary manipulation of large numbers */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
static short int BCD[40] = {
0, 0, 0, 0,
1, 0, 0, 0,
0, 1, 0, 0,
1, 1, 0, 0,
0, 0, 1, 0,
1, 0, 1, 0,
0, 1, 1, 0,
1, 1, 1, 0,
0, 0, 0, 1,
1, 0, 0, 1 };
void binary_load(short int reg[], char data[]);
void binary_add(short int accumulator[], short int input_buffer[]);
void binary_subtract(short int accumulator[], short int input_buffer[]);
void shiftdown(short int buffer[]);
void shiftup(short int buffer[]);
short int islarger(short int accum[], short int reg[]);
void hex_dump(short int input_buffer[]);

296
backend/library.c Normal file
View File

@ -0,0 +1,296 @@
/* library.c - external functions of libzint
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"
struct zint_symbol *ZBarcode_Create()
{
struct zint_symbol *symbol;
int i, j;
symbol = malloc(sizeof(*symbol));
if (!symbol) return NULL;
memset(symbol, 0, sizeof(*symbol));
symbol->symbology = BARCODE_CODE128;
symbol->height = 0;
symbol->whitespace_width = 0;
symbol->border_width = 0;
symbol->output_options = 0;
symbol->rows = 0;
symbol->width = 0;
strcpy(symbol->fgcolour, "000000");
strcpy(symbol->bgcolour, "ffffff");
strcpy(symbol->outfile, "out.png");
symbol->option_1 = -1;
symbol->option_2 = 0;
strcpy(symbol->primary, "");
for(i = 0; i < 90; i++) {
for(j = 0; j < 1000; j++) {
symbol->encoded_data[i][j] = '0';
}
symbol->row_height[i] = 0;
}
return symbol;
}
int ZBarcode_Delete(struct zint_symbol *symbol)
{
free(symbol);
return 0;
}
extern int eanx(struct zint_symbol *symbol, unsigned char source[]); /* EAN system barcodes */
extern int c39(struct zint_symbol *symbol, unsigned char source[]); /* Code 3 from 9 (or Code 39) */
extern int pharmazentral(struct zint_symbol *symbol, unsigned char source[]); /* Pharmazentral Nummer (PZN) */
extern int ec39(struct zint_symbol *symbol, unsigned char source[]); /* Extended Code 3 from 9 (or Code 39+) */
extern int codabar(struct zint_symbol *symbol, unsigned char source[]); /* Codabar - a simple substitution cipher */
extern int matrix_two_of_five(struct zint_symbol *symbol, unsigned char source[]); /* Code 2 of 5 Standard (& Matrix) */
extern int industrial_two_of_five(struct zint_symbol *symbol, unsigned char source[]); /* Code 2 of 5 Industrial */
extern int iata_two_of_five(struct zint_symbol *symbol, unsigned char source[]); /* Code 2 of 5 IATA */
extern int interleaved_two_of_five(struct zint_symbol *symbol, unsigned char source[]); /* Code 2 of 5 Interleaved */
extern int logic_two_of_five(struct zint_symbol *symbol, unsigned char source[]); /* Code 2 of 5 Data Logic */
extern int itf14(struct zint_symbol *symbol, unsigned char source[]); /* ITF-14 */
extern int dpleit(struct zint_symbol *symbol, unsigned char source[]); /* Deutsche Post Leitcode */
extern int dpident(struct zint_symbol *symbol, unsigned char source[]); /* Deutsche Post Identcode */
extern int c93(struct zint_symbol *symbol, unsigned char source[]); /* Code 93 - a re-working of Code 39+, generates 2 check digits */
extern int code_128(struct zint_symbol *symbol, unsigned char source[]); /* Code 128 and NVE-18 */
extern int ean_128(struct zint_symbol *symbol, unsigned char source[]); /* EAN-128 (GS1-128) */
extern int code_11(struct zint_symbol *symbol, unsigned char source[]); /* Code 11 */
extern int msi_plessey(struct zint_symbol *symbol, unsigned char source[]); /* MSI Plessey without check digit */
extern int msi_plessey_mod10(struct zint_symbol *symbol, unsigned char source[]); /* MSI with check as on Barcode Island */
extern int msi_plessey_mod1010(struct zint_symbol *symbol, unsigned char source[]); /* MSI with two checks as Barcode Island */
extern int msi_plessey_mod11(struct zint_symbol *symbol, unsigned char source[]); /* MSI with Mod 11 check as Wikipedia */
extern int msi_plessey_mod1110(struct zint_symbol *symbol, unsigned char source[]); /* MSI with Mod 11 and Mod 10 */
extern int telepen(struct zint_symbol *symbol, unsigned char source[]); /* Telepen ASCII */
extern int telepen_num(struct zint_symbol *symbol, unsigned char source[]); /* Telepen Numeric */
extern int plessey(struct zint_symbol *symbol, unsigned char source[]); /* Plessey Code */
extern int pharma_one(struct zint_symbol *symbol, unsigned char source[]); /* Pharmacode One Track */
/* extern int korea(struct zint_symbol *symbol, unsigned char source[]); */
extern int flattermarken(struct zint_symbol *symbol, unsigned char source[]); /* Flattermarken */
extern int fim(struct zint_symbol *symbol, unsigned char source[]); /* Facing Identification Mark */
extern int pharma_two(struct zint_symbol *symbol, unsigned char source[]); /* Pharmacode Two Track */
extern int post_plot(struct zint_symbol *symbol, unsigned char source[]); /* Postnet */
extern int planet_plot(struct zint_symbol *symbol, unsigned char source[]); /* PLANET */
extern int imail(struct zint_symbol *symbol, unsigned char source[]); /* Intelligent Mail (aka USPS OneCode) */
extern int royal_plot(struct zint_symbol *symbol, unsigned char source[]); /* RM4SCC */
extern int australia_post(struct zint_symbol *symbol, unsigned char source[]); /* Australia Post 4-state */
extern int code16k(struct zint_symbol *symbol, unsigned char source[]); /* Code 16k */
extern int pdf417enc(struct zint_symbol *symbol, unsigned char source[]); /* PDF417 */
extern int dmatrix(struct zint_symbol *symbol, unsigned char source[]); /* Data Matrix (IEC16022) */
extern int qr_code(struct zint_symbol *symbol, unsigned char source[]); /* QR Code */
extern int micro_pdf417(struct zint_symbol *symbol, unsigned char source[]); /* Micro PDF417 */
extern int maxicode(struct zint_symbol *symbol, unsigned char source[]); /* Maxicode */
extern int rss14(struct zint_symbol *symbol, unsigned char source[]); /* RSS-14 */
extern int rsslimited(struct zint_symbol *symbol, unsigned char source[]); /* RSS Limited */
extern int rssexpanded(struct zint_symbol *symbol, unsigned char source[]); /* RSS Expanded */
extern int composite(struct zint_symbol *symbol, unsigned char source[]); /* Composite Symbology */
/* extern int aztec_mesa(struct zint_symbol *symbol, unsigned char source[]); */
/* extern int ultra_sample(struct zint_symbol *symbol, unsigned char source[]); */
extern int png_plot(struct zint_symbol *symbol);
extern int ps_plot(struct zint_symbol *symbol);
int ZBarcode_Encode(struct zint_symbol *symbol, unsigned char *input)
{
int errno;
errno = 0;
/* First check the symbology field */
if(symbol->symbology < 1) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; errno = WARN_INVALID_OPTION; }
/* symbol->symbologys 1 to 86 are defined by tbarcode */
if(symbol->symbology == 5) { symbol->symbology = BARCODE_C25MATRIX; }
if((symbol->symbology >= 10) && (symbol->symbology <= 12)) { symbol->symbology = BARCODE_EANX; }
if((symbol->symbology == 14) || (symbol->symbology == 15)) { symbol->symbology = BARCODE_EANX; }
if(symbol->symbology == 17) { symbol->symbology = BARCODE_UPCA; }
if(symbol->symbology == 19) { strcpy(symbol->errtxt, "Codabar 18 not supported, using Codabar"); symbol->symbology = BARCODE_CODABAR; errno = WARN_INVALID_OPTION; }
if(symbol->symbology == 24) { strcpy(symbol->errtxt, "Code 49 not supported, using Code 93"); symbol->symbology = BARCODE_CODE93; errno = WARN_INVALID_OPTION; }
if(symbol->symbology == 26) { symbol->symbology = BARCODE_UPCA; }
if(symbol->symbology == 27) { strcpy(symbol->errtxt, "UPCD1 not supported"); errno = ERROR_INVALID_OPTION; }
if(symbol->symbology == 33) { symbol->symbology = BARCODE_EAN128; }
if((symbol->symbology == 35) || (symbol->symbology == 36)) { symbol->symbology = BARCODE_UPCA; }
if((symbol->symbology == 38) || (symbol->symbology == 39)) { symbol->symbology = BARCODE_UPCE; }
if((symbol->symbology >= 41) && (symbol->symbology <= 45)) { symbol->symbology = BARCODE_POSTNET; }
if(symbol->symbology == 46) { symbol->symbology = BARCODE_PLESSEY; }
if(symbol->symbology == 48) { symbol->symbology = BARCODE_NVE18; }
if(symbol->symbology == 54) { strcpy(symbol->errtxt, "General Parcel Code not supported, using Code 128"); symbol->symbology = BARCODE_CODE128; errno = WARN_INVALID_OPTION; }
if((symbol->symbology == 59) || (symbol->symbology == 61)) { symbol->symbology = BARCODE_CODE128; }
if(symbol->symbology == 62) { symbol->symbology = BARCODE_CODE93; }
if((symbol->symbology == 64) || (symbol->symbology == 65)) { symbol->symbology = BARCODE_AUSPOST; }
if(symbol->symbology == 73) { strcpy(symbol->errtxt, "Codablock E not supported"); errno = ERROR_INVALID_OPTION; }
if(symbol->symbology == 74) { strcpy(symbol->errtxt, "Codablock F not supported"); errno = ERROR_INVALID_OPTION; }
if(symbol->symbology == 76) { strcpy(symbol->errtxt, "Japanese Postal Code not supported"); errno = ERROR_INVALID_OPTION; }
if(symbol->symbology == 77) { strcpy(symbol->errtxt, "Korean Postal Code not supported"); errno = ERROR_INVALID_OPTION; }
if(symbol->symbology == 78) { symbol->symbology = BARCODE_RSS14; }
if(symbol->symbology == 83) { symbol->symbology = BARCODE_PLANET; }
/* leave a gap for future expansion of tbarcode */
if((symbol->symbology >= 87) && (symbol->symbology <= 99)) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128\n"); symbol->symbology = BARCODE_CODE128; errno = WARN_INVALID_OPTION; }
/* Everything from 100 up is Zint-specific */
if(symbol->symbology == 107) { strcpy(symbol->errtxt, "Aztec Code not yet supported"); errno = ERROR_INVALID_OPTION; }
if(symbol->symbology == 108) { strcpy(symbol->errtxt, "Supercode not yet supported"); errno = ERROR_INVALID_OPTION; }
if(symbol->symbology == 109) { strcpy(symbol->errtxt, "Ultracode not yet supported"); errno = ERROR_INVALID_OPTION; }
if(symbol->symbology >= 120) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; errno = WARN_INVALID_OPTION; }
if(errno > 4) {
return errno;
}
if(symbol->symbology == BARCODE_CODE16K) {
symbol->whitespace_width = 16;
symbol->border_width = 2;
symbol->output_options = BARCODE_BIND;
}
if(symbol->symbology == BARCODE_ITF14) {
symbol->whitespace_width = 20;
symbol->border_width = 8;
symbol->output_options = BARCODE_BOX;
}
switch(symbol->symbology) {
case BARCODE_C25MATRIX: errno = matrix_two_of_five(symbol, input); break;
case BARCODE_C25IND: errno = industrial_two_of_five(symbol, input); break;
case BARCODE_C25INTER: errno = interleaved_two_of_five(symbol, input); break;
case BARCODE_C25IATA: errno = iata_two_of_five(symbol, input); break;
case BARCODE_C25LOGIC: errno = logic_two_of_five(symbol, input); break;
case BARCODE_DPLEIT: errno = dpleit(symbol, input); break;
case BARCODE_DPIDENT: errno = dpident(symbol, input); break;
case BARCODE_UPCA: errno = eanx(symbol, input); break;
case BARCODE_UPCE: errno = eanx(symbol, input); break;
case BARCODE_EANX: errno = eanx(symbol, input); break;
case BARCODE_EAN128: errno = ean_128(symbol, input); break;
case BARCODE_CODE39: errno = c39(symbol, input); break;
case BARCODE_PZN: errno = pharmazentral(symbol, input); break;
case BARCODE_EXCODE39: errno = ec39(symbol, input); break;
case BARCODE_CODABAR: errno = codabar(symbol, input); break;
case BARCODE_CODE93: errno = c93(symbol, input); break;
case BARCODE_LOGMARS: errno = c39(symbol, input); break;
case BARCODE_CODE128: errno = code_128(symbol, input); break;
case BARCODE_CODE128B: errno = code_128(symbol, input); break;
case BARCODE_NVE18: errno = code_128(symbol, input); break;
case BARCODE_CODE11: errno = code_11(symbol, input); break;
case BARCODE_MSI_PLESSEY: errno = msi_plessey(symbol, input); break;
case BARCODE_MSI_10: errno = msi_plessey_mod10(symbol, input); break;
case BARCODE_MSI_10_10: errno = msi_plessey_mod1010(symbol, input); break;
case BARCODE_MSI_11: errno = msi_plessey_mod11(symbol, input); break;
case BARCODE_MSI_11_10: errno = msi_plessey_mod1110(symbol, input); break;
case BARCODE_TELEPEN: errno = telepen(symbol, input); break;
case BARCODE_TELEPEN_NUM: errno = telepen_num(symbol, input); break;
case BARCODE_PHARMA: errno = pharma_one(symbol, input); break;
case BARCODE_PLESSEY: errno = plessey(symbol, input); break;
case BARCODE_ITF14: errno = itf14(symbol, input); break;
/* case BARCODE_KOREAPOST: errno = korea(symbol, input); break; */
case BARCODE_FLAT: errno = flattermarken(symbol, input); break;
case BARCODE_FIM: errno = fim(symbol, input); break;
case BARCODE_POSTNET: errno = post_plot(symbol, input); break;
case BARCODE_PLANET: errno = planet_plot(symbol, input); break;
case BARCODE_RM4SCC: errno = royal_plot(symbol, input); break;
case BARCODE_AUSPOST: errno = australia_post(symbol, input); break;
case BARCODE_AUSREPLY: errno = australia_post(symbol, input); break;
case BARCODE_AUSROUTE: errno = australia_post(symbol, input); break;
case BARCODE_AUSREDIRECT: errno = australia_post(symbol, input); break;
case BARCODE_CODE16K: errno = code16k(symbol, input); break;
case BARCODE_PHARMA_TWO: errno = pharma_two(symbol, input); break;
case BARCODE_ONECODE: errno = imail(symbol, input); break;
case BARCODE_DATAMATRIX: errno = dmatrix(symbol, input); break;
case BARCODE_PDF417: errno = pdf417enc(symbol, input); break;
case BARCODE_PDF417TRUNC: errno = pdf417enc(symbol, input); break;
case BARCODE_QRCODE: errno = qr_code(symbol, input); break;
case BARCODE_MICROPDF417: errno = micro_pdf417(symbol, input); break;
case BARCODE_ISBNX: errno = eanx(symbol, input); break;
case BARCODE_CODE39_43: errno = c39(symbol, input); break;
case BARCODE_EXCODE39_43: errno = ec39(symbol, input); break;
case BARCODE_MAXICODE: errno = maxicode(symbol, input); break;
case BARCODE_RSS14: errno = rss14(symbol, input); break;
case BARCODE_RSS14STACK: errno = rss14(symbol, input); break;
case BARCODE_RSS14STACK_OMNI: errno = rss14(symbol, input); break;
case BARCODE_RSS_LTD: errno = rsslimited(symbol, input); break;
case BARCODE_RSS_EXP: errno = rssexpanded(symbol, input); break;
case BARCODE_RSS_EXPSTACK: errno = rssexpanded(symbol, input); break;
case BARCODE_EANX_CC: errno = composite(symbol, input); break;
case BARCODE_EAN128_CC: errno = composite(symbol, input); break;
case BARCODE_RSS14_CC: errno = composite(symbol, input); break;
case BARCODE_RSS_LTD_CC: errno = composite(symbol, input); break;
case BARCODE_RSS_EXP_CC: errno = composite(symbol, input); break;
case BARCODE_UPCA_CC: errno = composite(symbol, input); break;
case BARCODE_UPCE_CC: errno = composite(symbol, input); break;
case BARCODE_RSS14STACK_CC: errno = composite(symbol, input); break;
case BARCODE_RSS14_OMNI_CC: errno = composite(symbol, input); break;
case BARCODE_RSS_EXPSTACK_CC: errno = composite(symbol, input); break;
/* case BARCODE_AZTEC: errno = aztec_mesa(symbol, input); break; */
/* case BARCODE_ULTRA: errno = ultra(symbol, input); break; */
}
return errno;
}
int ZBarcode_Print(struct zint_symbol *symbol)
{
int errno;
char output[4];
if(strlen(symbol->outfile) > 3) {
output[0] = symbol->outfile[strlen(symbol->outfile) - 3];
output[1] = symbol->outfile[strlen(symbol->outfile) - 2];
output[2] = symbol->outfile[strlen(symbol->outfile) - 1];
output[3] = '\0';
to_upper(output);
if(!(strcmp(output, "PNG"))) {
if(symbol->symbology == BARCODE_MAXICODE) {
errno = maxi_png_plot(symbol);
} else {
errno = png_plot(symbol);
}
} else {
if(!(strcmp(output, "EPS"))) {
errno = ps_plot(symbol);
} else {
strcpy(symbol->errtxt, "error: unknown output format");
return ERROR_INVALID_OPTION;
}
}
} else {
strcpy(symbol->errtxt, "error: unknown output format");
return ERROR_INVALID_OPTION;
}
return errno;
}
int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input)
{
int errno;
errno = 0;
errno = ZBarcode_Encode(symbol, input);
if(errno != 0) {
return errno;
}
errno = ZBarcode_Print(symbol);
return errno;
}

681
backend/maxicode.c Normal file
View File

@ -0,0 +1,681 @@
/* maxicode.c - Handles Maxicode */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/* This code has been thoroughly checked against ISO/IEC 16023:2000 */
#include "common.h"
#include "maxicode.h"
#include "reedsol.h"
#include <string.h>
int maxi_codeword[144];
void maxi_do_primary_check( )
{
/* Handles error correction of primary message */
char data[15];
char results[15];
int j;
int datalen = 10;
int ecclen = 10;
rs_init_gf(0x43);
rs_init_code(ecclen, 1);
for(j = 0; j < datalen; j += 1)
data[j] = maxi_codeword[j];
rs_encode(datalen, data, results);
for ( j = 0; j < ecclen; j += 1)
maxi_codeword[ datalen + j] = results[j];
}
void maxi_do_secondary_chk_odd( int ecclen )
{
/* Handles error correction of odd characters in secondary */
char data[100];
char results[30];
int j;
int datalen = 68;
rs_init_gf(0x43);
rs_init_code(ecclen, 1);
if (ecclen == 20)
datalen = 84;
for(j = 0; j < datalen; j += 1)
if ((j % 2) == 1) // odd
data[(j-1)/2] = maxi_codeword[j + 20];
rs_encode(datalen/2, data, results);
for ( j = 0; j < (ecclen); j += 1)
maxi_codeword[ datalen + (2 *j) + 1 + 20 ] = results[j];
}
void maxi_do_secondary_chk_even(int ecclen )
{
/* Handles error correction of even characters in secondary */
char data[100];
char results[30];
int j;
int datalen = 68;
if (ecclen == 20)
datalen = 84;
rs_init_gf(0x43);
rs_init_code(ecclen, 1);
for(j = 0; j < datalen + 1; j += 1)
if ((j % 2) == 0) // even
data[j/2] = maxi_codeword[j + 20];
rs_encode(datalen/2, data, results);
for ( j = 0; j < (ecclen); j += 1)
maxi_codeword[ datalen + (2 *j) + 20] = results[j];
}
int maxi_bump(int set[], int character[], int bump_posn)
{
/* Moves everything up so that a shift or latch can be inserted */
int i;
for(i = 143; i > bump_posn; i--) {
set[i] = set[i - 1];
character[i] = character[i - 1];
}
}
int maxi_text_process(int mode, unsigned char source[])
{
/* Format text according to Appendix A */
/* This code doesn't make use of [Lock in C], [Lock in D]
and [Lock in E] and so is not always the most efficient at
compressing data, but should suffice for most applications */
int set[144], character[144], i, j, done, count, length, current_set;
length = strlen(source);
if(length > 138) {
return ERROR_TOO_LONG;
}
for(i = 0; i < 144; i++) {
set[i] = -1;
character[i] = 0;
}
for (i = 0; i < length; i++) {
/* Look up characters in table from Appendix A - this gives
value and code set for most characters */
set[i] = maxiCodeSet[source[i]];
character[i] = maxiSymbolChar[source[i]];
}
/* If a character can be represented in more than one code set,
pick which version to use */
if(set[0] == 0) {
if(character[0] == 13) {
character[0] = 0;
}
set[0] = 1;
}
for(i = 1; i < length; i++) {
if(set[i] == 0) {
done = 0;
/* Special character */
if(character[i] == 13) {
/* Carriage Return */
if(set[i - 1] == 5) {
character[i] = 13;
set[i] = 5;
} else {
if((i != length - 1) && (set[i + 1] == 5)) {
character[i] = 13;
set[i] = 5;
} else {
character[i] = 0;
set[i] = 1;
}
}
done = 1;
}
if((character[i] == 28) && (done == 0)) {
/* FS */
if(set[i - 1] == 5) {
character[i] = 32;
set[i] = 5;
} else {
set[i] = set[i - 1];
}
done = 1;
}
if((character[i] == 29) && (done == 0)) {
/* GS */
if(set[i - 1] == 5) {
character[i] = 33;
set[i] = 5;
} else {
set[i] = set[i - 1];
}
done = 1;
}
if((character[i] == 30) && (done == 0)) {
/* RS */
if(set[i - 1] == 5) {
character[i] = 34;
set[i] = 5;
} else {
set[i] = set[i - 1];
}
done = 1;
}
if((character[i] == 32) && (done == 0)) {
/* Space */
if(set[i - 1] == 1) {
character[i] = 32;
set[i] = 1;
}
if(set[i - 1] == 2) {
character[i] = 47;
set[i] = 2;
}
if(set[i - 1] >= 3) {
if(i != length - 1) {
if(set[i + 1] == 1) {
character[i] = 32;
set[i] = 1;
}
if(set[i + 1] == 2) {
character[i] = 47;
set[i] = 2;
}
if(set[i + 1] >= 3) {
character[i] = 59;
set[i] = set[i - 1];
}
} else {
character[i] = 59;
set[i] = set[i - 1];
}
}
done = 1;
}
if((character[i] == 44) && (done == 0)) {
/* Comma */
if(set[i - 1] == 2) {
character[i] = 48;
set[i] = 2;
} else {
if((i != length - 1) && (set[i + 1] == 2)) {
character[i] = 48;
set[i] = 2;
} else {
set[i] = 1;
}
}
done = 1;
}
if((character[i] == 46) && (done == 0)) {
/* Full Stop */
if(set[i - 1] == 2) {
character[i] = 49;
set[i] = 2;
} else {
if((i != length - 1) && (set[i + 1] == 2)) {
character[i] = 49;
set[i] = 2;
} else {
set[i] = 1;
}
}
done = 1;
}
if((character[i] == 47) && (done == 0)) {
/* Slash */
if(set[i - 1] == 2) {
character[i] = 50;
set[i] = 2;
} else {
if((i != length - 1) && (set[i + 1] == 2)) {
character[i] = 50;
set[i] = 2;
} else {
set[i] = 1;
}
}
done = 1;
}
if((character[i] == 58) && (done == 0)) {
/* Colon */
if(set[i - 1] == 2) {
character[i] = 51;
set[i] = 2;
} else {
if((i != length - 1) && (set[i + 1] == 2)) {
character[i] = 51;
set[i] = 2;
} else {
set[i] = 1;
}
}
done = 1;
}
}
}
for(i = strlen(source); i < 144; i++) {
/* Add the padding */
if(set[length - 1] == 2) {
set[i] = 2;
} else {
set[i] = 1;
}
character[i] = 33;
}
/* Find candidates for number compression */
if((mode == 2) || (mode ==3)) { j = 0; } else { j = 9; }
/* Number compression not allowed in primary message */
count = 0;
for(i = j; i < 143; i++) {
if((set[i] == 1) && ((character[i] >= 48) && (character[i] <= 57))) {
/* Character is a number */
count++;
} else {
count = 0;
}
if(count == 9) {
/* Nine digits in a row can be compressed */
set[i] = 6;
set[i - 1] = 6;
set[i - 2] = 6;
set[i - 3] = 6;
set[i - 4] = 6;
set[i - 5] = 6;
set[i - 6] = 6;
set[i - 7] = 6;
set[i - 8] = 6;
count = 0;
}
}
/* Add shift and latch characters */
current_set = 1;
i = 0;
do {
if(set[i] != current_set) {
switch(set[i]) {
case 1:
if(set[i + 1] == 1) {
if(set[i + 2] == 1) {
if(set[i + 3] == 1) {
/* Latch A */
maxi_bump(set, character, i);
character[i] = 63;
current_set = 1;
length++;
} else {
/* 3 Shift A */
maxi_bump(set, character, i);
character[i] = 57;
length++;
i += 2;
}
} else {
/* 2 Shift A */
maxi_bump(set, character, i);
character[i] = 56;
length++;
i++;
}
} else {
/* Shift A */
maxi_bump(set, character, i);
character[i] = 59;
length++;
}
break;
case 2:
if(set[i + 1] == 2) {
/* Latch B */
maxi_bump(set, character, i);
character[i] = 63;
current_set = 2;
length++;
} else {
/* Shift B */
maxi_bump(set, character, i);
character[i] = 59;
length++;
}
break;
case 3:
/* Shift C */
maxi_bump(set, character, i);
character[i] = 60;
length++;
break;
case 4:
/* Shift D */
maxi_bump(set, character, i);
character[i] = 61;
length++;
break;
case 5:
/* Shift E */
maxi_bump(set, character, i);
character[i] = 62;
length++;
break;
case 6:
/* Number Compressed */
/* Do nothing */
break;
}
i++;
}
i++;
} while(i < 145);
/* Number compression has not been forgotten! - It's handled below */
i = 0;
do {
if (set[i] == 6) {
/* Number compression */
char substring[10];
int value;
for(j = 0; j < 10; j++) {
substring[j] = character[i + j];
}
substring[10] = '\0';
value = atoi(substring);
character[i] = 31; /* NS */
character[i + 1] = (value & 0x3f000000) >> 24;
character[i + 2] = (value & 0xfc0000) >> 18;
character[i + 3] = (value & 0x3f000) >> 12;
character[i + 4] = (value & 0xfc0) >> 6;
character[i + 5] = (value & 0x3f);
i += 6;
for(j = i; j < 140; j++) {
set[j] = set[j + 3];
character[j] = character[j + 3];
}
length -= 3;
} else {
i++;
}
} while (i <= 143);
if(((mode ==2) || (mode == 3)) && (length > 84)) {
return ERROR_TOO_LONG;
}
if(((mode == 4) || (mode == 6)) && (length > 93)) {
return ERROR_TOO_LONG;
}
if((mode == 5) && (length > 77)) {
return ERROR_TOO_LONG;
}
/* Copy the encoded text into the codeword array */
if((mode == 2) || (mode == 3)) {
for(i = 0; i < 84; i++) { /* secondary only */
maxi_codeword[i + 20] = character[i];
}
}
if((mode == 4) || (mode == 6)) {
for(i = 0; i < 9; i++) { /* primary */
maxi_codeword[i + 1] = character[i];
}
for(i = 0; i < 84; i++) { /* secondary */
maxi_codeword[i + 20] = character[i + 9];
}
}
if(mode == 5) {
for(i = 0; i < 9; i++) { /* primary */
maxi_codeword[i + 1] = character[i];
}
for(i = 0; i < 68; i++) { /* secondary */
maxi_codeword[i + 20] = character[i + 9];
}
}
return 0;
}
void maxi_do_primary_2(char postcode[], int country, int service)
{
/* Format structured primary for Mode 2 */
int postcode_length, postcode_num, i;
for(i = 0; i < 10; i++) {
if((postcode[i] <= '0') || (postcode[i] >= '9')) {
postcode[i] = '\0';
}
}
postcode_length = strlen(postcode);
postcode_num = atoi(postcode);
maxi_codeword[0] = ((postcode_num & 0x03) << 4) | 2;
maxi_codeword[1] = ((postcode_num & 0xfc) >> 2);
maxi_codeword[2] = ((postcode_num & 0x3f00) >> 8);
maxi_codeword[3] = ((postcode_num & 0xfc000) >> 14);
maxi_codeword[4] = ((postcode_num & 0x3f00000) >> 20);
maxi_codeword[5] = ((postcode_num & 0x3c000000) >> 26) | ((postcode_length & 0x3) << 4);
maxi_codeword[6] = ((postcode_length & 0x3c) >> 2) | ((country & 0x3) << 4);
maxi_codeword[7] = (country & 0xfc) >> 2;
maxi_codeword[8] = ((country & 0x300) >> 8) | ((service & 0xf) << 2);
maxi_codeword[9] = ((service & 0x3f0) >> 4);
}
void maxi_do_primary_3(char postcode[], int country, int service)
{
/* Format structured primary for Mode 3 */
int i;
to_upper(postcode);
for(i = 0; i < strlen(postcode); i++) {
if((postcode[i] >= 65) && (postcode[i] <= 90)) {
/* (Capital) letters shifted to Code Set A values */
postcode[i] = postcode[i] - 64;
}
if(((postcode[i] == 27) || (postcode[i] == 31)) || ((postcode[i] == 33) || (postcode[i] >= 59))) {
/* Not a valid postcode character */
postcode[i] = ' ';
}
/* Input characters lower than 27 (NUL - SUB) in postcode are
interpreted as capital letters in Code Set A (e.g. LF becomes 'J') */
}
maxi_codeword[0] = ((postcode[5] & 0x03) << 4) | 3;
maxi_codeword[1] = ((postcode[4] & 0x03) << 4) | ((postcode[5] & 0x3c) >> 2);
maxi_codeword[2] = ((postcode[3] & 0x03) << 4) | ((postcode[4] & 0x3c) >> 2);
maxi_codeword[3] = ((postcode[2] & 0x03) << 4) | ((postcode[3] & 0x3c) >> 2);
maxi_codeword[4] = ((postcode[1] & 0x03) << 4) | ((postcode[2] & 0x3c) >> 2);
maxi_codeword[5] = ((postcode[0] & 0x03) << 4) | ((postcode[1] & 0x3c) >> 2);
maxi_codeword[6] = ((postcode[0] & 0x3c) >> 2) | ((country & 0x3) << 4);
maxi_codeword[7] = (country & 0xfc) >> 2;
maxi_codeword[8] = ((country & 0x300) >> 8) | ((service & 0xf) << 2);
maxi_codeword[9] = ((service & 0x3f0) >> 4);
}
int maxicode(struct zint_symbol *symbol, unsigned char source[])
{
int i, j, block, bit, mode, countrycode = 0, service = 0;
int bit_pattern[7], internal_error = 0, eclen;
char postcode[12], countrystr[4], servicestr[4];
mode = symbol->option_1;
strcpy(postcode, "");
strcpy(countrystr, "");
strcpy(servicestr, "");
for(i = 0; i < 145; i++) {
maxi_codeword[i] = 0;
}
if(mode == -1) { /* If mode is unspecified */
if(strlen(symbol->primary) == 0) {
mode = 4;
} else {
mode = 2;
for(i = 0; i < 10; i++) {
if((symbol->primary[i] < 48) || (symbol->primary[i] > 57)) {
mode = 3;
}
}
}
}
if((mode < 2) || (mode > 6)) { /* Only codes 2 to 6 supported */
strcpy(symbol->errtxt, "Error: Invalid Maxicode Mode");
return ERROR_INVALID_OPTION;
}
if((mode == 2) || (mode == 3)) { /* Modes 2 and 3 need data in symbol->primary */
if(strlen(symbol->primary) != 15) {
strcpy(symbol->errtxt, "Error: Invalid Primary String");
return ERROR_INVALID_DATA;
}
for(i = 9; i < 15; i++) { /* check that country code and service are numeric */
if((symbol->primary[i] < 48) || (symbol->primary[i] > 57)) {
strcpy(symbol->errtxt, "Error: Invalid Primary String");
return ERROR_INVALID_DATA;
}
}
strncpy(postcode, symbol->primary, 9);
postcode[9] = '\0';
if(mode == 2) {
for(i = 0; i < 10; i++) {
if(postcode[i] == ' ') {
postcode[i] = '\0';
}
}
}
if(mode == 3) { postcode[6] = '\0'; }
countrystr[0] = symbol->primary[9];
countrystr[1] = symbol->primary[10];
countrystr[2] = symbol->primary[11];
countrystr[3] = '\0';
servicestr[0] = symbol->primary[12];
servicestr[1] = symbol->primary[13];
servicestr[2] = symbol->primary[14];
servicestr[3] = '\0';
countrycode = atoi(countrystr);
service = atoi(servicestr);
if(mode == 2) { maxi_do_primary_2(postcode, countrycode, service); }
if(mode == 3) { maxi_do_primary_3(postcode, countrycode, service); }
} else {
maxi_codeword[0] = mode;
}
i = maxi_text_process(mode, source);
if(i == ERROR_TOO_LONG ) {
strcpy(symbol->errtxt, "Error: Input data too long");
return i;
}
/* All the data is sorted - now do error correction */
maxi_do_primary_check(); /* always EEC */
if ( mode == 5 )
eclen = 56; // 68 data codewords , 56 error corrections
else
eclen = 40; // 84 data codewords, 40 error corrections
maxi_do_secondary_chk_even(eclen/2); // do error correction of even
maxi_do_secondary_chk_odd(eclen/2); // do error correction of odd
/* Copy data into symbol grid */
for(i = 0; i < 33; i++) {
for(j = 0; j < 30; j++) {
symbol->encoded_data[i][j] = '0';
block = (MaxiGrid[(i * 30) + j] + 5) / 6;
bit = (MaxiGrid[(i * 30) + j] + 5) % 6;
if(block != 0) {
bit_pattern[0] = (maxi_codeword[block - 1] & 0x20) >> 5;
bit_pattern[1] = (maxi_codeword[block - 1] & 0x10) >> 4;
bit_pattern[2] = (maxi_codeword[block - 1] & 0x8) >> 3;
bit_pattern[3] = (maxi_codeword[block - 1] & 0x4) >> 2;
bit_pattern[4] = (maxi_codeword[block - 1] & 0x2) >> 1;
bit_pattern[5] = (maxi_codeword[block - 1] & 0x1);
if(bit_pattern[bit] != 0) {
symbol->encoded_data[i][j] = '1';
}
}
}
}
/* Add orientation markings */
symbol->encoded_data[0][28] = '1'; // Top right filler
symbol->encoded_data[0][29] = '1';
symbol->encoded_data[9][10] = '1'; // Top left marker
symbol->encoded_data[9][11] = '1';
symbol->encoded_data[10][11] = '1';
symbol->encoded_data[15][7] = '1'; // Left hand marker
symbol->encoded_data[16][8] = '1';
symbol->encoded_data[16][20] = '1'; // Right hand marker
symbol->encoded_data[17][20] = '1';
symbol->encoded_data[22][10] = '1'; // Bottom left marker
symbol->encoded_data[23][10] = '1';
symbol->encoded_data[22][17] = '1'; // Bottom right marker
symbol->encoded_data[23][17] = '1';
symbol->width = 30;
symbol->rows = 33;
return internal_error;
}

90
backend/maxicode.h Normal file
View File

@ -0,0 +1,90 @@
/* maxicode.h - Handles Maxicode */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
static int MaxiGrid[990] = { /* ISO/IEC 16023 Figure 5 - MaxiCode Module Sequence */
122, 121, 128, 127, 134, 133, 140, 139, 146, 145, 152, 151, 158, 157, 164, 163, 170, 169, 176, 175, 182, 181, 188, 187, 194, 193, 200, 199, 0, 0,
124, 123, 130, 129, 136, 135, 142, 141, 148, 147, 154, 153, 160, 159, 166, 165, 172, 171, 178, 177, 184, 183, 190, 189, 196, 195, 202, 201, 817, 0,
126, 125, 132, 131, 138, 137, 144, 143, 150, 149, 156, 155, 162, 161, 168, 167, 174, 173, 180, 179, 186, 185, 192, 191, 198, 197, 204, 203, 819, 818,
284, 283, 278, 277, 272, 271, 266, 265, 260, 259, 254, 253, 248, 247, 242, 241, 236, 235, 230, 229, 224, 223, 218, 217, 212, 211, 206, 205, 820, 0,
286, 285, 280, 279, 274, 273, 268, 267, 262, 261, 256, 255, 250, 249, 244, 243, 238, 237, 232, 231, 226, 225, 220, 219, 214, 213, 208, 207, 822, 821,
288, 287, 282, 281, 276, 275, 270, 269, 264, 263, 258, 257, 252, 251, 246, 245, 240, 239, 234, 233, 228, 227, 222, 221, 216, 215, 210, 209, 823, 0,
290, 289, 296, 295, 302, 301, 308, 307, 314, 313, 320, 319, 326, 325, 332, 331, 338, 337, 344, 343, 350, 349, 356, 355, 362, 361, 368, 367, 825, 824,
292, 291, 298, 297, 304, 303, 310, 309, 316, 315, 322, 321, 328, 327, 334, 333, 340, 339, 346, 345, 352, 351, 358, 357, 364, 363, 370, 369, 826, 0,
294, 293, 300, 299, 306, 305, 312, 311, 318, 317, 324, 323, 330, 329, 336, 335, 342, 341, 348, 347, 354, 353, 360, 359, 366, 365, 372, 371, 828, 827,
410, 409, 404, 403, 398, 397, 392, 391, 80, 79, 0, 0, 14, 13, 38, 37, 3, 0, 45, 44, 110, 109, 386, 385, 380, 379, 374, 373, 829, 0,
412, 411, 406, 405, 400, 399, 394, 393, 82, 81, 41, 0, 16, 15, 40, 39, 4, 0, 0, 46, 112, 111, 388, 387, 382, 381, 376, 375, 831, 830,
414, 413, 408, 407, 402, 401, 396, 395, 84, 83, 42, 0, 0, 0, 0, 0, 6, 5, 48, 47, 114, 113, 390, 389, 384, 383, 378, 377, 832, 0,
416, 415, 422, 421, 428, 427, 104, 103, 56, 55, 17, 0, 0, 0, 0, 0, 0, 0, 21, 20, 86, 85, 434, 433, 440, 439, 446, 445, 834, 833,
418, 417, 424, 423, 430, 429, 106, 105, 58, 57, 0, 0, 0, 0, 0, 0, 0, 0, 23, 22, 88, 87, 436, 435, 442, 441, 448, 447, 835, 0,
420, 419, 426, 425, 432, 431, 108, 107, 60, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 90, 89, 438, 437, 444, 443, 450, 449, 837, 836,
482, 481, 476, 475, 470, 469, 49, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 54, 53, 464, 463, 458, 457, 452, 451, 838, 0,
484, 483, 478, 477, 472, 471, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 466, 465, 460, 459, 454, 453, 840, 839,
486, 485, 480, 479, 474, 473, 52, 51, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 43, 468, 467, 462, 461, 456, 455, 841, 0,
488, 487, 494, 493, 500, 499, 98, 97, 62, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 92, 91, 506, 505, 512, 511, 518, 517, 843, 842,
490, 489, 496, 495, 502, 501, 100, 99, 64, 63, 0, 0, 0, 0, 0, 0, 0, 0, 29, 28, 94, 93, 508, 507, 514, 513, 520, 519, 844, 0,
492, 491, 498, 497, 504, 503, 102, 101, 66, 65, 18, 0, 0, 0, 0, 0, 0, 0, 19, 30, 96, 95, 510, 509, 516, 515, 522, 521, 846, 845,
560, 559, 554, 553, 548, 547, 542, 541, 74, 73, 33, 0, 0, 0, 0, 0, 0, 11, 68, 67, 116, 115, 536, 535, 530, 529, 524, 523, 847, 0,
562, 561, 556, 555, 550, 549, 544, 543, 76, 75, 0, 0, 8, 7, 36, 35, 12, 0, 70, 69, 118, 117, 538, 537, 532, 531, 526, 525, 849, 848,
564, 563, 558, 557, 552, 551, 546, 545, 78, 77, 0, 34, 10, 9, 26, 25, 0, 0, 72, 71, 120, 119, 540, 539, 534, 533, 528, 527, 850, 0,
566, 565, 572, 571, 578, 577, 584, 583, 590, 589, 596, 595, 602, 601, 608, 607, 614, 613, 620, 619, 626, 625, 632, 631, 638, 637, 644, 643, 852, 851,
568, 567, 574, 573, 580, 579, 586, 585, 592, 591, 598, 597, 604, 603, 610, 609, 616, 615, 622, 621, 628, 627, 634, 633, 640, 639, 646, 645, 853, 0,
570, 569, 576, 575, 582, 581, 588, 587, 594, 593, 600, 599, 606, 605, 612, 611, 618, 617, 624, 623, 630, 629, 636, 635, 642, 641, 648, 647, 855, 854,
728, 727, 722, 721, 716, 715, 710, 709, 704, 703, 698, 697, 692, 691, 686, 685, 680, 679, 674, 673, 668, 667, 662, 661, 656, 655, 650, 649, 856, 0,
730, 729, 724, 723, 718, 717, 712, 711, 706, 705, 700, 699, 694, 693, 688, 687, 682, 681, 676, 675, 670, 669, 664, 663, 658, 657, 652, 651, 858, 857,
732, 731, 726, 725, 720, 719, 714, 713, 708, 707, 702, 701, 696, 695, 690, 689, 684, 683, 678, 677, 673, 671, 666, 665, 660, 659, 654, 653, 859, 0,
734, 733, 740, 739, 746, 745, 752, 751, 758, 757, 764, 763, 770, 769, 776, 775, 782, 781, 788, 787, 794, 793, 800, 799, 806, 805, 812, 811, 861, 860,
736, 735, 742, 741, 748, 747, 754, 753, 760, 759, 766, 765, 772, 771, 778, 777, 784, 783, 790, 789, 796, 795, 802, 801, 808, 807, 814, 813, 862, 0,
738, 737, 744, 743, 750, 749, 756, 755, 762, 761, 768, 767, 774, 773, 780, 779, 786, 785, 792, 791, 798, 797, 804, 803, 810, 809, 816, 815, 864, 863
};
int maxiCodeSet[256] = { /* from Appendix A - ASCII character to Code Set (e.g. 2 = Set B) */
/* set 0 refers to special characters that fit into more than one set (e.g. GS) */
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 0, 2, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2,
2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4,
4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 4, 5, 5, 5, 5, 5, 5, 4, 5, 3, 4, 3, 5, 5, 4, 4, 3, 3, 3,
4, 3, 5, 4, 4, 3, 3, 4, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4
};
int maxiSymbolChar[256] = { /* from Appendix A - ASCII character to symbol value */
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 30, 28, 29, 30, 35, 32, 53, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 37,
38, 39, 40, 41, 52, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 42, 43, 44, 45, 46, 0, 1, 2, 3,
4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 32, 54, 34, 35, 36, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 47, 48,
49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 36,
37, 37, 38, 39, 40, 41, 42, 43, 38, 44, 37, 39, 38, 45, 46, 40, 41, 39, 40, 41,
42, 42, 47, 43, 44, 43, 44, 45, 45, 46, 47, 46, 0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 32,
33, 34, 35, 36, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 32, 33, 34, 35, 36
};

588
backend/maxipng.h Normal file
View File

@ -0,0 +1,588 @@
/* maxipng.h - Shapes for Maxicode output to PNG file */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/* This file contains the pixel-by-pixel representation of maxicode glyphs
at a resolution of 12 pixels per millimeter. hexagon[] is taken directly
from ISO 16023 Annex J. bullseye[] was calculated by the Gimp */
#define SSET "0123456789ABCDEF"
static int hexagon[120] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
0, 0, 0, 1, 1, 1, 1, 1, 0, 0,
0, 0, 1, 1, 1, 1, 1, 1, 1, 0,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 1, 1, 1, 1, 1, 1, 1, 0,
0, 0, 0, 1, 1, 1, 1, 1, 0, 0,
0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
static char bullseye[34532] =
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"````````````````````````````````````````````````````!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````"
"````````````````````````````````````````````````````````!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````"
"````````````````````````````````````````````````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````````````````````"
"````````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````"
"````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````````````````````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````````````````````````````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"````````````````````````````````````````````````````````````````"
"````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````````````````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````````"
"````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````````````````````````````````````````````"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````````````````````"
"````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````"
"````````````````````````````````````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````"
"````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````````````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````"
"````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````````````````````!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````````````````````````````````````````!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````"
"````````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````````````````````"
"````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````````````````````!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````"
"````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````"
"````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````"
"````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!````````````````````````````````````````!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````"
"````````````````````````````````````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````"
"````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````"
"````````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````"
"````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````"
"````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````"
"````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````````````````````````````````````````````````````"
"````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!````````````````````````````````````````!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!````````````````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!````````````````````````````````````!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````"
"````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````"
"````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````````````````````````````"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````````````````````````````````````````````!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````````"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"````````````````````````````````````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!````````````````````````````````!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````"
"````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````"
"````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````"
"````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````"
"````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````````!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!````````````````````````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````````!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````"
"````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````"
"````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````````````````````"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````"
"````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````"
"````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````````````````````````````````````````!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!````````````````````````````````````!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!````````````````````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````"
"````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````"
"````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````"
"````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````"
"````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!````````````````````````````````!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!````````````````````````````````!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````"
"````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````"
"````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````"
"````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!````````````````````````````````````````````!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````````````````!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````"
"````````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!````````````````````````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"````````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````"
"````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````"
"````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````"
"````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````"
"````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````"
"````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````````````````````````````````````````````````````"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````````!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````"
"````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````"
"````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````"
"````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````"
"````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````"
"````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````"
"````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````"
"````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!````````````````````````````````````````!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````"
"````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````````````````````````````````````````````"
"````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````"
"````````````````````````````````````````````````````````!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````"
"````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````"
"````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!````````````````````````````````````````!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````````````!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````"
"````````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````"
"````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````````````````````````````````````````````````````"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````"
"````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````"
"````````````````````````````````````````````````````````!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````````````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````"
"````````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````"
"````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````"
"````````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````"
"````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````````````````````"
"````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````````````````````````````"
"````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````````````````````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"````````````````````````````````````````````````````````````````"
"````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````````````````````````````````````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````"
"````````````````````````````````````````````````````````````````"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````"
"````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
"!!!!````````````````````````````````````````````````````````````"
"````````````````````````````````````````````````````````````````"
"````````````````````````````````````";

237
backend/medical.c Normal file
View File

@ -0,0 +1,237 @@
/* medical.c - Handles 1 track and 2 track pharmacode and Codabar */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "common.h"
/* Codabar table checked against EN 798:1995 */
#define CASET "0123456789-$:/.+ABCD"
static char *CodaTable[20] = {"11111221", "11112211", "11121121", "22111111", "11211211", "21111211",
"12111121", "12112111", "12211111", "21121111", "11122111", "11221111", "21112121", "21211121",
"21212111", "11212121", "11221211", "12121121", "11121221", "11122211"};
int pharma_one(struct zint_symbol *symbol, unsigned char source[])
{
/* "Pharmacode can represent only a single integer from 3 to 131070. Unlike other
commonly used one-dimensional barcode schemes, pharmacode does not store the data in a
form corresponding to the human-readable digits; the number is encoded in binary, rather
than decimal. Pharmacode is read from right to left: with n as the bar position starting
at 0 on the right, each narrow bar adds 2n to the value and each wide bar adds 2(2^n).
The minimum barcode is 2 bars and the maximum 16, so the smallest number that could
be encoded is 3 (2 narrow bars) and the biggest is 131070 (16 wide bars)."
- http://en.wikipedia.org/wiki/Pharmacode */
/* This code uses the One Track Pharamacode calculating algorithm as recommended by
the specification at http://www.laetus.com/laetus.php?request=file&id=69 */
unsigned long int tester;
int counter;
char inter[17];
int errno;
char dest[1000];
errno = 0;
strcpy(dest, "");
if(strlen(source) > 6) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(NESET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
strcpy(inter, "");
tester = atoi(source);
if((tester < 3) || (tester > 131070)) {
strcpy(symbol->errtxt, "error: data out of range");
return ERROR_INVALID_DATA;
}
do
{
if(tester%2 == 0) {
concat(inter, "W");
tester = (tester - 2) / 2;
} else {
concat(inter, "N");
tester = (tester - 1) / 2;
}
}
while(tester != 0);
for(counter = (strlen(inter) - 1); counter >= 0; counter--) {
if(inter[counter] == 'W') {
concat(dest, "32");
} else {
concat(dest, "12");
}
}
expand(symbol, dest);
strcpy(symbol->text, "");
return errno;
}
int pharma_two_calc(struct zint_symbol *symbol, unsigned char source[], char dest[])
{
/* This code uses the Two Track Pharamacode defined in the document at
http://www.laetus.com/laetus.php?request=file&id=69 and using a modified
algorithm from the One Track system. This standard accepts integet values
from 4 to 64570080. */
unsigned long int tester;
int counter;
char inter[17];
int errno;
errno = 0;
strcpy(dest, "");
strcpy(inter, "");
tester = atoi(source);
if((tester < 4) || (tester > 64570080))
{
strcpy(symbol->errtxt, "error: data out of range");
return ERROR_INVALID_DATA;
}
do
{
switch(tester%3) {
case 0:
concat(inter, "3");
tester = (tester - 3) / 3;
break;
case 1:
concat(inter, "1");
tester = (tester - 1) / 3;
break;
case 2:
concat(inter, "2");
tester = (tester - 2) / 3;
break;
}
}
while(tester != 0);
for(counter = (strlen(inter) - 1); counter >= 0; counter--)
{
dest[(strlen(inter) - 1) - counter] = inter[counter];
}
dest[strlen(inter)] = '\0';
return errno;
}
int pharma_two(struct zint_symbol *symbol, unsigned char source[])
{
/* Draws the patterns for two track pharmacode */
char height_pattern[200];
unsigned int loopey;
int writer;
int errno = 0;
strcpy(height_pattern, "");
if(strlen(source) > 8) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(NESET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
errno = pharma_two_calc(symbol, source, height_pattern);
if(errno != 0) {
return errno;
}
writer = 0;
for(loopey = 0; loopey < strlen(height_pattern); loopey++)
{
if((height_pattern[loopey] == '2') || (height_pattern[loopey] == '3'))
{
symbol->encoded_data[0][writer] = '1';
}
if((height_pattern[loopey] == '1') || (height_pattern[loopey] == '3'))
{
symbol->encoded_data[1][writer] = '1';
}
writer += 2;
}
symbol->rows = 2;
symbol->width = writer - 1;
strcpy(symbol->text, "");
return errno;
}
int codabar(struct zint_symbol *symbol, unsigned char source[])
{ /* The Codabar system consisting of simple substitution */
int i, errno;
char dest[1000];
errno = 0;
strcpy(dest, "");
if(strlen(source) > 60) { /* No stack smashing please */
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
to_upper(source);
errno = is_sane(CASET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
/* Codabar must begin and end with the characters A, B, C or D */
if(((source[0] != 'A') && (source[0] != 'B')) &&
((source[0] != 'C') && (source[0] != 'D')))
{
strcpy(symbol->errtxt, "error: invalid characters in data");
return 6;
}
if(((source[strlen(source) - 1] != 'A') && (source[strlen(source) - 1] != 'B')) &&
((source[strlen(source) - 1] != 'C') && (source[strlen(source) - 1] != 'D')))
{
strcpy(symbol->errtxt, "error: invalid characters in data");
return 6;
}
for(i = 0; i <= strlen(source); i++)
{
lookup(CASET, CodaTable, source[i], dest);
}
expand(symbol, dest);
strcpy(symbol->text, source);
return errno;
}

29
backend/no_qr.c Normal file
View File

@ -0,0 +1,29 @@
/* no_qr.c Handlier if no QR Encode library is available */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <string.h>
#include "common.h"
int qr_code(struct zint_symbol *symbol, unsigned char source[])
{
strcpy(symbol->errtxt, "error: QR Code library <qrencode> not available");
return ERROR_INVALID_OPTION;
}

1039
backend/pdf417.c Normal file

File diff suppressed because it is too large Load Diff

454
backend/pdf417.h Normal file
View File

@ -0,0 +1,454 @@
/* pdf417.h - PDF417 tables and coefficients */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart (zint@hotmail.co.uk)
Portions Copyright (C) 2004 Grandzebu
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/* this file contains the character table, the pre-calculated coefficients and the
codeword patterns taken from lines 416 to 454 of pdf417.frm */
#define TRUE 1
#define FALSE 0
#define TEX 900
#define BYT 901
#define NUM 902
#define PDF_MAX 928
#define BRSET "ABCDEFabcdefghijklmnopqrstuvwxyz*+-"
/* text mode processing tables */
static int asciix[95] = { 7, 8, 8, 4, 12, 4, 4, 8, 8, 8, 12, 4, 12, 12, 12, 12, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 12, 8, 8, 4, 8, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 8, 8, 8, 4, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 8, 8, 8, 8 };
static int asciiy[95] = { 26, 10, 20, 15, 18, 21, 10, 28, 23, 24, 22, 20, 13, 16, 17, 19, 0, 1, 2, 3,
4, 5, 6, 7, 8, 9, 14, 0, 1, 23, 2, 25, 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 4, 5, 6, 24, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 21, 27, 9 };
/* PDF417 error correction coefficients from Grand Zebu */
static int coefrs[1022] = {
/* k = 2 */
27, 917,
/* k = 4 */
522, 568, 723, 809,
/* k = 8 */
237, 308, 436, 284, 646, 653, 428, 379,
/* k = 16 */
274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428, 295, 42, 176, 65,
/* k = 32 */
361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742, 687, 284, 193, 517,
273, 494, 263, 147, 593, 800, 571, 320, 803, 133, 231, 390, 685, 330, 63, 410,
/* k = 64 */
539, 422, 6, 93, 862, 771, 453, 106, 610, 287, 107, 505, 733, 877, 381, 612,
723, 476, 462, 172, 430, 609, 858, 822, 543, 376, 511, 400, 672, 762, 283, 184,
440, 35, 519, 31, 460, 594, 225, 535, 517, 352, 605, 158, 651, 201, 488, 502,
648, 733, 717, 83, 404, 97, 280, 771, 840, 629, 4, 381, 843, 623, 264, 543,
/* k = 128 */
521, 310, 864, 547, 858, 580, 296, 379, 53, 779, 897, 444, 400, 925, 749, 415,
822, 93, 217, 208, 928, 244, 583, 620, 246, 148, 447, 631, 292, 908, 490, 704,
516, 258, 457, 907, 594, 723, 674, 292, 272, 96, 684, 432, 686, 606, 860, 569,
193, 219, 129, 186, 236, 287, 192, 775, 278, 173, 40, 379, 712, 463, 646, 776,
171, 491, 297, 763, 156, 732, 95, 270, 447, 90, 507, 48, 228, 821, 808, 898,
784, 663, 627, 378, 382, 262, 380, 602, 754, 336, 89, 614, 87, 432, 670, 616,
157, 374, 242, 726, 600, 269, 375, 898, 845, 454, 354, 130, 814, 587, 804, 34,
211, 330, 539, 297, 827, 865, 37, 517, 834, 315, 550, 86, 801, 4, 108, 539,
/* k = 256 */
524, 894, 75, 766, 882, 857, 74, 204, 82, 586, 708, 250, 905, 786, 138, 720,
858, 194, 311, 913, 275, 190, 375, 850, 438, 733, 194, 280, 201, 280, 828, 757,
710, 814, 919, 89, 68, 569, 11, 204, 796, 605, 540, 913, 801, 700, 799, 137,
439, 418, 592, 668, 353, 859, 370, 694, 325, 240, 216, 257, 284, 549, 209, 884,
315, 70, 329, 793, 490, 274, 877, 162, 749, 812, 684, 461, 334, 376, 849, 521,
307, 291, 803, 712, 19, 358, 399, 908, 103, 511, 51, 8, 517, 225, 289, 470,
637, 731, 66, 255, 917, 269, 463, 830, 730, 433, 848, 585, 136, 538, 906, 90,
2, 290, 743, 199, 655, 903, 329, 49, 802, 580, 355, 588, 188, 462, 10, 134,
628, 320, 479, 130, 739, 71, 263, 318, 374, 601, 192, 605, 142, 673, 687, 234,
722, 384, 177, 752, 607, 640, 455, 193, 689, 707, 805, 641, 48, 60, 732, 621,
895, 544, 261, 852, 655, 309, 697, 755, 756, 60, 231, 773, 434, 421, 726, 528,
503, 118, 49, 795, 32, 144, 500, 238, 836, 394, 280, 566, 319, 9, 647, 550,
73, 914, 342, 126, 32, 681, 331, 792, 620, 60, 609, 441, 180, 791, 893, 754,
605, 383, 228, 749, 760, 213, 54, 297, 134, 54, 834, 299, 922, 191, 910, 532,
609, 829, 189, 20, 167, 29, 872, 449, 83, 402, 41, 656, 505, 579, 481, 173,
404, 251, 688, 95, 497, 555, 642, 543, 307, 159, 924, 558, 648, 55, 497, 10,
/* k = 512 */
352, 77, 373, 504, 35, 599, 428, 207, 409, 574, 118, 498, 285, 380, 350, 492,
197, 265, 920, 155, 914, 299, 229, 643, 294, 871, 306, 88, 87, 193, 352, 781,
846, 75, 327, 520, 435, 543, 203, 666, 249, 346, 781, 621, 640, 268, 794, 534,
539, 781, 408, 390, 644, 102, 476, 499, 290, 632, 545, 37, 858, 916, 552, 41,
542, 289, 122, 272, 383, 800, 485, 98, 752, 472, 761, 107, 784, 860, 658, 741,
290, 204, 681, 407, 855, 85, 99, 62, 482, 180, 20, 297, 451, 593, 913, 142,
808, 684, 287, 536, 561, 76, 653, 899, 729, 567, 744, 390, 513, 192, 516, 258,
240, 518, 794, 395, 768, 848, 51, 610, 384, 168, 190, 826, 328, 596, 786, 303,
570, 381, 415, 641, 156, 237, 151, 429, 531, 207, 676, 710, 89, 168, 304, 402,
40, 708, 575, 162, 864, 229, 65, 861, 841, 512, 164, 477, 221, 92, 358, 785,
288, 357, 850, 836, 827, 736, 707, 94, 8, 494, 114, 521, 2, 499, 851, 543,
152, 729, 771, 95, 248, 361, 578, 323, 856, 797, 289, 51, 684, 466, 533, 820,
669, 45, 902, 452, 167, 342, 244, 173, 35, 463, 651, 51, 699, 591, 452, 578,
37, 124, 298, 332, 552, 43, 427, 119, 662, 777, 475, 850, 764, 364, 578, 911,
283, 711, 472, 420, 245, 288, 594, 394, 511, 327, 589, 777, 699, 688, 43, 408,
842, 383, 721, 521, 560, 644, 714, 559, 62, 145, 873, 663, 713, 159, 672, 729,
624, 59, 193, 417, 158, 209, 563, 564, 343, 693, 109, 608, 563, 365, 181, 772,
677, 310, 248, 353, 708, 410, 579, 870, 617, 841, 632, 860, 289, 536, 35, 777,
618, 586, 424, 833, 77, 597, 346, 269, 757, 632, 695, 751, 331, 247, 184, 45,
787, 680, 18, 66, 407, 369, 54, 492, 228, 613, 830, 922, 437, 519, 644, 905,
789, 420, 305, 441, 207, 300, 892, 827, 141, 537, 381, 662, 513, 56, 252, 341,
242, 797, 838, 837, 720, 224, 307, 631, 61, 87, 560, 310, 756, 665, 397, 808,
851, 309, 473, 795, 378, 31, 647, 915, 459, 806, 590, 731, 425, 216, 548, 249,
321, 881, 699, 535, 673, 782, 210, 815, 905, 303, 843, 922, 281, 73, 469, 791,
660, 162, 498, 308, 155, 422, 907, 817, 187, 62, 16, 425, 535, 336, 286, 437,
375, 273, 610, 296, 183, 923, 116, 667, 751, 353, 62, 366, 691, 379, 687, 842,
37, 357, 720, 742, 330, 5, 39, 923, 311, 424, 242, 749, 321, 54, 669, 316,
342, 299, 534, 105, 667, 488, 640, 672, 576, 540, 316, 486, 721, 610, 46, 656,
447, 171, 616, 464, 190, 531, 297, 321, 762, 752, 533, 175, 134, 14, 381, 433,
717, 45, 111, 20, 596, 284, 736, 138, 646, 411, 877, 669, 141, 919, 45, 780,
407, 164, 332, 899, 165, 726, 600, 325, 498, 655, 357, 752, 768, 223, 849, 647,
63, 310, 863, 251, 366, 304, 282, 738, 675, 410, 389, 244, 31, 121, 303, 263 };
static char *codagemc[2787] = { "urA", "xfs", "ypy", "unk", "xdw", "yoz", "pDA", "uls", "pBk", "eBA",
"pAs", "eAk", "prA", "uvs", "xhy", "pnk", "utw", "xgz", "fDA", "pls", "fBk", "frA", "pvs",
"uxy", "fnk", "ptw", "uwz", "fls", "psy", "fvs", "pxy", "ftw", "pwz", "fxy", "yrx", "ufk",
"xFw", "ymz", "onA", "uds", "xEy", "olk", "ucw", "dBA", "oks", "uci", "dAk", "okg", "dAc",
"ovk", "uhw", "xaz", "dnA", "ots", "ugy", "dlk", "osw", "ugj", "dks", "osi", "dvk", "oxw",
"uiz", "dts", "owy", "dsw", "owj", "dxw", "oyz", "dwy", "dwj", "ofA", "uFs", "xCy", "odk",
"uEw", "xCj", "clA", "ocs", "uEi", "ckk", "ocg", "ckc", "ckE", "cvA", "ohs", "uay", "ctk",
"ogw", "uaj", "css", "ogi", "csg", "csa", "cxs", "oiy", "cww", "oij", "cwi", "cyy", "oFk",
"uCw", "xBj", "cdA", "oEs", "uCi", "cck", "oEg", "uCb", "ccc", "oEa", "ccE", "oED", "chk",
"oaw", "uDj", "cgs", "oai", "cgg", "oab", "cga", "cgD", "obj", "cib", "cFA", "oCs", "uBi",
"cEk", "oCg", "uBb", "cEc", "oCa", "cEE", "oCD", "cEC", "cas", "cag", "caa", "cCk", "uAr",
"oBa", "oBD", "cCB", "tfk", "wpw", "yez", "mnA", "tds", "woy", "mlk", "tcw", "woj", "FBA",
"mks", "FAk", "mvk", "thw", "wqz", "FnA", "mts", "tgy", "Flk", "msw", "Fks", "Fkg", "Fvk",
"mxw", "tiz", "Fts", "mwy", "Fsw", "Fsi", "Fxw", "myz", "Fwy", "Fyz", "vfA", "xps", "yuy",
"vdk", "xow", "yuj", "qlA", "vcs", "xoi", "qkk", "vcg", "xob", "qkc", "vca", "mfA", "tFs",
"wmy", "qvA", "mdk", "tEw", "wmj", "qtk", "vgw", "xqj", "hlA", "Ekk", "mcg", "tEb", "hkk",
"qsg", "hkc", "EvA", "mhs", "tay", "hvA", "Etk", "mgw", "taj", "htk", "qww", "vij", "hss",
"Esg", "hsg", "Exs", "miy", "hxs", "Eww", "mij", "hww", "qyj", "hwi", "Eyy", "hyy", "Eyj",
"hyj", "vFk", "xmw", "ytj", "qdA", "vEs", "xmi", "qck", "vEg", "xmb", "qcc", "vEa", "qcE",
"qcC", "mFk", "tCw", "wlj", "qhk", "mEs", "tCi", "gtA", "Eck", "vai", "tCb", "gsk", "Ecc",
"mEa", "gsc", "qga", "mED", "EcC", "Ehk", "maw", "tDj", "gxk", "Egs", "mai", "gws", "qii",
"mab", "gwg", "Ega", "EgD", "Eiw", "mbj", "gyw", "Eii", "gyi", "Eib", "gyb", "gzj", "qFA",
"vCs", "xli", "qEk", "vCg", "xlb", "qEc", "vCa", "qEE", "vCD", "qEC", "qEB", "EFA", "mCs",
"tBi", "ghA", "EEk", "mCg", "tBb", "ggk", "qag", "vDb", "ggc", "EEE", "mCD", "ggE", "qaD",
"ggC", "Eas", "mDi", "gis", "Eag", "mDb", "gig", "qbb", "gia", "EaD", "giD", "gji", "gjb",
"qCk", "vBg", "xkr", "qCc", "vBa", "qCE", "vBD", "qCC", "qCB", "ECk", "mBg", "tAr", "gak",
"ECc", "mBa", "gac", "qDa", "mBD", "gaE", "ECC", "gaC", "ECB", "EDg", "gbg", "gba", "gbD",
"vAq", "vAn", "qBB", "mAq", "EBE", "gDE", "gDC", "gDB", "lfA", "sps", "wey", "ldk", "sow",
"ClA", "lcs", "soi", "Ckk", "lcg", "Ckc", "CkE", "CvA", "lhs", "sqy", "Ctk", "lgw", "sqj",
"Css", "lgi", "Csg", "Csa", "Cxs", "liy", "Cww", "lij", "Cwi", "Cyy", "Cyj", "tpk", "wuw",
"yhj", "ndA", "tos", "wui", "nck", "tog", "wub", "ncc", "toa", "ncE", "toD", "lFk", "smw",
"wdj", "nhk", "lEs", "smi", "atA", "Cck", "tqi", "smb", "ask", "ngg", "lEa", "asc", "CcE",
"asE", "Chk", "law", "snj", "axk", "Cgs", "trj", "aws", "nii", "lab", "awg", "Cga", "awa",
"Ciw", "lbj", "ayw", "Cii", "ayi", "Cib", "Cjj", "azj", "vpA", "xus", "yxi", "vok", "xug",
"yxb", "voc", "xua", "voE", "xuD", "voC", "nFA", "tms", "wti", "rhA", "nEk", "xvi", "wtb",
"rgk", "vqg", "xvb", "rgc", "nEE", "tmD", "rgE", "vqD", "nEB", "CFA", "lCs", "sli", "ahA",
"CEk", "lCg", "slb", "ixA", "agk", "nag", "tnb", "iwk", "rig", "vrb", "lCD", "iwc", "agE",
"naD", "iwE", "CEB", "Cas", "lDi", "ais", "Cag", "lDb", "iys", "aig", "nbb", "iyg", "rjb",
"CaD", "aiD", "Cbi", "aji", "Cbb", "izi", "ajb", "vmk", "xtg", "ywr", "vmc", "xta", "vmE",
"xtD", "vmC", "vmB", "nCk", "tlg", "wsr", "rak", "nCc", "xtr", "rac", "vna", "tlD", "raE",
"nCC", "raC", "nCB", "raB", "CCk", "lBg", "skr", "aak", "CCc", "lBa", "iik", "aac", "nDa",
"lBD", "iic", "rba", "CCC", "iiE", "aaC", "CCB", "aaB", "CDg", "lBr", "abg", "CDa", "ijg",
"aba", "CDD", "ija", "abD", "CDr", "ijr", "vlc", "xsq", "vlE", "xsn", "vlC", "vlB", "nBc",
"tkq", "rDc", "nBE", "tkn", "rDE", "vln", "rDC", "nBB", "rDB", "CBc", "lAq", "aDc", "CBE",
"lAn", "ibc", "aDE", "nBn", "ibE", "rDn", "CBB", "ibC", "aDB", "ibB", "aDq", "ibq", "ibn",
"xsf", "vkl", "tkf", "nAm", "nAl", "CAo", "aBo", "iDo", "CAl", "aBl", "kpk", "BdA", "kos",
"Bck", "kog", "seb", "Bcc", "koa", "BcE", "koD", "Bhk", "kqw", "sfj", "Bgs", "kqi", "Bgg",
"kqb", "Bga", "BgD", "Biw", "krj", "Bii", "Bib", "Bjj", "lpA", "sus", "whi", "lok", "sug",
"loc", "sua", "loE", "suD", "loC", "BFA", "kms", "sdi", "DhA", "BEk", "svi", "sdb", "Dgk",
"lqg", "svb", "Dgc", "BEE", "kmD", "DgE", "lqD", "BEB", "Bas", "kni", "Dis", "Bag", "knb",
"Dig", "lrb", "Dia", "BaD", "Bbi", "Dji", "Bbb", "Djb", "tuk", "wxg", "yir", "tuc", "wxa",
"tuE", "wxD", "tuC", "tuB", "lmk", "stg", "nqk", "lmc", "sta", "nqc", "tva", "stD", "nqE",
"lmC", "nqC", "lmB", "nqB", "BCk", "klg", "Dak", "BCc", "str", "bik", "Dac", "lna", "klD",
"bic", "nra", "BCC", "biE", "DaC", "BCB", "DaB", "BDg", "klr", "Dbg", "BDa", "bjg", "Dba",
"BDD", "bja", "DbD", "BDr", "Dbr", "bjr", "xxc", "yyq", "xxE", "yyn", "xxC", "xxB", "ttc",
"wwq", "vvc", "xxq", "wwn", "vvE", "xxn", "vvC", "ttB", "vvB", "llc", "ssq", "nnc", "llE",
"ssn", "rrc", "nnE", "ttn", "rrE", "vvn", "llB", "rrC", "nnB", "rrB", "BBc", "kkq", "DDc",
"BBE", "kkn", "bbc", "DDE", "lln", "jjc", "bbE", "nnn", "BBB", "jjE", "rrn", "DDB", "jjC",
"BBq", "DDq", "BBn", "bbq", "DDn", "jjq", "bbn", "jjn", "xwo", "yyf", "xwm", "xwl", "tso",
"wwf", "vto", "xwv", "vtm", "tsl", "vtl", "lko", "ssf", "nlo", "lkm", "rno", "nlm", "lkl",
"rnm", "nll", "rnl", "BAo", "kkf", "DBo", "lkv", "bDo", "DBm", "BAl", "jbo", "bDm", "DBl",
"jbm", "bDl", "jbl", "DBv", "jbv", "xwd", "vsu", "vst", "nku", "rlu", "rlt", "DAu", "bBu",
"jDu", "jDt", "ApA", "Aok", "keg", "Aoc", "AoE", "AoC", "Aqs", "Aqg", "Aqa", "AqD", "Ari",
"Arb", "kuk", "kuc", "sha", "kuE", "shD", "kuC", "kuB", "Amk", "kdg", "Bqk", "kvg", "kda",
"Bqc", "kva", "BqE", "kvD", "BqC", "AmB", "BqB", "Ang", "kdr", "Brg", "kvr", "Bra", "AnD",
"BrD", "Anr", "Brr", "sxc", "sxE", "sxC", "sxB", "ktc", "lvc", "sxq", "sgn", "lvE", "sxn",
"lvC", "ktB", "lvB", "Alc", "Bnc", "AlE", "kcn", "Drc", "BnE", "AlC", "DrE", "BnC", "AlB",
"DrC", "BnB", "Alq", "Bnq", "Aln", "Drq", "Bnn", "Drn", "wyo", "wym", "wyl", "swo", "txo",
"wyv", "txm", "swl", "txl", "kso", "sgf", "lto", "swv", "nvo", "ltm", "ksl", "nvm", "ltl",
"nvl", "Ako", "kcf", "Blo", "ksv", "Dno", "Blm", "Akl", "bro", "Dnm", "Bll", "brm", "Dnl",
"Akv", "Blv", "Dnv", "brv", "yze", "yzd", "wye", "xyu", "wyd", "xyt", "swe", "twu", "swd",
"vxu", "twt", "vxt", "kse", "lsu", "ksd", "ntu", "lst", "rvu", "ypk", "zew", "xdA", "yos",
"zei", "xck", "yog", "zeb", "xcc", "yoa", "xcE", "yoD", "xcC", "xhk", "yqw", "zfj", "utA",
"xgs", "yqi", "usk", "xgg", "yqb", "usc", "xga", "usE", "xgD", "usC", "uxk", "xiw", "yrj",
"ptA", "uws", "xii", "psk", "uwg", "xib", "psc", "uwa", "psE", "uwD", "psC", "pxk", "uyw",
"xjj", "ftA", "pws", "uyi", "fsk", "pwg", "uyb", "fsc", "pwa", "fsE", "pwD", "fxk", "pyw",
"uzj", "fws", "pyi", "fwg", "pyb", "fwa", "fyw", "pzj", "fyi", "fyb", "xFA", "yms", "zdi",
"xEk", "ymg", "zdb", "xEc", "yma", "xEE", "ymD", "xEC", "xEB", "uhA", "xas", "yni", "ugk",
"xag", "ynb", "ugc", "xaa", "ugE", "xaD", "ugC", "ugB", "oxA", "uis", "xbi", "owk", "uig",
"xbb", "owc", "uia", "owE", "uiD", "owC", "owB", "dxA", "oys", "uji", "dwk", "oyg", "ujb",
"dwc", "oya", "dwE", "oyD", "dwC", "dys", "ozi", "dyg", "ozb", "dya", "dyD", "dzi", "dzb",
"xCk", "ylg", "zcr", "xCc", "yla", "xCE", "ylD", "xCC", "xCB", "uak", "xDg", "ylr", "uac",
"xDa", "uaE", "xDD", "uaC", "uaB", "oik", "ubg", "xDr", "oic", "uba", "oiE", "ubD", "oiC",
"oiB", "cyk", "ojg", "ubr", "cyc", "oja", "cyE", "ojD", "cyC", "cyB", "czg", "ojr", "cza",
"czD", "czr", "xBc", "ykq", "xBE", "ykn", "xBC", "xBB", "uDc", "xBq", "uDE", "xBn", "uDC",
"uDB", "obc", "uDq", "obE", "uDn", "obC", "obB", "cjc", "obq", "cjE", "obn", "cjC", "cjB",
"cjq", "cjn", "xAo", "ykf", "xAm", "xAl", "uBo", "xAv", "uBm", "uBl", "oDo", "uBv", "oDm",
"oDl", "cbo", "oDv", "cbm", "cbl", "xAe", "xAd", "uAu", "uAt", "oBu", "oBt", "wpA", "yes",
"zFi", "wok", "yeg", "zFb", "woc", "yea", "woE", "yeD", "woC", "woB", "thA", "wqs", "yfi",
"tgk", "wqg", "yfb", "tgc", "wqa", "tgE", "wqD", "tgC", "tgB", "mxA", "tis", "wri", "mwk",
"tig", "wrb", "mwc", "tia", "mwE", "tiD", "mwC", "mwB", "FxA", "mys", "tji", "Fwk", "myg",
"tjb", "Fwc", "mya", "FwE", "myD", "FwC", "Fys", "mzi", "Fyg", "mzb", "Fya", "FyD", "Fzi",
"Fzb", "yuk", "zhg", "hjs", "yuc", "zha", "hbw", "yuE", "zhD", "hDy", "yuC", "yuB", "wmk",
"ydg", "zEr", "xqk", "wmc", "zhr", "xqc", "yva", "ydD", "xqE", "wmC", "xqC", "wmB", "xqB",
"tak", "wng", "ydr", "vik", "tac", "wna", "vic", "xra", "wnD", "viE", "taC", "viC", "taB",
"viB", "mik", "tbg", "wnr", "qyk", "mic", "tba", "qyc", "vja", "tbD", "qyE", "miC", "qyC",
"miB", "qyB", "Eyk", "mjg", "tbr", "hyk", "Eyc", "mja", "hyc", "qza", "mjD", "hyE", "EyC",
"hyC", "EyB", "Ezg", "mjr", "hzg", "Eza", "hza", "EzD", "hzD", "Ezr", "ytc", "zgq", "grw",
"ytE", "zgn", "gny", "ytC", "glz", "ytB", "wlc", "ycq", "xnc", "wlE", "ycn", "xnE", "ytn",
"xnC", "wlB", "xnB", "tDc", "wlq", "vbc", "tDE", "wln", "vbE", "xnn", "vbC", "tDB", "vbB",
"mbc", "tDq", "qjc", "mbE", "tDn", "qjE", "vbn", "qjC", "mbB", "qjB", "Ejc", "mbq", "gzc",
"EjE", "mbn", "gzE", "qjn", "gzC", "EjB", "gzB", "Ejq", "gzq", "Ejn", "gzn", "yso", "zgf",
"gfy", "ysm", "gdz", "ysl", "wko", "ycf", "xlo", "ysv", "xlm", "wkl", "xll", "tBo", "wkv",
"vDo", "tBm", "vDm", "tBl", "vDl", "mDo", "tBv", "qbo", "vDv", "qbm", "mDl", "qbl", "Ebo",
"mDv", "gjo", "Ebm", "gjm", "Ebl", "gjl", "Ebv", "gjv", "yse", "gFz", "ysd", "wke", "xku",
"wkd", "xkt", "tAu", "vBu", "tAt", "vBt", "mBu", "qDu", "mBt", "qDt", "EDu", "gbu", "EDt",
"gbt", "ysF", "wkF", "xkh", "tAh", "vAx", "mAx", "qBx", "wek", "yFg", "zCr", "wec", "yFa",
"weE", "yFD", "weC", "weB", "sqk", "wfg", "yFr", "sqc", "wfa", "sqE", "wfD", "sqC", "sqB",
"lik", "srg", "wfr", "lic", "sra", "liE", "srD", "liC", "liB", "Cyk", "ljg", "srr", "Cyc",
"lja", "CyE", "ljD", "CyC", "CyB", "Czg", "ljr", "Cza", "CzD", "Czr", "yhc", "zaq", "arw",
"yhE", "zan", "any", "yhC", "alz", "yhB", "wdc", "yEq", "wvc", "wdE", "yEn", "wvE", "yhn",
"wvC", "wdB", "wvB", "snc", "wdq", "trc", "snE", "wdn", "trE", "wvn", "trC", "snB", "trB",
"lbc", "snq", "njc", "lbE", "snn", "njE", "trn", "njC", "lbB", "njB", "Cjc", "lbq", "azc",
"CjE", "lbn", "azE", "njn", "azC", "CjB", "azB", "Cjq", "azq", "Cjn", "azn", "zio", "irs",
"rfy", "zim", "inw", "rdz", "zil", "ily", "ikz", "ygo", "zaf", "afy", "yxo", "ziv", "ivy",
"adz", "yxm", "ygl", "itz", "yxl", "wco", "yEf", "wto", "wcm", "xvo", "yxv", "wcl", "xvm",
"wtl", "xvl", "slo", "wcv", "tno", "slm", "vro", "tnm", "sll", "vrm", "tnl", "vrl", "lDo",
"slv", "nbo", "lDm", "rjo", "nbm", "lDl", "rjm", "nbl", "rjl", "Cbo", "lDv", "ajo", "Cbm",
"izo", "ajm", "Cbl", "izm", "ajl", "izl", "Cbv", "ajv", "zie", "ifw", "rFz", "zid", "idy",
"icz", "yge", "aFz", "ywu", "ygd", "ihz", "ywt", "wce", "wsu", "wcd", "xtu", "wst", "xtt",
"sku", "tlu", "skt", "vnu", "tlt", "vnt", "lBu", "nDu", "lBt", "rbu", "nDt", "rbt", "CDu",
"abu", "CDt", "iju", "abt", "ijt", "ziF", "iFy", "iEz", "ygF", "ywh", "wcF", "wsh", "xsx",
"skh", "tkx", "vlx", "lAx", "nBx", "rDx", "CBx", "aDx", "ibx", "iCz", "wFc", "yCq", "wFE",
"yCn", "wFC", "wFB", "sfc", "wFq", "sfE", "wFn", "sfC", "sfB", "krc", "sfq", "krE", "sfn",
"krC", "krB", "Bjc", "krq", "BjE", "krn", "BjC", "BjB", "Bjq", "Bjn", "yao", "zDf", "Dfy",
"yam", "Ddz", "yal", "wEo", "yCf", "who", "wEm", "whm", "wEl", "whl", "sdo", "wEv", "svo",
"sdm", "svm", "sdl", "svl", "kno", "sdv", "lro", "knm", "lrm", "knl", "lrl", "Bbo", "knv",
"Djo", "Bbm", "Djm", "Bbl", "Djl", "Bbv", "Djv", "zbe", "bfw", "npz", "zbd", "bdy", "bcz",
"yae", "DFz", "yiu", "yad", "bhz", "yit", "wEe", "wgu", "wEd", "wxu", "wgt", "wxt", "scu",
"stu", "sct", "tvu", "stt", "tvt", "klu", "lnu", "klt", "nru", "lnt", "nrt", "BDu", "Dbu",
"BDt", "bju", "Dbt", "bjt", "jfs", "rpy", "jdw", "roz", "jcy", "jcj", "zbF", "bFy", "zjh",
"jhy", "bEz", "jgz", "yaF", "yih", "yyx", "wEF", "wgh", "wwx", "xxx", "sch", "ssx", "ttx",
"vvx", "kkx", "llx", "nnx", "rrx", "BBx", "DDx", "bbx", "jFw", "rmz", "jEy", "jEj", "bCz",
"jaz", "jCy", "jCj", "jBj", "wCo", "wCm", "wCl", "sFo", "wCv", "sFm", "sFl", "kfo", "sFv",
"kfm", "kfl", "Aro", "kfv", "Arm", "Arl", "Arv", "yDe", "Bpz", "yDd", "wCe", "wau", "wCd",
"wat", "sEu", "shu", "sEt", "sht", "kdu", "kvu", "kdt", "kvt", "Anu", "Bru", "Ant", "Brt",
"zDp", "Dpy", "Doz", "yDF", "ybh", "wCF", "wah", "wix", "sEh", "sgx", "sxx", "kcx", "ktx",
"lvx", "Alx", "Bnx", "Drx", "bpw", "nuz", "boy", "boj", "Dmz", "bqz", "jps", "ruy", "jow",
"ruj", "joi", "job", "bmy", "jqy", "bmj", "jqj", "jmw", "rtj", "jmi", "jmb", "blj", "jnj",
"jli", "jlb", "jkr", "sCu", "sCt", "kFu", "kFt", "Afu", "Aft", "wDh", "sCh", "sax", "kEx",
"khx", "Adx", "Avx", "Buz", "Duy", "Duj", "buw", "nxj", "bui", "bub", "Dtj", "bvj", "jus",
"rxi", "jug", "rxb", "jua", "juD", "bti", "jvi", "btb", "jvb", "jtg", "rwr", "jta", "jtD",
"bsr", "jtr", "jsq", "jsn", "Bxj", "Dxi", "Dxb", "bxg", "nyr", "bxa", "bxD", "Dwr", "bxr",
"bwq", "bwn", "pjk", "urw", "ejA", "pbs", "uny", "ebk", "pDw", "ulz", "eDs", "pBy", "eBw",
"zfc", "fjk", "prw", "zfE", "fbs", "pny", "zfC", "fDw", "plz", "zfB", "fBy", "yrc", "zfq",
"frw", "yrE", "zfn", "fny", "yrC", "flz", "yrB", "xjc", "yrq", "xjE", "yrn", "xjC", "xjB",
"uzc", "xjq", "uzE", "xjn", "uzC", "uzB", "pzc", "uzq", "pzE", "uzn", "pzC", "djA", "ors",
"ufy", "dbk", "onw", "udz", "dDs", "oly", "dBw", "okz", "dAy", "zdo", "drs", "ovy", "zdm",
"dnw", "otz", "zdl", "dly", "dkz", "yno", "zdv", "dvy", "ynm", "dtz", "ynl", "xbo", "ynv",
"xbm", "xbl", "ujo", "xbv", "ujm", "ujl", "ozo", "ujv", "ozm", "ozl", "crk", "ofw", "uFz",
"cns", "ody", "clw", "ocz", "cky", "ckj", "zcu", "cvw", "ohz", "zct", "cty", "csz", "ylu",
"cxz", "ylt", "xDu", "xDt", "ubu", "ubt", "oju", "ojt", "cfs", "oFy", "cdw", "oEz", "ccy",
"ccj", "zch", "chy", "cgz", "ykx", "xBx", "uDx", "cFw", "oCz", "cEy", "cEj", "caz", "cCy",
"cCj", "FjA", "mrs", "tfy", "Fbk", "mnw", "tdz", "FDs", "mly", "FBw", "mkz", "FAy", "zFo",
"Frs", "mvy", "zFm", "Fnw", "mtz", "zFl", "Fly", "Fkz", "yfo", "zFv", "Fvy", "yfm", "Ftz",
"yfl", "wro", "yfv", "wrm", "wrl", "tjo", "wrv", "tjm", "tjl", "mzo", "tjv", "mzm", "mzl",
"qrk", "vfw", "xpz", "hbA", "qns", "vdy", "hDk", "qlw", "vcz", "hBs", "qky", "hAw", "qkj",
"hAi", "Erk", "mfw", "tFz", "hrk", "Ens", "mdy", "hns", "qty", "mcz", "hlw", "Eky", "hky",
"Ekj", "hkj", "zEu", "Evw", "mhz", "zhu", "zEt", "hvw", "Ety", "zht", "hty", "Esz", "hsz",
"ydu", "Exz", "yvu", "ydt", "hxz", "yvt", "wnu", "xru", "wnt", "xrt", "tbu", "vju", "tbt",
"vjt", "mju", "mjt", "grA", "qfs", "vFy", "gnk", "qdw", "vEz", "gls", "qcy", "gkw", "qcj",
"gki", "gkb", "Efs", "mFy", "gvs", "Edw", "mEz", "gtw", "qgz", "gsy", "Ecj", "gsj", "zEh",
"Ehy", "zgx", "gxy", "Egz", "gwz", "ycx", "ytx", "wlx", "xnx", "tDx", "vbx", "mbx", "gfk",
"qFw", "vCz", "gds", "qEy", "gcw", "qEj", "gci", "gcb", "EFw", "mCz", "ghw", "EEy", "ggy",
"EEj", "ggj", "Eaz", "giz", "gFs", "qCy", "gEw", "qCj", "gEi", "gEb", "ECy", "gay", "ECj",
"gaj", "gCw", "qBj", "gCi", "gCb", "EBj", "gDj", "gBi", "gBb", "Crk", "lfw", "spz", "Cns",
"ldy", "Clw", "lcz", "Cky", "Ckj", "zCu", "Cvw", "lhz", "zCt", "Cty", "Csz", "yFu", "Cxz",
"yFt", "wfu", "wft", "sru", "srt", "lju", "ljt", "arA", "nfs", "tpy", "ank", "ndw", "toz",
"als", "ncy", "akw", "ncj", "aki", "akb", "Cfs", "lFy", "avs", "Cdw", "lEz", "atw", "ngz",
"asy", "Ccj", "asj", "zCh", "Chy", "zax", "axy", "Cgz", "awz", "yEx", "yhx", "wdx", "wvx",
"snx", "trx", "lbx", "rfk", "vpw", "xuz", "inA", "rds", "voy", "ilk", "rcw", "voj", "iks",
"rci", "ikg", "rcb", "ika", "afk", "nFw", "tmz", "ivk", "ads", "nEy", "its", "rgy", "nEj",
"isw", "aci", "isi", "acb", "isb", "CFw", "lCz", "ahw", "CEy", "ixw", "agy", "CEj", "iwy",
"agj", "iwj", "Caz", "aiz", "iyz", "ifA", "rFs", "vmy", "idk", "rEw", "vmj", "ics", "rEi",
"icg", "rEb", "ica", "icD", "aFs", "nCy", "ihs", "aEw", "nCj", "igw", "raj", "igi", "aEb",
"igb", "CCy", "aay", "CCj", "iiy", "aaj", "iij", "iFk", "rCw", "vlj", "iEs", "rCi", "iEg",
"rCb", "iEa", "iED", "aCw", "nBj", "iaw", "aCi", "iai", "aCb", "iab", "CBj", "aDj", "ibj",
"iCs", "rBi", "iCg", "rBb", "iCa", "iCD", "aBi", "iDi", "aBb", "iDb", "iBg", "rAr", "iBa",
"iBD", "aAr", "iBr", "iAq", "iAn", "Bfs", "kpy", "Bdw", "koz", "Bcy", "Bcj", "Bhy", "Bgz",
"yCx", "wFx", "sfx", "krx", "Dfk", "lpw", "suz", "Dds", "loy", "Dcw", "loj", "Dci", "Dcb",
"BFw", "kmz", "Dhw", "BEy", "Dgy", "BEj", "Dgj", "Baz", "Diz", "bfA", "nps", "tuy", "bdk",
"now", "tuj", "bcs", "noi", "bcg", "nob", "bca", "bcD", "DFs", "lmy", "bhs", "DEw", "lmj",
"bgw", "DEi", "bgi", "DEb", "bgb", "BCy", "Day", "BCj", "biy", "Daj", "bij", "rpk", "vuw",
"xxj", "jdA", "ros", "vui", "jck", "rog", "vub", "jcc", "roa", "jcE", "roD", "jcC", "bFk",
"nmw", "ttj", "jhk", "bEs", "nmi", "jgs", "rqi", "nmb", "jgg", "bEa", "jga", "bED", "jgD",
"DCw", "llj", "baw", "DCi", "jiw", "bai", "DCb", "jii", "bab", "jib", "BBj", "DDj", "bbj",
"jjj", "jFA", "rms", "vti", "jEk", "rmg", "vtb", "jEc", "rma", "jEE", "rmD", "jEC", "jEB",
"bCs", "nli", "jas", "bCg", "nlb", "jag", "rnb", "jaa", "bCD", "jaD", "DBi", "bDi", "DBb",
"jbi", "bDb", "jbb", "jCk", "rlg", "vsr", "jCc", "rla", "jCE", "rlD", "jCC", "jCB", "bBg",
"nkr", "jDg", "bBa", "jDa", "bBD", "jDD", "DAr", "bBr", "jDr", "jBc", "rkq", "jBE", "rkn",
"jBC", "jBB", "bAq", "jBq", "bAn", "jBn", "jAo", "rkf", "jAm", "jAl", "bAf", "jAv", "Apw",
"kez", "Aoy", "Aoj", "Aqz", "Bps", "kuy", "Bow", "kuj", "Boi", "Bob", "Amy", "Bqy", "Amj",
"Bqj", "Dpk", "luw", "sxj", "Dos", "lui", "Dog", "lub", "Doa", "DoD", "Bmw", "ktj", "Dqw",
"Bmi", "Dqi", "Bmb", "Dqb", "Alj", "Bnj", "Drj", "bpA", "nus", "txi", "bok", "nug", "txb",
"boc", "nua", "boE", "nuD", "boC", "boB", "Dms", "lti", "bqs", "Dmg", "ltb", "bqg", "nvb",
"bqa", "DmD", "bqD", "Bli", "Dni", "Blb", "bri", "Dnb", "brb", "ruk", "vxg", "xyr", "ruc",
"vxa", "ruE", "vxD", "ruC", "ruB", "bmk", "ntg", "twr", "jqk", "bmc", "nta", "jqc", "rva",
"ntD", "jqE", "bmC", "jqC", "bmB", "jqB", "Dlg", "lsr", "bng", "Dla", "jrg", "bna", "DlD",
"jra", "bnD", "jrD", "Bkr", "Dlr", "bnr", "jrr", "rtc", "vwq", "rtE", "vwn", "rtC", "rtB",
"blc", "nsq", "jnc", "blE", "nsn", "jnE", "rtn", "jnC", "blB", "jnB", "Dkq", "blq", "Dkn",
"jnq", "bln", "jnn", "rso", "vwf", "rsm", "rsl", "bko", "nsf", "jlo", "bkm", "jlm", "bkl",
"jll", "Dkf", "bkv", "jlv", "rse", "rsd", "bke", "jku", "bkd", "jkt", "Aey", "Aej", "Auw",
"khj", "Aui", "Aub", "Adj", "Avj", "Bus", "kxi", "Bug", "kxb", "Bua", "BuD", "Ati", "Bvi",
"Atb", "Bvb", "Duk", "lxg", "syr", "Duc", "lxa", "DuE", "lxD", "DuC", "DuB", "Btg", "kwr",
"Dvg", "lxr", "Dva", "BtD", "DvD", "Asr", "Btr", "Dvr", "nxc", "tyq", "nxE", "tyn", "nxC",
"nxB", "Dtc", "lwq", "bvc", "nxq", "lwn", "bvE", "DtC", "bvC", "DtB", "bvB", "Bsq", "Dtq",
"Bsn", "bvq", "Dtn", "bvn", "vyo", "xzf", "vym", "vyl", "nwo", "tyf", "rxo", "nwm", "rxm",
"nwl", "rxl", "Dso", "lwf", "bto", "Dsm", "jvo", "btm", "Dsl", "jvm", "btl", "jvl", "Bsf",
"Dsv", "btv", "jvv", "vye", "vyd", "nwe", "rwu", "nwd", "rwt", "Dse", "bsu", "Dsd", "jtu",
"bst", "jtt", "vyF", "nwF", "rwh", "DsF", "bsh", "jsx", "Ahi", "Ahb", "Axg", "kir", "Axa",
"AxD", "Agr", "Axr", "Bxc", "kyq", "BxE", "kyn", "BxC", "BxB", "Awq", "Bxq", "Awn", "Bxn",
"lyo", "szf", "lym", "lyl", "Bwo", "kyf", "Dxo", "lyv", "Dxm", "Bwl", "Dxl", "Awf", "Bwv",
"Dxv", "tze", "tzd", "lye", "nyu", "lyd", "nyt", "Bwe", "Dwu", "Bwd", "bxu", "Dwt", "bxt",
"tzF", "lyF", "nyh", "BwF", "Dwh", "bwx", "Aiq", "Ain", "Ayo", "kjf", "Aym", "Ayl", "Aif",
"Ayv", "kze", "kzd", "Aye", "Byu", "Ayd", "Byt", "szp" };
/* converts values into bar patterns - replacing Grand Zebu's true type font */
static char *PDFttf[35] = { "00000", "00001", "00010", "00011", "00100", "00101", "00110", "00111",
"01000", "01001", "01010", "01011", "01100", "01101", "01110", "01111", "10000", "10001",
"10010", "10011", "10100", "10101", "10110", "10111", "11000", "11001", "11010",
"11011", "11100", "11101", "11110", "11111", "01", "1111111101010100", "11111101000101001"};
/* MicroPDF417 coefficients from ISO/IEC 24728:2006 Annex F */
static int Microcoeffs[344] = {
/* k = 7 */
76, 925, 537, 597, 784, 691, 437,
/* k = 8 */
237, 308, 436, 284, 646, 653, 428, 379,
/* k = 9 */
567, 527, 622, 257, 289, 362, 501, 441, 205,
/* k = 10 */
377, 457, 64, 244, 826, 841, 818, 691, 266, 612,
/* k = 11 */
462, 45, 565, 708, 825, 213, 15, 68, 327, 602, 904,
/* k = 12 */
597, 864, 757, 201, 646, 684, 347, 127, 388, 7, 69, 851,
/* k = 13 */
764, 713, 342, 384, 606, 583, 322, 592, 678, 204, 184, 394, 692,
/* k = 14 */
669, 677, 154, 187, 241, 286, 274, 354, 478, 915, 691, 833, 105, 215,
/* k = 15 */
460, 829, 476, 109, 904, 664, 230, 5, 80, 74, 550, 575, 147, 868, 642,
/* k = 16 */
274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428, 295, 42, 176, 65,
/* k = 18 */
279, 577, 315, 624, 37, 855, 275, 739, 120, 297, 312, 202, 560, 321, 233, 756,
760, 573,
/* k = 21 */
108, 519, 781, 534, 129, 425, 681, 553, 422, 716, 763, 693, 624, 610, 310, 691,
347, 165, 193, 259, 568,
/* k = 26 */
443, 284, 887, 544, 788, 93, 477, 760, 331, 608, 269, 121, 159, 830, 446, 893,
699, 245, 441, 454, 325, 858, 131, 847, 764, 169,
/* k = 32 */
361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742, 687, 284, 193, 517,
273, 494, 263, 147, 593, 800, 571, 320, 803, 133, 231, 390, 685, 330, 63, 410,
/* k = 38 */
234, 228, 438, 848, 133, 703, 529, 721, 788, 322, 280, 159, 738, 586, 388, 684,
445, 680, 245, 595, 614, 233, 812, 32, 284, 658, 745, 229, 95, 689, 920, 771,
554, 289, 231, 125, 117, 518,
/* k = 44 */
476, 36, 659, 848, 678, 64, 764, 840, 157, 915, 470, 876, 109, 25, 632, 405,
417, 436, 714, 60, 376, 97, 413, 706, 446, 21, 3, 773, 569, 267, 272, 213,
31, 560, 231, 758, 103, 271, 572, 436, 339, 730, 82, 285,
/* k = 50 */
923, 797, 576, 875, 156, 706, 63, 81, 257, 874, 411, 416, 778, 50, 205, 303,
188, 535, 909, 155, 637, 230, 534, 96, 575, 102, 264, 233, 919, 593, 865, 26,
579, 623, 766, 146, 10, 739, 246, 127, 71, 244, 211, 477, 920, 876, 427, 820,
718, 435 };
/* rows, columns, error codewords, k-offset of valid MicroPDF417 sizes from ISO/IEC 24728:2006 */
static int MicroVariants[170] =
{ 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
11, 14, 17, 20, 24, 28, 8, 11, 14, 17, 20, 23, 26, 6, 8, 10, 12, 15, 20, 26, 32, 38, 44, 4, 6, 8, 10, 12, 15, 20, 26, 32, 38, 44,
7, 7, 7, 8, 8, 8, 8, 9, 9, 10, 11, 13, 15, 12, 14, 16, 18, 21, 26, 32, 38, 44, 50, 8, 12, 14, 16, 18, 21, 26, 32, 38, 44, 50,
0, 0, 0, 7, 7, 7, 7, 15, 15, 24, 34, 57, 84, 45, 70, 99, 115, 133, 154, 180, 212, 250, 294, 7, 45, 70, 99, 115, 133, 154, 180, 212, 250, 294 };
/* rows, columns, error codewords, k-offset */
/* Automatic sizing table */
static int MicroAutosize[56] =
{ 4, 6, 7, 8, 10, 12, 13, 14, 16, 18, 19, 20, 24, 29, 30, 33, 34, 37, 39, 46, 54, 58, 70, 72, 82, 90, 108, 126,
1, 14, 2, 7, 3, 25, 8, 16, 5, 17, 9, 6, 10, 11, 28, 12, 19, 13, 29, 20, 30, 21, 22, 31, 23, 32, 33, 34
};
/* following is Left RAP, Centre RAP, Right RAP and Start Cluster from ISO/IEC 24728:2006 tables 10, 11 and 12 */
static int RAPTable[136] =
{ 1, 8, 36, 19, 9, 25, 1, 1, 8, 36, 19, 9, 27, 1, 7, 15, 25, 37, 1, 1, 21, 15, 1, 47, 1, 7, 15, 25, 37, 1, 1, 21, 15, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7, 15, 25, 37, 17, 9, 29, 31, 25, 19, 1, 7, 15, 25, 37, 17, 9, 29, 31, 25,
9, 8, 36, 19, 17, 33, 1, 9, 8, 36, 19, 17, 35, 1, 7, 15, 25, 37, 33, 17, 37, 47, 49, 43, 1, 7, 15, 25, 37, 33, 17, 37, 47, 49,
0, 3, 6, 0, 6, 0, 0, 0, 3, 6, 0, 6, 6, 0, 0, 6, 0, 0, 0, 0, 6, 6, 0, 3, 0, 0, 6, 0, 0, 0, 0, 6, 6, 0 };
/* Left and Right Row Address Pattern from Table 2 */
static char *RAPLR[53] = {"", "221311", "311311", "312211", "222211", "213211", "214111", "223111",
"313111", "322111", "412111", "421111", "331111", "241111", "232111", "231211", "321211",
"411211", "411121", "411112", "321112", "312112", "311212", "311221", "311131", "311122",
"311113", "221113", "221122", "221131", "221221", "222121", "312121", "321121", "231121",
"231112", "222112", "213112", "212212", "212221", "212131", "212122", "212113", "211213",
"211123", "211132", "211141", "211231", "211222", "211312", "211321", "211411", "212311" };
/* Centre Row Address Pattern from Table 2 */
static char *RAPC[53] = {"", "112231", "121231", "122131", "131131", "131221", "132121", "141121",
"141211", "142111", "133111", "132211", "131311", "122311", "123211", "124111", "115111",
"114211", "114121", "123121", "123112", "122212", "122221", "121321", "121411", "112411",
"113311", "113221", "113212", "113122", "122122", "131122", "131113", "122113", "113113",
"112213", "112222", "112312", "112321", "111421", "111331", "111322", "111232", "111223",
"111133", "111124", "111214", "112114", "121114", "121123", "121132", "112132", "112141" };

583
backend/plessey.c Normal file
View File

@ -0,0 +1,583 @@
/* plessey.c - Handles Plessey and MSI Plessey */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"
#define SSET "0123456789ABCDEF"
static char *PlessTable[16] = {"13131313", "31131313", "13311313", "31311313", "13133113", "31133113",
"13313113", "31313113", "13131331", "31131331", "13311331", "31311331", "13133131",
"31133131", "13313131", "31313131"};
static char *MSITable[10] = {"12121212", "12121221", "12122112", "12122121", "12211212", "12211221",
"12212112", "12212121", "21121212", "21121221"};
int plessey(struct zint_symbol *symbol, unsigned char source[])
{ /* Not MSI/Plessey but the older Plessey standard */
unsigned int i, check;
unsigned char *checkptr;
static char grid[9] = {1,1,1,1,0,1,0,0,1};
char dest[1000];
int errno;
errno = 0;
strcpy(dest, "");
if(strlen(source) > 65) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(SSET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
checkptr = calloc (1, strlen(source) * 4 + 8);
/* Start character */
concat(dest, "31311331");
/* Data area */
for(i = 0; i <= strlen(source); i++)
{
check = posn(SSET, source[i]);
lookup(SSET, PlessTable, source[i], dest);
checkptr[4*i] = check & 1;
checkptr[4*i+1] = (check >> 1) & 1;
checkptr[4*i+2] = (check >> 2) & 1;
checkptr[4*i+3] = (check >> 3) & 1;
}
/* CRC check digit code adapted from code by Leonid A. Broukhis
used in GNU Barcode */
for (i=0; i < 4*strlen(source); i++) {
int j;
if (checkptr[i])
for (j = 0; j < 9; j++)
checkptr[i+j] ^= grid[j];
}
for (i = 0; i < 8; i++) {
switch(checkptr[strlen(source) * 4 + i])
{
case 0: concat(dest, "13"); break;
case 1: concat(dest, "31"); break;
}
}
/* Stop character */
concat(dest, "331311313");
expand(symbol, dest);
strcpy(symbol->text, source);
return errno;
}
int msi_plessey(struct zint_symbol *symbol, unsigned char source[])
{ /* Plain MSI Plessey - does not calculate any check character */
unsigned int i;
int errno;
char dest[1000];
errno = 0;
strcpy(dest, "");
if(strlen(source) > 55) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(NESET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
/* start character */
concat (dest, "21");
for(i = 0; i <= strlen(source); i++)
{
lookup(NESET, MSITable, source[i], dest);
}
/* Stop character */
concat (dest, "121");
expand(symbol, dest);
strcpy(symbol->text, source);
return errno;
}
int msi_plessey_mod10(struct zint_symbol *symbol, unsigned char source[])
{ /* MSI Plessey with Modulo 10 check digit - algorithm from Barcode Island
http://www.barcodeisland.com/ */
unsigned int i, wright, dau, pedwar, pump;
char un[200], tri[200];
int errno, h;
char dest[1000];
errno = 0;
strcpy(dest, "");
if(strlen(source) > 55) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(NESET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
/* start character */
concat (dest, "21");
/* draw data section */
for(i = 0; i < strlen(source); i++)
{
lookup(NESET, MSITable, source[i], dest);
}
/* caluculate check digit */
wright = 0;
if((strlen(source)%2) == 0)
{
for(i = 1; i < strlen(source); i+=2)
{
un[wright] = source[i];
wright ++;
}
}
else
{
for(i = 0; i < strlen(source); i+=2)
{
un[wright] = source[i];
wright ++;
}
}
un[wright] = '\0';
dau = atoi(un);
dau *= 2;
sprintf(tri,"%d",dau);
pedwar = 0;
for(i = 0; i < strlen(tri); i++)
{
pedwar += ctoi(tri[i]);
}
if((strlen(source)%2) == 0)
{
for(i = 0; i < strlen(source); i+=2)
{
pedwar += ctoi(source[i]);
}
}
else
{
for(i = 1; i < strlen(source); i+=2)
{
pedwar += ctoi(source[i]);
}
}
pump = (10 - pedwar%10);
if(pump == 10)
{
pump = 0;
}
/* draw check digit */
lookup(NESET, MSITable, itoc(pump), dest);
/* Stop character */
concat (dest, "121");
h = strlen(source);
source[h] = itoc(pump);
source[h + 1] = '\0';
expand(symbol, dest);
strcpy(symbol->text, source);
return errno;
}
int msi_plessey_mod1010(struct zint_symbol *symbol, unsigned char source[])
{ /* MSI Plessey with two Modulo 10 check digits - algorithm from
Barcode Island http://www.barcodeisland.com/ */
unsigned int i, wright, dau, pedwar, pump, chwech;
char un[200], tri[200];
int errno, h;
char dest[1000];
errno = 0;
strcpy(dest, "");
if(strlen(source) > 55) { /* No Entry Stack Smashers! */
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(NESET, source);
if (errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
/* start character */
concat (dest, "21");
/* draw data section */
for(i = 0; i < strlen(source); i++)
{
lookup(NESET, MSITable, source[i], dest);
}
/* calculate first check digit */
wright = 0;
if((strlen(source)%2) == 0)
{
for(i = 1; i < strlen(source); i+=2)
{
un[wright] = source[i];
wright ++;
}
}
else
{
for(i = 0; i < strlen(source); i+=2)
{
un[wright] = source[i];
wright ++;
}
}
un[wright] = '\0';
dau = atoi(un);
dau *= 2;
sprintf(tri,"%d",dau);
pedwar = 0;
for(i = 0; i < strlen(tri); i++)
{
pedwar += ctoi(tri[i]);
}
if((strlen(source)%2) == 0)
{
for(i = 0; i < strlen(source); i+=2)
{
pedwar += ctoi(source[i]);
}
}
else
{
for(i = 1; i < strlen(source); i+=2)
{
pedwar += ctoi(source[i]);
}
}
pump = (10 - pedwar%10);
if(pump == 10)
{
pump = 0;
}
/* calculate second check digit */
wright = 0;
if((strlen(source)%2) == 0)
{
for(i = 0; i < strlen(source); i+=2)
{
un[wright] = source[i];
wright ++;
}
}
else
{
for(i = 1; i < strlen(source); i+=2)
{
un[wright] = source[i];
wright ++;
}
}
un[wright] = itoc(pump);
wright++;
un[wright] = '\0';
dau = atoi(un);
dau *= 2;
sprintf(tri,"%d",dau);
pedwar = 0;
for(i = 0; i < strlen(tri); i++)
{
pedwar += ctoi(tri[i]);
}
if((strlen(source)%2) == 0)
{
for(i = 1; i < strlen(source); i+=2)
{
pedwar += ctoi(source[i]);
}
}
else
{
for(i = 0; i < strlen(source); i+=2)
{
pedwar += ctoi(source[i]);
}
}
chwech = (10 - pedwar%10);
if(chwech == 10)
{
chwech = 0;
}
/* Draw check digits */
lookup(NESET, MSITable, itoc(pump), dest);
lookup(NESET, MSITable, itoc(chwech), dest);
/* Stop character */
concat (dest, "121");
h = strlen(source);
source[h] = itoc(pump);
source[h + 1] = itoc(chwech);
source[h + 2] = '\0';
expand(symbol, dest);
strcpy(symbol->text, source);
return errno;
}
int msi_plessey_mod11(struct zint_symbol *symbol, unsigned char source[])
{
/* Calculate a Modulo 11 check digit using the system discussed on Wikipedia -
see http://en.wikipedia.org/wiki/Talk:MSI_Barcode */
/* uses the IBM weight system */
int i, weight, x, check, h;
int errno;
char dest[1000];
errno = 0;
strcpy(dest, "");
if(strlen(source) > 55) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(NESET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
/* start character */
concat (dest, "21");
/* draw data section */
for(i = 0; i < strlen(source); i++)
{
lookup(NESET, MSITable, source[i], dest);
}
/* calculate check digit */
x = 0;
weight = 2;
for(i = (strlen(source) - 1); i >= 0; i--) {
x += weight * ctoi(source[i]);
weight++;
if(weight > 7) {
weight = 2;
}
}
check = (11 - (x % 11)) % 11;
if(check == 10) {
lookup(NESET, MSITable, '1', dest);
lookup(NESET, MSITable, '0', dest);
} else {
lookup(NESET, MSITable, itoc(check), dest);
}
h = strlen(source);
if(check == 10) {
source[h] = '1';
source[h + 1] = '0';
source[h + 2] = '\0';
} else {
source[h] = itoc(check);
source[h + 1] = '\0';
}
/* stop character */
concat (dest, "121");
expand(symbol, dest);
strcpy(symbol->text, source);
return errno;
}
int msi_plessey_mod1110(struct zint_symbol *symbol, unsigned char source[])
{
/* Combining the Barcode Island and Wikipedia code */
/* Verified against http://www.bokai.com/BarcodeJSP/applet/BarcodeSampleApplet.htm */
/* Weighted using the IBM system */
int i, weight, x, check, wright, dau, pedwar, pump, h;
char un[200], tri[200];
int errno;
char dest[1000];
errno = 0;
strcpy(dest, "");
if(strlen(source) > 55) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(NESET, source);
if (errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
/* start character */
concat (dest, "21");
/* draw data section */
for(i = 0; i < strlen(source); i++)
{
lookup(NESET, MSITable, source[i], dest);
}
/* calculate first (mod 11) digit */
wright = strlen(source);
x = 0;
weight = 2;
for(i = (strlen(source) - 1); i >= 0; i--) {
x += weight * ctoi(source[i]);
weight++;
if(weight > 7) {
weight = 2;
}
}
check = (11 - (x % 11)) % 11;
if(check == 10) {
lookup(NESET, MSITable, '1', dest);
lookup(NESET, MSITable, '0', dest);
source[wright] = '1';
source[wright + 1] = '0';
source[wright + 2] = '\0';
} else {
lookup(NESET, MSITable, itoc(check), dest);
source[wright] = itoc(check);
source[wright + 1] = '\0';
}
/* caluculate second (mod 10) check digit */
wright = 0;
if((strlen(source)%2) == 0)
{
for(i = 1; i < strlen(source); i+=2)
{
un[wright] = source[i];
wright ++;
}
}
else
{
for(i = 0; i < strlen(source); i+=2)
{
un[wright] = source[i];
wright ++;
}
}
un[wright] = '\0';
dau = atoi(un);
dau *= 2;
sprintf(tri,"%d",dau);
pedwar = 0;
for(i = 0; i < strlen(tri); i++)
{
pedwar += ctoi(tri[i]);
}
if((strlen(source)%2) == 0)
{
for(i = 0; i < strlen(source); i+=2)
{
pedwar += ctoi(source[i]);
}
}
else
{
for(i = 1; i < strlen(source); i+=2)
{
pedwar += ctoi(source[i]);
}
}
pump = (10 - pedwar%10);
if(pump == 10)
{
pump = 0;
}
/* draw check digit */
lookup(NESET, MSITable, itoc(pump), dest);
/* stop character */
concat (dest, "121");
h = strlen(source);
source[h] = itoc(pump);
source[h + 1] = '\0';
expand(symbol, dest);
strcpy(symbol->text, source);
return errno;
}

556
backend/png.c Normal file
View File

@ -0,0 +1,556 @@
/* png.c - Handles output to PNG file */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/* Any resemblance to the code used by Greg Reolofs' wpng code examples is not
coincidental. Rather odd use of mainprog_info in this file is due to gradual adaption
from that code. Read his excellent book "PNG: The Definitive Guide" online at
http://www.libpng.org/pub/png/book/ */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "png.h" /* libpng header; includes zlib.h and setjmp.h */
#include "common.h"
#include "maxipng.h" /* Maxicode shapes */
#define SSET "0123456789ABCDEF"
struct mainprog_info_type {
long width;
long height;
FILE *outfile;
jmp_buf jmpbuf;
};
static void writepng_error_handler(png_structp png_ptr, png_const_charp msg)
{
struct mainprog_info_type *graphic;
fprintf(stderr, "writepng libpng error: %s\n", msg);
fflush(stderr);
graphic = png_get_error_ptr(png_ptr);
if (graphic == NULL) { /* we are completely hosed now */
fprintf(stderr,
"writepng severe error: jmpbuf not recoverable; terminating.\n");
fflush(stderr);
exit(99);
}
longjmp(graphic->jmpbuf, 1);
}
int png_plot(struct zint_symbol *symbol)
{
struct mainprog_info_type wpng_info;
struct mainprog_info_type *graphic;
unsigned char outdata[6000];
png_structp png_ptr;
png_infop info_ptr;
graphic = &wpng_info;
long j;
unsigned long rowbytes;
unsigned char *image_data;
int i, k, offset, row, row_binding, errno;
int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
float large_bar_height, preset_height;
int large_bar_count;
/* sort out colour options */
to_upper(symbol->fgcolour);
to_upper(symbol->bgcolour);
if(strlen(symbol->fgcolour) != 6) {
strcpy(symbol->errtxt, "error: malformed foreground colour target");
return ERROR_INVALID_OPTION;
}
if(strlen(symbol->bgcolour) != 6) {
strcpy(symbol->errtxt, "error: malformed background colour target");
return ERROR_INVALID_OPTION;
}
errno = is_sane(SSET, symbol->fgcolour);
if (errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: malformed foreground colour target");
return ERROR_INVALID_OPTION;
}
errno = is_sane(SSET, symbol->bgcolour);
if (errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: malformed background colour target");
return ERROR_INVALID_OPTION;
}
fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]);
fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]);
fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]);
bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]);
bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]);
bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]);
/* x-dimension is equivalent to 2 pixels so multiply everything by 2 */
/* calculate graphic width and height */
graphic->width = 2 * (symbol->width + (symbol->border_width * 2) + (symbol->whitespace_width * 2));
row_binding = 0;
if (symbol->height == 0) {
symbol->height = 50;
}
large_bar_count = 0;
preset_height = 0.0;
for(i = 0; i < symbol->rows; i++) {
preset_height += symbol->row_height[i];
if(symbol->row_height[i] == 0) {
large_bar_count++;
}
}
large_bar_height = (symbol->height - preset_height) / large_bar_count;
if (large_bar_count == 0) {
symbol->height = preset_height;
}
graphic->height = (2 * symbol->height) + (symbol->border_width * 4);
if((symbol->rows > 1) && ((symbol->output_options == BARCODE_BIND) || (symbol->output_options == BARCODE_BOX))) {
row_binding = 1;
}
if(symbol->symbology == BARCODE_CODE16K) {
row_binding = 1;
}
/* Open output file in binary mode */
if (!(graphic->outfile = fopen(symbol->outfile, "wb"))) {
strcpy(symbol->errtxt, "error: can't open output file");
return ERROR_FILE_ACCESS;
}
/* Set up error handling routine as proc() above */
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, graphic,
writepng_error_handler, NULL);
if (!png_ptr) {
strcpy(symbol->errtxt, "error: out of memory");
return ERROR_MEMORY;
}
info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr) {
png_destroy_write_struct(&png_ptr, NULL);
strcpy(symbol->errtxt, "error: out of memory");
return ERROR_MEMORY;
}
/* catch jumping here */
if (setjmp(graphic->jmpbuf)) {
png_destroy_write_struct(&png_ptr, &info_ptr);
strcpy(symbol->errtxt, "error: libpng error occurred");
return ERROR_MEMORY;
}
/* open output file with libpng */
png_init_io(png_ptr, graphic->outfile);
/* set compression */
png_set_compression_level(png_ptr, Z_BEST_COMPRESSION);
/* set Header block */
png_set_IHDR(png_ptr, info_ptr, graphic->width, graphic->height,
8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
/* write all chunks up to (but not including) first IDAT */
png_write_info(png_ptr, info_ptr);
/* set up the transformations: for now, just pack low-bit-depth pixels
into bytes (one, two or four pixels per byte) */
png_set_packing(png_ptr);
/* set rowbytes - depends on picture depth */
rowbytes = wpng_info.width * 3;
/* Pixel Plotting */
offset = (2 * symbol->border_width) + (2 * symbol->whitespace_width);
for (j = 0; j < graphic->height; j++) {
/* top border */
if (j < (2 * symbol->border_width)) {
if ((symbol->output_options == BARCODE_BOX) || (symbol->output_options == BARCODE_BIND)) {
for(i = 0; i < (graphic->width * 3); i+=3) {
outdata[i] = fgred;
outdata[i + 1] = fggrn;
outdata[i + 2] = fgblu;
}
} else {
for(i = 0; i < (graphic->width * 3); i+=3) {
outdata[i] = bgred;
outdata[i + 1] = bggrn;
outdata[i + 2] = bgblu;
}
}
}
/* middle section */
if ((j >= (2 * symbol->border_width)) && (j < (graphic->height - (2 * symbol->border_width)))) {
for(i = 0; i < (graphic->width * 3); i+= 3) {
k = (i / 3);
/* left hand border */
if(k < (2 * symbol->border_width)) {
if(symbol->output_options == BARCODE_BOX) {
outdata[i] = fgred;
outdata[i + 1] = fggrn;
outdata[i + 2] = fgblu;
} else {
outdata[i] = bgred;
outdata[i + 1] = bggrn;
outdata[i + 2] = bgblu;
}
}
/* left whitespace */
if((k >= (2 * symbol->border_width)) && (k < ((2 * symbol->border_width) + (2 * symbol->whitespace_width)))) {
outdata[i] = bgred;
outdata[i + 1] = bggrn;
outdata[i + 2] = bgblu;
}
/* the symbol area */
if((k >= ((2 * symbol->border_width) + (2 * symbol->whitespace_width))) && (k < (graphic->width - ((2 * symbol->border_width) + (2 * symbol->whitespace_width))))) {
float y_position, cumul;
y_position = ((j / 2) - symbol->border_width);
y_position += 1.0;
row = 0;
if(symbol->row_height[row] == 0) {
cumul = large_bar_height;
} else {
cumul = symbol->row_height[row];
}
while(cumul < y_position) {
row++;
if(symbol->row_height[row] == 0) {
cumul += large_bar_height;
} else {
cumul += symbol->row_height[row];
}
}
switch(symbol->encoded_data[row][(k - offset) / 2])
{
case '1':
outdata[i] = fgred;
outdata[i + 1] = fggrn;
outdata[i + 2] = fgblu;
break;
/* NOTE: Other preset colours will go here */
case 'R':
outdata[i] = 0xff;
outdata[i + 1] = 0x00;
outdata[i + 2] = 0x00;
break;
case 'G':
outdata[i] = 0x00;
outdata[i + 1] = 0xff;
outdata[i + 2] = 0x00;
break;
case 'B':
outdata[i] = 0x00;
outdata[i + 1] = 0x00;
outdata[i + 2] = 0xff;
break;
case 'C':
outdata[i] = 0x00;
outdata[i + 1] = 0xff;
outdata[i + 2] = 0xff;
break;
case 'M':
outdata[i] = 0xff;
outdata[i + 1] = 0x00;
outdata[i + 2] = 0xff;
break;
case 'Y':
outdata[i] = 0xff;
outdata[i + 1] = 0xff;
outdata[i + 2] = 0x00;
break;
default:
outdata[i] = bgred;
outdata[i + 1] = bggrn;
outdata[i + 2] = bgblu;
break;
}
/* row binding */
if(row_binding) {
/* Only valid if all rows are the same height */
float total_height, equal_height;
total_height = (graphic->height / 2) - symbol->border_width;
equal_height = total_height / symbol->rows;
if((y_position > ((equal_height * row) - 1.0)) && (y_position < ((equal_height * row) + 1.0))) {
outdata[i] = fgred;
outdata[i + 1] = fggrn;
outdata[i + 2] = fgblu;
}
if((y_position > ((equal_height * (row + 1)) - 1.0)) && (y_position < ((equal_height * (row + 1)) + 1.0))) {
outdata[i] = fgred;
outdata[i + 1] = fggrn;
outdata[i + 2] = fgblu;
}
}
}
/* right whitespace */
if((k >= (graphic->width - ((2 *symbol->border_width) + (2 * symbol->whitespace_width)))) && (k < (graphic->width - (2 * symbol->border_width)))) {
outdata[i] = bgred;
outdata[i + 1] = bggrn;
outdata[i + 2] = bgblu;
}
/* right hand border */
if(k >= (graphic->width - (2 * symbol->border_width))) {
if(symbol->output_options == BARCODE_BOX) {
outdata[i] = fgred;
outdata[i + 1] = fggrn;
outdata[i + 2] = fgblu;
} else {
outdata[i] = bgred;
outdata[i + 1] = bggrn;
outdata[i + 2] = bgblu;
}
}
}
}
/* bottom border */
if (j >= (graphic->height - (2 * symbol->border_width))) {
if ((symbol->output_options == BARCODE_BOX) || (symbol->output_options == BARCODE_BIND)) {
for(i = 0; i < (graphic->width * 3); i+=3) {
outdata[i] = fgred;
outdata[i + 1] = fggrn;
outdata[i + 2] = fgblu;
}
} else {
for(i = 0; i < (graphic->width * 3); i+=3) {
outdata[i] = bgred;
outdata[i + 1] = bggrn;
outdata[i + 2] = bgblu;
}
}
}
/* write row contents to file */
image_data = outdata;
png_write_row(png_ptr, image_data);
}
/* End the file */
png_write_end(png_ptr, NULL);
/* make sure we have disengaged */
if (png_ptr && info_ptr) png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(wpng_info.outfile);
return 0;
}
int maxi_png_plot(struct zint_symbol *symbol)
{
struct mainprog_info_type wpng_info;
struct mainprog_info_type *graphic;
unsigned char outdata[6000];
png_structp png_ptr;
png_infop info_ptr;
graphic = &wpng_info;
long j;
unsigned long rowbytes;
unsigned char *image_data;
int i, k, row, row_binding, errno;
int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
int x_posn, y_posn, w_posn, h_posn;
/* sort out colour options */
to_upper(symbol->fgcolour);
to_upper(symbol->bgcolour);
if(strlen(symbol->fgcolour) != 6) {
strcpy(symbol->errtxt, "error: malformed foreground colour target");
return ERROR_INVALID_OPTION;
}
if(strlen(symbol->bgcolour) != 6) {
strcpy(symbol->errtxt, "error: malformed background colour target");
return ERROR_INVALID_OPTION;
}
errno = is_sane(SSET, symbol->fgcolour);
if (errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: malformed foreground colour target");
return ERROR_INVALID_OPTION;
}
errno = is_sane(SSET, symbol->bgcolour);
if (errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: malformed background colour target");
return ERROR_INVALID_OPTION;
}
fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]);
fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]);
fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]);
bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]);
bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]);
bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]);
graphic->width = 300;
graphic->height = 300;
/* Open output file in binary mode */
if (!(graphic->outfile = fopen(symbol->outfile, "wb"))) {
strcpy(symbol->errtxt, "error: can't open output file");
return ERROR_FILE_ACCESS;
}
/* Set up error handling routine as proc() above */
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, graphic,
writepng_error_handler, NULL);
if (!png_ptr) {
strcpy(symbol->errtxt, "error: out of memory");
return ERROR_MEMORY;
}
info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr) {
png_destroy_write_struct(&png_ptr, NULL);
strcpy(symbol->errtxt, "error: out of memory");
return ERROR_MEMORY;
}
/* catch jumping here */
if (setjmp(graphic->jmpbuf)) {
png_destroy_write_struct(&png_ptr, &info_ptr);
strcpy(symbol->errtxt, "error: libpng error occurred");
return ERROR_MEMORY;
}
/* open output file with libpng */
png_init_io(png_ptr, graphic->outfile);
/* set compression */
png_set_compression_level(png_ptr, Z_BEST_COMPRESSION);
/* set Header block */
png_set_IHDR(png_ptr, info_ptr, graphic->width, graphic->height,
8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
/* write all chunks up to (but not including) first IDAT */
png_write_info(png_ptr, info_ptr);
/* set up the transformations: for now, just pack low-bit-depth pixels
into bytes (one, two or four pixels per byte) */
png_set_packing(png_ptr);
/* set rowbytes - depends on picture depth */
rowbytes = wpng_info.width * 3;
/* Pixel Plotting */
for (j = 0; j < graphic->height; j++) {
for(i = 0; i < (graphic->width * 3); i += 3) {
outdata[i] = bgred;
outdata[i + 1] = bggrn;
outdata[i + 2] = bgblu;
}
if((j % 18) < 12) {
/* We are in a 'full' row of hexagons */
for(i = 0; i < graphic->width; i++) {
x_posn = i / 10;
y_posn = j / 18;
y_posn *= 2;
if(symbol->encoded_data[y_posn][x_posn] == '1') {
/* A hexagon needs plotting here */
w_posn = i % 10;
h_posn = j % 18;
if(hexagon[(h_posn * 10) + w_posn] == 1) {
outdata[i * 3] = fgred;
outdata[(i * 3) + 1] = fggrn;
outdata[(i * 3) + 2] = fgblu;
}
}
}
}
if(((j + 9) % 18) < 12) {
int ia, ja;
ja = j - 9;
/* We are in a 'reduced' row of hexagons */
for(i = 5; i < (graphic->width - 5); i++) {
ia = i - 5;
x_posn = ia / 10;
y_posn = ja / 18;
y_posn *= 2;
y_posn++;
if(symbol->encoded_data[y_posn][x_posn] == '1') {
/* A hexagon needs plotting here */
w_posn = ia % 10;
h_posn = ja % 18;
if(hexagon[(h_posn * 10) + w_posn] == 1) {
outdata[i * 3] = fgred;
outdata[(i * 3) + 1] = fggrn;
outdata[(i * 3) + 2] = fgblu;
}
}
}
}
if((j >= 103) && (j < 196)) {
/* Central bullseye */
for(i = 0; i < 93; i++) {
if(bullseye[(((j - 103) * 93) + i) * 4] == '!') {
outdata[i * 3 + 297] = fgred;
outdata[(i * 3) + 1 + 297] = fggrn;
outdata[(i * 3) + 2 + 297] = fgblu;
}
}
}
/* write row contents to file */
image_data = outdata;
png_write_row(png_ptr, image_data);
}
/* End the file */
png_write_end(png_ptr, NULL);
/* make sure we have disengaged */
if (png_ptr && info_ptr) png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(wpng_info.outfile);
return 0;
}

341
backend/postal.c Normal file
View File

@ -0,0 +1,341 @@
/* postal.c - Handles PostNet, PLANET, FIM. RM4SCC and Flattermarken */
/* Zint - A barcode generating program using libpng
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "common.h"
#define BESET "ABCD"
#define KRSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
/* PostNet number encoding table - In this table L is long as S is short */
static char *PNTable[10] = {"LLSSS", "SSSLL", "SSLSL", "SSLLS", "SLSSL", "SLSLS", "SLLSS", "LSSSL",
"LSSLS", "LSLSS"};
static char *PLTable[10] = {"SSLLL", "LLLSS", "LLSLS", "LLSSL", "LSLLS", "LSLSL", "LSSLL", "SLLLS",
"SLLSL", "SLSLL"};
static char *FIMTable[4] = {"12121112121", "111112111211111", "121111111111121", "13111111131"};
static char *RoyalValues[36] = {"11", "12", "13", "14", "15", "10", "21", "22", "23", "24", "25",
"20", "31", "32", "33", "34", "35", "30", "41", "42", "43", "44", "45", "40", "51", "52",
"53", "54", "55", "50", "01", "02", "03", "04", "05", "00"};
static char *RoyalTable[36] = {"3300", "3210", "3201", "2310", "2301", "2211", "3120", "3030", "3021",
"2130", "2121", "2031", "3102", "3012", "3003", "2112", "2103", "2013", "1320", "1230",
"1221", "0330", "0321", "0231", "1302", "1212", "1203", "0312", "0303", "0213", "1122",
"1032", "1023", "0132", "0123", "0033"};
static char *FlatTable[10] = {"0504", "18", "0117", "0216", "0315", "0414", "0513", "0612", "0711",
"0810"};
int postnet(struct zint_symbol *symbol, unsigned char source[], char dest[])
{
/* Handles the PostNet system used for Zip codes in the US */
unsigned int i, sum, check_digit;
int errno, h;
errno = 0;
if(strlen(source) > 90) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(NESET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
sum = 0;
/* start character */
concat (dest, "L");
for (i=0; i < strlen(source); i++)
{
lookup(NESET, PNTable, source[i], dest);
sum += ctoi(source[i]);
}
check_digit = 10 - (sum%10);
concat(dest, PNTable[check_digit]);
/* stop character */
concat (dest, "L");
h = strlen(source);
source[h] = itoc(check_digit);
source[h + 1] = '\0';
strcpy(symbol->text, "");
return errno;
}
int post_plot(struct zint_symbol *symbol, unsigned char source[])
{
/* Puts PostNet barcodes into the pattern matrix */
char height_pattern[200];
unsigned int loopey;
int writer;
strcpy(height_pattern, "");
int errno;
errno = 0;
errno = postnet(symbol, source, height_pattern);
if(errno != 0) {
return errno;
}
writer = 0;
for(loopey = 0; loopey < strlen(height_pattern); loopey++)
{
if(height_pattern[loopey] == 'L')
{
symbol->encoded_data[0][writer] = '1';
}
symbol->encoded_data[1][writer] = '1';
writer += 2;
}
symbol->row_height[0] = 6;
symbol->row_height[1] = 6;
symbol->rows = 2;
symbol->width = writer - 1;
return errno;
}
int planet(struct zint_symbol *symbol, unsigned char source[], char dest[])
{
/* Handles the PLANET system used for item tracking in the US */
unsigned int i, sum, check_digit;
int errno, h;
errno = 0;
if(strlen(source) > 90) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(NESET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
sum = 0;
/* start character */
concat (dest, "L");
for (i=0; i < strlen(source); i++)
{
lookup(NESET, PLTable, source[i], dest);
sum += ctoi(source[i]);
}
check_digit = 10 - (sum%10);
concat(dest, PLTable[check_digit]);
/* stop character */
concat (dest, "L");
h = strlen(source);
source[h] = itoc(check_digit);
source[h + 1] = '\0';
strcpy(symbol->text, "");
return errno;
}
int planet_plot(struct zint_symbol *symbol, unsigned char source[])
{
/* Puts PLANET barcodes into the pattern matrix */
char height_pattern[200];
unsigned int loopey;
int writer;
int errno;
strcpy(height_pattern, "");
errno = 0;
errno = planet(symbol, source, height_pattern);
if(errno != 0) {
return errno;
}
writer = 0;
for(loopey = 0; loopey < strlen(height_pattern); loopey++)
{
if(height_pattern[loopey] == 'L')
{
symbol->encoded_data[0][writer] = '1';
}
symbol->encoded_data[1][writer] = '1';
writer += 2;
}
symbol->row_height[0] = 6;
symbol->row_height[1] = 6;
symbol->rows = 2;
symbol->width = writer - 1;
return errno;
}
int fim(struct zint_symbol *symbol, unsigned char source[])
{
/* The simplest barcode symbology ever! Supported by MS Word, so here it is! */
/* glyphs from http://en.wikipedia.org/wiki/Facing_Identification_Mark */
int errno;
char dest[17];
errno = 0;
strcpy(dest, "");
to_upper(source);
if(strlen(source) > 1) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(BESET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
lookup(BESET, FIMTable, source[0], dest);
expand(symbol, dest);
strcpy(symbol->text, "");
return errno;
}
char rm4scc(char source[], unsigned char dest[])
{
/* Handles the 4 State barcodes used in the UK by Royal Mail */
unsigned int i;
int top, bottom, row, column, check_digit;
char values[3], set_copy[38];
strcpy(set_copy, KRSET);
top = 0;
bottom = 0;
/* start character */
concat (dest, "1");
for (i=0; i < strlen(source); i++) {
lookup(KRSET, RoyalTable, source[i], dest);
strcpy(values, RoyalValues[posn(KRSET, source[i])]);
top += ctoi(values[0]);
bottom += ctoi(values[1]);
}
/* Calculate the check digit */
row = (top % 6) - 1;
column = (bottom % 6) - 1;
if(row == -1) { row = 5; }
if(column == -1) { column = 5; }
check_digit = (6 * row) + column;
concat(dest, RoyalTable[check_digit]);
/* stop character */
concat (dest, "0");
return set_copy[check_digit];
}
int royal_plot(struct zint_symbol *symbol, unsigned char source[])
{
/* Puts RM4SCC into the data matrix */
char height_pattern[200], check;
unsigned int loopey;
int writer;
int errno, h;
strcpy(height_pattern, "");
errno = 0;
to_upper(source);
if(strlen(source) > 120) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(KRSET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
check = rm4scc(source, height_pattern);
writer = 0;
for(loopey = 0; loopey < strlen(height_pattern); loopey++)
{
if((height_pattern[loopey] == '1') || (height_pattern[loopey] == '0'))
{
symbol->encoded_data[0][writer] = '1';
}
symbol->encoded_data[1][writer] = '1';
if((height_pattern[loopey] == '2') || (height_pattern[loopey] == '0'))
{
symbol->encoded_data[2][writer] = '1';
}
writer += 2;
}
symbol->row_height[0] = 4;
symbol->row_height[1] = 2;
symbol->row_height[2] = 4;
symbol->rows = 3;
symbol->width = writer - 1;
h = strlen(source);
source[h] = check;
source[h + 1] = '\0';
strcpy(symbol->text, "");
return errno;
}
int flattermarken(struct zint_symbol *symbol, unsigned char source[])
{ /* Flattermarken - Not really a barcode symbology and (in my opinion) probably not much use
but it's supported by TBarCode so it's supported by Zint! */
int loop, errno;
char dest[1000];
errno = 0;
strcpy(dest, "");
if(strlen(source) > 90) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(NESET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
for(loop = 0; loop < strlen(source); loop++) {
lookup(NESET, FlatTable, source[loop], dest);
}
expand(symbol, dest);
strcpy(symbol->text, "");
return errno;
}

790
backend/ps.c Normal file
View File

@ -0,0 +1,790 @@
/* ps.c - Post Script output */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "common.h"
#define SSET "0123456789ABCDEF"
/* This file has expanded quite a bit since version 1.5 in order to accomodate
the formatting rules for EAN and UPC symbols as set out in EN 797:1995 - the
down side of this support is that the code is now vertually unreadable! */
int ps_plot(struct zint_symbol *symbol)
{
int i, block_width, latch, r, this_row;
float textpos, large_bar_height, preset_height, row_height, row_posn;
FILE *feps;
int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
float red_ink, green_ink, blue_ink, red_paper, green_paper, blue_paper;
int errno = 0;
int textoffset, xoffset, yoffset, textdone, main_width;
char textpart[10], addon[6];
int large_bar_count, comp_offset;
float addon_text_posn;
textdone = 0;
main_width = symbol->width;
strcpy(addon, "");
comp_offset = 0;
addon_text_posn = 0.0;
feps = fopen(symbol->outfile, "w");
if(feps == NULL) {
strcpy(symbol->errtxt, "error: could not open output file");
return ERROR_FILE_ACCESS;
}
/* sort out colour options */
to_upper(symbol->fgcolour);
to_upper(symbol->bgcolour);
if(strlen(symbol->fgcolour) != 6) {
strcpy(symbol->errtxt, "error: malformed foreground colour target");
return ERROR_INVALID_OPTION;
}
if(strlen(symbol->bgcolour) != 6) {
strcpy(symbol->errtxt, "error: malformed background colour target");
return ERROR_INVALID_OPTION;
}
errno = is_sane(SSET, symbol->fgcolour);
if (errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: malformed foreground colour target");
return ERROR_INVALID_OPTION;
}
errno = is_sane(SSET, symbol->bgcolour);
if (errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: malformed background colour target");
return ERROR_INVALID_OPTION;
}
fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]);
fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]);
fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]);
bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]);
bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]);
bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]);
red_ink = fgred / 256.0;
green_ink = fggrn / 256.0;
blue_ink = fgblu / 256.0;
red_paper = bgred / 256.0;
green_paper = bggrn / 256.0;
blue_paper = bgblu / 256.0;
if (symbol->height == 0) {
symbol->height = 50;
}
large_bar_count = 0;
preset_height = 0.0;
for(i = 0; i < symbol->rows; i++) {
preset_height += symbol->row_height[i];
if(symbol->row_height[i] == 0) {
large_bar_count++;
}
}
large_bar_height = (symbol->height - preset_height) / large_bar_count;
if (large_bar_count == 0) {
symbol->height = preset_height;
}
while(symbol->encoded_data[symbol->rows - 1][comp_offset] != '1') {
comp_offset++;
}
/* Certain symbols need whitespace otherwise characters get chopped off the sides */
if (((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) {
switch(strlen(symbol->text)) {
case 13: /* EAN 13 */
case 16:
case 19:
if(symbol->whitespace_width == 0) {
symbol->whitespace_width = 10;
}
main_width = 96 + comp_offset;
break;
default:
main_width = 68 + comp_offset;
}
}
if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) {
if(symbol->whitespace_width == 0) {
symbol->whitespace_width = 10;
main_width = 96 + comp_offset;
}
}
if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) {
if(symbol->whitespace_width == 0) {
symbol->whitespace_width = 10;
main_width = 51 + comp_offset;
}
}
latch = 0;
r = 0;
/* Isolate add-on text */
for(i = 0; i < strlen(symbol->text); i++) {
if (latch == 1) {
addon[r] = symbol->text[i];
r++;
}
if (symbol->text[i] == '+') {
latch = 1;
}
}
addon[r] = '\0';
if(strcmp(symbol->text, "")) {
textoffset = 9;
} else {
textoffset = 0;
}
xoffset = symbol->border_width + symbol->whitespace_width;
yoffset = symbol->border_width;
/* Start writing the header */
fprintf(feps, "%!PS-Adobe-3.0 EPSF-3.0\n");
fprintf(feps, "%%%%Creator: Zint %s\n", VERSION);
if(strlen(symbol->text) != 0) {
fprintf(feps, "%%%%Title: %s\n",symbol->text);
} else {
fprintf(feps, "%%%%Title: Zint Generated Symbol\n");
}
fprintf(feps, "%%%%Pages: 0\n");
if(symbol->symbology != BARCODE_MAXICODE) {
fprintf(feps, "%%%%BoundingBox: 0 0 %d %d\n", (symbol->width + xoffset + xoffset), (symbol->height + textoffset + yoffset + yoffset));
} else {
fprintf(feps, "%%%%BoundingBox: 0 0 74 72\n");
}
fprintf(feps, "%%%%EndComments\n");
/* Definitions */
fprintf(feps, "/TL { setlinewidth moveto lineto stroke } bind def\n");
fprintf(feps, "/TC { moveto 0 360 arc 360 0 arcn fill } bind def\n");
fprintf(feps, "/TH { 0 setlinewidth moveto lineto lineto lineto lineto lineto closepath fill } bind def\n");
fprintf(feps, "/TB { 2 copy } bind def\n");
fprintf(feps, "/TR { newpath 4 1 roll exch moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath fill } bind def\n");
fprintf(feps, "/TE { pop pop } bind def\n");
fprintf(feps, "newpath\n");
/* Now the actual representation */
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_paper, green_paper, blue_paper);
fprintf(feps, "%d.00 0.00 TB 0.00 %d.00 TR\n", (symbol->height + textoffset + yoffset + yoffset), symbol->width + xoffset + xoffset);
if(symbol->symbology == BARCODE_MAXICODE) {
/* Maxicode uses hexagons */
float ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy, mx, my;
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
fprintf(feps, "35.76 35.60 10.85 35.76 35.60 8.97 44.73 35.60 TC\n");
fprintf(feps, "35.76 35.60 7.10 35.76 35.60 5.22 40.98 35.60 TC\n");
fprintf(feps, "35.76 35.60 3.31 35.76 35.60 1.43 37.19 35.60 TC\n");
for(r = 0; r < symbol->rows; r++) {
for(i = 0; i < symbol->width; i++) {
if(symbol->encoded_data[r][i] == '1') {
/* Dump a hexagon */
my = ((symbol->rows - r - 1)) * 2.135 + 1.43;
ay = my + 1.0;
by = my + 0.5;
cy = my - 0.5;
dy = my - 1.0;
ey = my - 0.5;
fy = my + 0.5;
if(r % 2 == 1) {
mx = (2.46 * i) + 1.23 + 1.23;
} else {
mx = (2.46 * i) + 1.23;
}
ax = mx;
bx = mx + 0.86;
cx = mx + 0.86;
dx = mx;
ex = mx - 0.86;
fx = mx - 0.86;
fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TH\n", ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy);
}
}
}
}
if(symbol->symbology == BARCODE_ULTRA) {
/* Ultracode uses a colour scheme all of its own! */
int addon_latch = 0;
for(r = 0; r < symbol->rows; r++) {
this_row = symbol->rows - r - 1; /* invert r otherwise plots upside down */
if(symbol->row_height[this_row] == 0) {
row_height = large_bar_height;
} else {
row_height = symbol->row_height[this_row];
}
row_posn = 0;
for(i = 0; i < r; i++) {
if(symbol->row_height[symbol->rows - i - 1] == 0) {
row_posn += large_bar_height;
} else {
row_posn += symbol->row_height[symbol->rows - i - 1];
}
}
row_posn += (textoffset + yoffset);
for(i = 0; i < symbol->width; i++) {
switch(symbol->encoded_data[this_row][i]) {
case '1':
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
fprintf(feps, "%.2f %.2f ", row_height, row_posn);
fprintf(feps, "TB %d.00 %d.00 TR\n", i + xoffset, 1);
break;
case 'R':
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", 1.00, 0.00, 0.00);
fprintf(feps, "%.2f %.2f ", row_height, row_posn);
fprintf(feps, "TB %d.00 %d.00 TR\n", i + xoffset, 1);
break;
case 'G':
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", 0.00, 1.00, 0.00);
fprintf(feps, "%.2f %.2f ", row_height, row_posn);
fprintf(feps, "TB %d.00 %d.00 TR\n", i + xoffset, 1);
break;
case 'B':
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", 0.00, 0.00, 1.00);
fprintf(feps, "%.2f %.2f ", row_height, row_posn);
fprintf(feps, "TB %d.00 %d.00 TR\n", i + xoffset, 1);
break;
case 'C':
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", 0.00, 1.00, 1.00);
fprintf(feps, "%.2f %.2f ", row_height, row_posn);
fprintf(feps, "TB %d.00 %d.00 TR\n", i + xoffset, 1);
break;
case 'M':
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", 1.00, 0.00, 1.00);
fprintf(feps, "%.2f %.2f ", row_height, row_posn);
fprintf(feps, "TB %d.00 %d.00 TR\n", i + xoffset, 1);
break;
case 'Y':
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", 1.00, 1.00, 0.00);
fprintf(feps, "%.2f %.2f ", row_height, row_posn);
fprintf(feps, "TB %d.00 %d.00 TR\n", i + xoffset, 1);
break;
}
}
}
}
if((symbol->symbology != BARCODE_MAXICODE) && (symbol->symbology != BARCODE_ULTRA)) {
/* everything else uses rectangles (or squares) */
/* Works from the bottom of the symbol up */
int addon_latch = 0;
for(r = 0; r < symbol->rows; r++) {
this_row = symbol->rows - r - 1; /* invert r otherwise plots upside down */
if(symbol->row_height[this_row] == 0) {
row_height = large_bar_height;
} else {
row_height = symbol->row_height[this_row];
}
row_posn = 0;
for(i = 0; i < r; i++) {
if(symbol->row_height[symbol->rows - i - 1] == 0) {
row_posn += large_bar_height;
} else {
row_posn += symbol->row_height[symbol->rows - i - 1];
}
}
row_posn += (textoffset + yoffset);
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
fprintf(feps, "%.2f %.2f ", row_height, row_posn);
i = 0;
if(symbol->encoded_data[this_row][0] == '1') {
latch = 1;
} else {
latch = 0;
}
do {
block_width = 0;
do {
block_width++;
} while (symbol->encoded_data[this_row][i + block_width] == symbol->encoded_data[this_row][i]);
if((addon_latch == 0) && (r == 0) && (i > main_width)) {
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
fprintf(feps, "%.2f %.2f ", (row_height - 5.0), (row_posn - 5.0));
addon_text_posn = row_posn + row_height - 8.0;
addon_latch = 1;
}
if(latch == 1) {
/* a bar */
fprintf(feps, "TB %d.00 %d.00 TR\n", i + xoffset, block_width);
latch = 0;
} else {
/* a space */
latch = 1;
}
i += block_width;
} while (i < symbol->width);
}
}
/* That's done the actual data area, everything else is human-friendly */
xoffset += comp_offset;
if (((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) {
/* guard bar extensions and text formatting for EAN8 and EAN13 */
switch(strlen(symbol->text)) {
case 8: /* EAN-8 */
case 11:
case 14:
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
fprintf(feps, "%.2f %.2f ", 5.0, 4.0 + yoffset);
fprintf(feps, "TB %d.00 %d.00 TR\n", 0 + xoffset, 1);
fprintf(feps, "TB %d.00 %d.00 TR\n", 2 + xoffset, 1);
fprintf(feps, "TB %d.00 %d.00 TR\n", 32 + xoffset, 1);
fprintf(feps, "TB %d.00 %d.00 TR\n", 34 + xoffset, 1);
fprintf(feps, "TB %d.00 %d.00 TR\n", 64 + xoffset, 1);
fprintf(feps, "TB %d.00 %d.00 TR\n", 66 + xoffset, 1);
for(i = 0; i < 4; i++) {
textpart[i] = symbol->text[i];
}
textpart[4] = '\0';
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "11.00 scalefont setfont\n");
textpos = 17;
fprintf(feps, " 0 0 moveto %.2f 0.50 translate 0.00 rotate 0 0 moveto\n", textpos + xoffset);
fprintf(feps, " (%s) stringwidth\n", textpart);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", textpart);
fprintf(feps, "setmatrix\n");
for(i = 0; i < 4; i++) {
textpart[i] = symbol->text[i + 4];
}
textpart[4] = '\0';
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "11.00 scalefont setfont\n");
textpos = 50;
fprintf(feps, " 0 0 moveto %.2f 0.50 translate 0.00 rotate 0 0 moveto\n", textpos + xoffset);
fprintf(feps, " (%s) stringwidth\n", textpart);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", textpart);
fprintf(feps, "setmatrix\n");
textdone = 1;
switch(strlen(addon)) {
case 2:
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "11.00 scalefont setfont\n");
textpos = symbol->width + xoffset - 10;
fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos, addon_text_posn);
fprintf(feps, " (%s) stringwidth\n", addon);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", addon);
fprintf(feps, "setmatrix\n");
break;
case 5:
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "11.00 scalefont setfont\n");
textpos = symbol->width + xoffset - 23;
fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos, addon_text_posn);
fprintf(feps, " (%s) stringwidth\n", addon);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", addon);
fprintf(feps, "setmatrix\n");
break;
}
break;
case 13: /* EAN 13 */
case 16:
case 19:
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
fprintf(feps, "%.2f %.2f ", 5.0, 4.0 + yoffset);
fprintf(feps, "TB %d.00 %d.00 TR\n", 0 + xoffset, 1);
fprintf(feps, "TB %d.00 %d.00 TR\n", 2 + xoffset, 1);
fprintf(feps, "TB %d.00 %d.00 TR\n", 46 + xoffset, 1);
fprintf(feps, "TB %d.00 %d.00 TR\n", 48 + xoffset, 1);
fprintf(feps, "TB %d.00 %d.00 TR\n", 92 + xoffset, 1);
fprintf(feps, "TB %d.00 %d.00 TR\n", 94 + xoffset, 1);
textpart[0] = symbol->text[0];
textpart[1] = '\0';
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "11.00 scalefont setfont\n");
textpos = -7;
fprintf(feps, " 0 0 moveto %.2f 0.50 translate 0.00 rotate 0 0 moveto\n", textpos + xoffset);
fprintf(feps, " (%s) stringwidth\n", textpart);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", textpart);
fprintf(feps, "setmatrix\n");
for(i = 0; i < 6; i++) {
textpart[i] = symbol->text[i + 1];
}
textpart[6] = '\0';
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "11.00 scalefont setfont\n");
textpos = 24;
fprintf(feps, " 0 0 moveto %.2f 0.50 translate 0.00 rotate 0 0 moveto\n", textpos + xoffset);
fprintf(feps, " (%s) stringwidth\n", textpart);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", textpart);
fprintf(feps, "setmatrix\n");
for(i = 0; i < 6; i++) {
textpart[i] = symbol->text[i + 7];
}
textpart[6] = '\0';
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "11.00 scalefont setfont\n");
textpos = 71;
fprintf(feps, " 0 0 moveto %.2f 0.50 translate 0.00 rotate 0 0 moveto\n", textpos + xoffset);
fprintf(feps, " (%s) stringwidth\n", textpart);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", textpart);
fprintf(feps, "setmatrix\n");
textdone = 1;
switch(strlen(addon)) {
case 2:
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "11.00 scalefont setfont\n");
textpos = symbol->width + xoffset - 10;
fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos, addon_text_posn);
fprintf(feps, " (%s) stringwidth\n", addon);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", addon);
fprintf(feps, "setmatrix\n");
break;
case 5:
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "11.00 scalefont setfont\n");
textpos = symbol->width + xoffset - 23;
fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos, addon_text_posn);
fprintf(feps, " (%s) stringwidth\n", addon);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", addon);
fprintf(feps, "setmatrix\n");
break;
}
break;
}
}
if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) {
/* guard bar extensions and text formatting for UPCA */
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
fprintf(feps, "%.2f %.2f ", 5.0, 4.0 + yoffset);
latch = 1;
i = 0 + comp_offset;
do {
block_width = 0;
do {
block_width++;
} while (symbol->encoded_data[symbol->rows - 1][i + block_width] == symbol->encoded_data[symbol->rows - 1][i]);
if(latch == 1) {
/* a bar */
fprintf(feps, "TB %d.00 %d.00 TR\n", i + xoffset - comp_offset, block_width);
latch = 0;
} else {
/* a space */
latch = 1;
}
i += block_width;
} while (i < 11 + comp_offset);
fprintf(feps, "TB %d.00 %d.00 TR\n", 46 + xoffset, 1);
fprintf(feps, "TB %d.00 %d.00 TR\n", 48 + xoffset, 1);
latch = 1;
i = 85 + comp_offset;
do {
block_width = 0;
do {
block_width++;
} while (symbol->encoded_data[symbol->rows - 1][i + block_width] == symbol->encoded_data[symbol->rows - 1][i]);
if(latch == 1) {
/* a bar */
fprintf(feps, "TB %d.00 %d.00 TR\n", i + xoffset - comp_offset, block_width);
latch = 0;
} else {
/* a space */
latch = 1;
}
i += block_width;
} while (i < 96 + comp_offset);
textpart[0] = symbol->text[0];
textpart[1] = '\0';
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "8.00 scalefont setfont\n");
textpos = -5;
fprintf(feps, " 0 0 moveto %.2f 0.50 translate 0.00 rotate 0 0 moveto\n", textpos + xoffset);
fprintf(feps, " (%s) stringwidth\n", textpart);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", textpart);
fprintf(feps, "setmatrix\n");
for(i = 0; i < 5; i++) {
textpart[i] = symbol->text[i + 1];
}
textpart[5] = '\0';
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "11.00 scalefont setfont\n");
textpos = 27;
fprintf(feps, " 0 0 moveto %.2f 0.50 translate 0.00 rotate 0 0 moveto\n", textpos + xoffset);
fprintf(feps, " (%s) stringwidth\n", textpart);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", textpart);
fprintf(feps, "setmatrix\n");
for(i = 0; i < 5; i++) {
textpart[i] = symbol->text[i + 6];
}
textpart[6] = '\0';
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "11.00 scalefont setfont\n");
textpos = 68;
fprintf(feps, " 0 0 moveto %.2f 0.50 translate 0.00 rotate 0 0 moveto\n", textpos + xoffset);
fprintf(feps, " (%s) stringwidth\n", textpart);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", textpart);
fprintf(feps, "setmatrix\n");
textpart[0] = symbol->text[11];
textpart[1] = '\0';
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "8.00 scalefont setfont\n");
textpos = 100;
fprintf(feps, " 0 0 moveto %.2f 0.50 translate 0.00 rotate 0 0 moveto\n", textpos + xoffset);
fprintf(feps, " (%s) stringwidth\n", textpart);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", textpart);
fprintf(feps, "setmatrix\n");
textdone = 1;
switch(strlen(addon)) {
case 2:
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "11.00 scalefont setfont\n");
textpos = symbol->width + xoffset - 10;
fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos, addon_text_posn);
fprintf(feps, " (%s) stringwidth\n", addon);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", addon);
fprintf(feps, "setmatrix\n");
break;
case 5:
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "11.00 scalefont setfont\n");
textpos = symbol->width + xoffset - 23;
fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos, addon_text_posn);
fprintf(feps, " (%s) stringwidth\n", addon);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", addon);
fprintf(feps, "setmatrix\n");
break;
}
}
if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) {
/* guard bar extensions and text formatting for UPCE */
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
fprintf(feps, "%.2f %.2f ", 5.0, 4.0 + yoffset);
fprintf(feps, "TB %d.00 %d.00 TR\n", 0 + xoffset, 1);
fprintf(feps, "TB %d.00 %d.00 TR\n", 2 + xoffset, 1);
fprintf(feps, "TB %d.00 %d.00 TR\n", 46 + xoffset, 1);
fprintf(feps, "TB %d.00 %d.00 TR\n", 48 + xoffset, 1);
fprintf(feps, "TB %d.00 %d.00 TR\n", 50 + xoffset, 1);
textpart[0] = symbol->text[0];
textpart[1] = '\0';
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "8.00 scalefont setfont\n");
textpos = -5;
fprintf(feps, " 0 0 moveto %.2f 0.50 translate 0.00 rotate 0 0 moveto\n", textpos + xoffset);
fprintf(feps, " (%s) stringwidth\n", textpart);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", textpart);
fprintf(feps, "setmatrix\n");
for(i = 0; i < 6; i++) {
textpart[i] = symbol->text[i + 1];
}
textpart[6] = '\0';
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "11.00 scalefont setfont\n");
textpos = 24;
fprintf(feps, " 0 0 moveto %.2f 0.50 translate 0.00 rotate 0 0 moveto\n", textpos + xoffset);
fprintf(feps, " (%s) stringwidth\n", textpart);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", textpart);
fprintf(feps, "setmatrix\n");
textpart[0] = symbol->text[7];
textpart[1] = '\0';
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "8.00 scalefont setfont\n");
textpos = 55;
fprintf(feps, " 0 0 moveto %.2f 0.50 translate 0.00 rotate 0 0 moveto\n", textpos + xoffset);
fprintf(feps, " (%s) stringwidth\n", textpart);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", textpart);
fprintf(feps, "setmatrix\n");
textdone = 1;
switch(strlen(addon)) {
case 2:
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "11.00 scalefont setfont\n");
textpos = symbol->width + xoffset - 10;
fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos, addon_text_posn);
fprintf(feps, " (%s) stringwidth\n", addon);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", addon);
fprintf(feps, "setmatrix\n");
break;
case 5:
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "11.00 scalefont setfont\n");
textpos = symbol->width + xoffset - 23;
fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos, addon_text_posn);
fprintf(feps, " (%s) stringwidth\n", addon);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", addon);
fprintf(feps, "setmatrix\n");
break;
}
}
xoffset -= comp_offset;
/* Put boundary bars or box around symbol */
if ((symbol->output_options == BARCODE_BOX) || (symbol->output_options == BARCODE_BIND)) {
/* boundary bars */
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
fprintf(feps, "%d.00 %d.00 TB %d.00 %d.00 TR\n", symbol->border_width, textoffset, 0, (symbol->width + xoffset + xoffset));
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
fprintf(feps, "%d.00 %d.00 TB %d.00 %d.00 TR\n", symbol->border_width, textoffset + symbol->height + symbol->border_width, 0, (symbol->width + xoffset + xoffset));
if(symbol->rows > 1) {
/* row binding */
for(r = 1; r < symbol->rows; r++) {
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
fprintf(feps, "%d.00 %.2f TB %d.00 %d.00 TR\n", 2, ((r * row_height) + textoffset + yoffset - 1), xoffset, symbol->width);
}
}
}
if (symbol->output_options == BARCODE_BOX) {
/* side bars */
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
fprintf(feps, "%d.00 %d.00 TB %d.00 %d.00 TR\n", symbol->height + (2 * symbol->border_width), textoffset, 0, symbol->border_width);
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
fprintf(feps, "%d.00 %d.00 TB %d.00 %d.00 TR\n", symbol->height + (2 * symbol->border_width), textoffset, (symbol->width + xoffset + xoffset - symbol->border_width), symbol->border_width);
}
/* Put the human readable text at the bottom */
if((textdone == 0) && (strlen(symbol->text) != 0)) {
fprintf(feps, "TE\n");
fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
fprintf(feps, "matrix currentmatrix\n");
fprintf(feps, "/Helvetica findfont\n");
fprintf(feps, "8.00 scalefont setfont\n");
textpos = symbol->width / 2.0;
fprintf(feps, " 0 0 moveto %.2f 1.67 translate 0.00 rotate 0 0 moveto\n", textpos + xoffset);
fprintf(feps, " (%s) stringwidth\n", symbol->text);
fprintf(feps, "pop\n");
fprintf(feps, "-2 div 0 rmoveto\n");
fprintf(feps, " (%s) show\n", symbol->text);
fprintf(feps, "setmatrix\n");
}
fprintf(feps, "\nshowpage\n");
fclose(feps);
return errno;
}

94
backend/qr.c Normal file
View File

@ -0,0 +1,94 @@
/* qr.c Handles QR Code by utilising libqrencode */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
Copyright (C) 2006 Kentaro Fukuchi <fukuchi@megaui.net>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <string.h>
#include <qrencode.h> /* The assumption is that this is already installed */
#include "common.h"
static int kanji = 0;
static QRecLevel level = QR_ECLEVEL_L;
QRcode *encode(int security, int size, const unsigned char *intext)
{
int version;
QRecLevel level;
QRencodeMode hint;
QRcode *code;
if(kanji) {
hint = QR_MODE_KANJI;
} else {
hint = QR_MODE_8;
}
if((security >= 1) && (security <= 4)) {
switch (security) {
case 1: level = QR_ECLEVEL_L; break;
case 2: level = QR_ECLEVEL_M; break;
case 3: level = QR_ECLEVEL_Q; break;
case 4: level = QR_ECLEVEL_H; break;
}
} else {
level = QR_ECLEVEL_L;
}
if((size >= 1) && (size <= 40)) {
version = size;
} else {
version = 0;
}
code = QRcode_encodeString(intext, version, level, hint, 1);
return code;
}
int qr_code(struct zint_symbol *symbol, unsigned char source[])
{
QRcode *code;
int errno = 0;
int i, j;
code = encode(symbol->option_1, symbol->option_2, source);
if(code == NULL) {
strcpy(symbol->errtxt, "error: libqrencode failed to encode the input data");
return ERROR_ENCODING_PROBLEM;
}
symbol->width = code->width;
symbol->rows = code->width;
for(i = 0; i < code->width; i++) {
for(j = 0; j < code->width; j++) {
if((*(code->data + (i * code->width) + j) & 0x01) == 0) {
symbol->encoded_data[i][j] = '0';
} else {
symbol->encoded_data[i][j] = '1';
}
}
symbol->row_height[i] = 1;
}
QRcode_free(code);
return errno;
}

170
backend/reedsol.c Normal file
View File

@ -0,0 +1,170 @@
/**
*
* This is a simple Reed-Solomon encoder
* (C) Cliff Hones 2004
*
* 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 2 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, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
// It is not written with high efficiency in mind, so is probably
// not suitable for real-time encoding. The aim was to keep it
// simple, general and clear.
//
// <Some notes on the theory and implementation need to be added here>
// Usage:
// First call rs_init_gf(poly) to set up the Galois Field parameters.
// Then call rs_init_code(size, index) to set the encoding size
// Then call rs_encode(datasize, data, out) to encode the data.
//
// These can be called repeatedly as required - but note that
// rs_init_code must be called following any rs_init_gf call.
//
// If the parameters are fixed, some of the statics below can be
// replaced with constants in the obvious way, and additionally
// malloc/free can be avoided by using static arrays of a suitable
// size.
#include <stdio.h> // only needed for debug (main)
#include <stdlib.h> // only needed for malloc/free
static int gfpoly;
static int symsize; // in bits
static int logmod; // 2**symsize - 1
static int rlen;
static int *log = NULL, *alog = NULL, *rspoly = NULL;
// rs_init_gf(poly) initialises the parameters for the Galois Field.
// The symbol size is determined from the highest bit set in poly
// This implementation will support sizes up to 30 bits (though that
// will result in very large log/antilog tables) - bit sizes of
// 8 or 4 are typical
//
// The poly is the bit pattern representing the GF characteristic
// polynomial. e.g. for ECC200 (8-bit symbols) the polynomial is
// a**8 + a**5 + a**3 + a**2 + 1, which translates to 0x12d.
void rs_init_gf(int poly)
{
int m, b, p, v;
// Return storage from previous setup
if (log) {
free(log);
free(alog);
free(rspoly);
rspoly = NULL;
}
// Find the top bit, and hence the symbol size
for (b = 1, m = 0; b <= poly; b <<= 1)
m++;
b >>= 1;
m--;
gfpoly = poly;
symsize = m;
// Calculate the log/alog tables
logmod = (1 << m) - 1;
log = (int *)malloc(sizeof(int) * (logmod + 1));
alog = (int *)malloc(sizeof(int) * logmod);
for (p = 1, v = 0; v < logmod; v++) {
alog[v] = p;
log[p] = v;
p <<= 1;
if (p & b)
p ^= poly;
}
}
// rs_init_code(nsym, index) initialises the Reed-Solomon encoder
// nsym is the number of symbols to be generated (to be appended
// to the input data). index is usually 1 - it is the index of
// the constant in the first term (i) of the RS generator polynomial:
// (x + 2**i)*(x + 2**(i+1))*... [nsym terms]
// For ECC200, index is 1.
void rs_init_code(int nsym, int index)
{
int i, k;
if (rspoly)
free(rspoly);
rspoly = (int *)malloc(sizeof(int) * (nsym + 1));
rlen = nsym;
rspoly[0] = 1;
for (i = 1; i <= nsym; i++) {
rspoly[i] = 1;
for (k = i - 1; k > 0; k--) {
if (rspoly[k])
rspoly[k] =
alog[(log[rspoly[k]] + index) % logmod];
rspoly[k] ^= rspoly[k - 1];
}
rspoly[0] = alog[(log[rspoly[0]] + index) % logmod];
index++;
}
}
void rs_encode(int len, unsigned char *data, unsigned char *res)
{
int i, k, m;
for (i = 0; i < rlen; i++)
res[i] = 0;
for (i = 0; i < len; i++) {
m = res[rlen - 1] ^ data[i];
for (k = rlen - 1; k > 0; k--) {
if (m && rspoly[k])
res[k] =
res[k -
1] ^ alog[(log[m] +
log[rspoly[k]]) % logmod];
else
res[k] = res[k - 1];
}
if (m && rspoly[0])
res[0] = alog[(log[m] + log[rspoly[0]]) % logmod];
else
res[0] = 0;
}
}
void rs_encode_long(int len, unsigned int *data, unsigned int *res)
{ /* The same as above but for larger bitlengths - Aztec code compatible */
int i, k, m;
for (i = 0; i < rlen; i++)
res[i] = 0;
for (i = 0; i < len; i++) {
m = res[rlen - 1] ^ data[i];
for (k = rlen - 1; k > 0; k--) {
if (m && rspoly[k])
res[k] =
res[k -
1] ^ alog[(log[m] +
log[rspoly[k]]) % logmod];
else
res[k] = res[k - 1];
}
if (m && rspoly[0])
res[0] = alog[(log[m] + log[rspoly[0]]) % logmod];
else
res[0] = 0;
}
}

30
backend/reedsol.h Normal file
View File

@ -0,0 +1,30 @@
/**
*
* This is a simple Reed-Solomon encoder
* (C) Cliff Hones 2004
*
* 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 2 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, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#ifndef __REEDSOL_H
#define __REEDSOL_H
void rs_init_gf(int poly);
void rs_init_code(int nsym, int index);
void rs_encode(int len, unsigned char *data, unsigned char *res);
void rs_encode_long(int len, unsigned int *data, unsigned int *res);
#endif /* __REEDSOL_H */

2293
backend/rss.c Normal file

File diff suppressed because it is too large Load Diff

225
backend/rss.h Normal file
View File

@ -0,0 +1,225 @@
/* rss.h - Data tables for Reduced Space Symbology */
/*
libzint - the open source barcode library
Copyright (C) 2007 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#define NUMERIC 110
#define ALPHA 97
#define ISOIEC 105
#define INVALID_CHAR 100
#define ANY_ENC 120
#define ALPHA_OR_ISO 121
/* RSS-14 Tables */
static int g_sum_table[9] = { 0, 161, 961, 2015, 2715, 0, 336, 1036, 1516};
static int t_table[9] = { 1, 10, 34, 70, 126, 4, 20, 48, 81};
static int modules_odd[9] = { 12, 10, 8, 6, 4, 5, 7, 9, 11 };
static int modules_even[9] = { 4, 6, 8, 10, 12, 10, 8, 6, 4 };
static int widest_odd[9] = { 8, 6, 4, 3, 1, 2, 4, 6, 8 };
static int widest_even[9] = { 1, 3, 5, 6, 8, 7, 5, 3, 1 };
static int widths[8];
static int finder_pattern[45] = {
3, 8, 2, 1, 1,
3, 5, 5, 1, 1,
3, 3, 7, 1, 1,
3, 1, 9, 1, 1,
2, 7, 4, 1, 1,
2, 5, 6, 1, 1,
2, 3, 8, 1, 1,
1, 5, 7, 1, 1,
1, 3, 9, 1, 1
};
static int checksum_weight[32] = { /* Table 5 */
1, 3, 9, 27, 2, 6, 18, 54,
4, 12, 36, 29, 8, 24, 72, 58,
16, 48, 65, 37, 32, 17, 51, 74,
64, 34, 23, 69, 49, 68, 46, 59
};
/* RSS Limited Tables */
static int t_even_ltd[7] = { 28, 728, 6454, 203, 2408, 1, 16632 };
static int modules_odd_ltd[7] = { 17, 13, 9, 15, 11, 19, 7 };
static int modules_even_ltd[7] = { 9, 13, 17, 11, 15, 7, 19 };
static int widest_odd_ltd[7] = { 6, 5, 3, 5, 4, 8, 1 };
static int widest_even_ltd[7] = { 3, 4, 6, 4, 5, 1, 8 };
static int checksum_weight_ltd[28] = { /* Table 7 */
1, 3, 9, 27, 81, 65, 17, 51, 64, 14, 42, 37, 22, 66,
20, 60, 2, 6, 18, 54, 73, 41, 34, 13, 39, 28, 84, 74
};
static int finder_pattern_ltd[1232] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 2, 1, 1,
1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 3, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, 1,
1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 3, 2, 1, 1,
1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 3, 1, 1, 1,
1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 3, 1, 1, 1,
1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 1, 1, 1,
1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1,
1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1,
1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1,
1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 3, 1, 1, 1,
1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1,
1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1,
1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1,
1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1,
1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 3, 1, 1, 1,
1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1,
1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 3, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 1,
1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 2, 1, 1, 1,
1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1,
1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 1, 1, 1,
1, 1, 1, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 1,
1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 2, 1, 1, 1,
1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 2, 1, 1,
1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1,
1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 2, 1, 1, 1,
1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1,
1, 1, 1, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1,
1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 1, 1,
1, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1,
1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 1,
1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1,
1, 2, 1, 2, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1,
1, 3, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 2, 1, 1,
1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 2, 1, 1,
1, 1, 1, 2, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1,
1, 2, 1, 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1,
1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 3, 1, 1,
1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 1, 1,
1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 2, 1, 1, 1,
1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1,
1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1,
1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1,
1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1,
1, 1, 1, 2, 1, 2, 2, 1, 1, 1, 2, 1, 1, 1,
1, 1, 1, 3, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1,
1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1,
1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1,
1, 2, 1, 2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1,
1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 3, 1, 1,
1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1,
1, 1, 1, 1, 2, 1, 1, 1, 1, 3, 2, 1, 1, 1,
1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 1,
1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 1,
1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1,
1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1,
1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1,
1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1,
1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 1, 1, 1,
1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1,
1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1,
1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1,
1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1,
1, 1, 2, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1,
1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1,
1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 2, 1, 1, 1,
1, 1, 2, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, 1,
1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, 1,
1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 1,
1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1,
2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1,
2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1,
2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1,
2, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 1, 1, 1,
2, 1, 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, 1,
2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 1,
2, 1, 1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, 1,
2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1
};
/* RSS Expanded Tables */
static int g_sum_exp[5] = { 0, 348, 1388, 2948, 3988 };
static int t_even_exp[5] = { 4, 20, 52, 104, 204 };
static int modules_odd_exp[5] = { 12, 10, 8, 6, 4 };
static int modules_even_exp[5] = { 5, 7, 9, 11, 13 };
static int widest_odd_exp[5] = { 7, 5, 4, 3, 1 };
static int widest_even_exp[5] = { 2, 4, 5, 6, 8 };
static int checksum_weight_exp[184] = { /* Table 14 */
1, 3, 9, 27, 81, 32, 96, 77,
20, 60, 180, 118, 143, 7, 21, 63,
189, 145, 13, 39, 117, 140, 209, 205,
193, 157, 49, 147, 19, 57, 171, 91,
62, 186, 136, 197, 169, 85, 44, 132,
185, 133, 188, 142, 4, 12, 36, 108,
113, 128, 173, 97, 80, 29, 87, 50,
150, 28, 84, 41, 123, 158, 52, 156,
46, 138, 203, 187, 139, 206, 196, 166,
76, 17, 51, 153, 37, 111, 122, 155,
43, 129, 176, 106, 107, 110, 119, 146,
16, 48, 144, 10, 30, 90, 59, 177,
109, 166, 137, 200, 178, 112, 125, 164,
70, 210, 208, 202, 184, 130, 179, 115,
134, 191, 151, 31, 93, 68, 204, 190,
148, 22, 66, 198, 172, 94, 71, 2,
6, 18, 54, 162, 64, 192, 154, 40,
120, 149, 25, 75, 14, 42, 126, 167,
79, 26, 78, 23, 69, 207, 199, 175,
103, 98, 83, 38, 114, 131, 182, 124,
161, 61, 183, 127, 170, 88, 53, 159,
55, 165, 73, 8, 24, 72, 5, 15,
45, 135, 194, 160, 58, 174, 100, 89
};
static int finder_pattern_exp[60] = { /* Table 15 */
1, 8, 4, 1, 1,
1, 1, 4, 8, 1,
3, 6, 4, 1, 1,
1, 1, 4, 6, 3,
3, 4, 6, 1, 1,
1, 1, 6, 4, 3,
3, 2, 8, 1, 1,
1, 1, 8, 2, 3,
2, 6, 5, 1, 1,
1, 1, 5, 6, 2,
2, 2, 9, 1, 1,
1, 1, 9, 2, 2
};
static int finder_sequence[198] = { /* Table 16 */
1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 4, 3, 0, 0, 0, 0, 0, 0, 0, 0,
1, 6, 3, 8, 0, 0, 0, 0, 0, 0, 0,
1, 10, 3, 8, 5, 0, 0, 0, 0, 0, 0,
1, 10, 3, 8, 7, 12, 0, 0, 0, 0, 0,
1, 10, 3, 8, 9, 12, 11, 0, 0, 0, 0,
1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0,
1, 2, 3, 4, 5, 6, 7, 10, 9, 0, 0,
1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 0,
1, 2, 3, 4, 5, 8, 7, 10, 9, 12, 11
};
static int weight_rows[210] = {
0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 5, 6, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 9, 10, 3, 4, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 17, 18, 3, 4, 13, 14, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 17, 18, 3, 4, 13, 14, 11, 12, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 17, 18, 3, 4, 13, 14, 15, 16, 21, 22, 19, 20, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 0, 0, 0, 0, 0,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 17, 18, 15, 16, 0, 0, 0, 0,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 17, 18, 19, 20, 21, 22, 0, 0,
0, 1, 2, 3, 4, 5, 6, 7, 8, 13, 14, 11, 12, 17, 18, 15, 16, 21, 22, 19, 20
};

155
backend/telepen.c Normal file
View File

@ -0,0 +1,155 @@
/* telepen.c - Handles Telepen and Telepen numeric */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
static char *TeleTable[128] = { "1111111111111111", "1131313111", "33313111", "1111313131",
"3111313111", "11333131", "13133131", "111111313111", "31333111", "1131113131", "33113131",
"1111333111", "3111113131", "1113133111", "1311133111", "111111113131", "3131113111",
"11313331", "333331", "111131113111", "31113331", "1133113111", "1313113111", "1111113331",
"31131331", "113111113111", "3311113111", "1111131331", "311111113111", "1113111331",
"1311111331", "11111111113111", "31313311", "1131311131", "33311131", "1111313311",
"3111311131", "11333311", "13133311", "111111311131", "31331131", "1131113311", "33113311",
"1111331131", "3111113311", "1113131131", "1311131131", "111111113311", "3131111131",
"1131131311", "33131311", "111131111131", "3111131311", "1133111131", "1313111131",
"111111131311", "3113111311", "113111111131", "3311111131", "111113111311", "311111111131",
"111311111311", "131111111311", "11111111111131", "3131311111", "11313133", "333133",
"111131311111", "31113133", "1133311111", "1313311111", "1111113133", "313333",
"113111311111", "3311311111", "11113333", "311111311111", "11131333", "13111333",
"11111111311111", "31311133", "1131331111", "33331111", "1111311133", "3111331111",
"11331133", "13131133", "111111331111", "3113131111", "1131111133", "33111133",
"111113131111", "3111111133", "111311131111", "131111131111", "111111111133", "31311313",
"113131111111", "3331111111", "1111311313", "311131111111", "11331313", "13131313",
"11111131111111", "3133111111", "1131111313", "33111313", "111133111111", "3111111313",
"111313111111", "131113111111", "111111111313", "313111111111", "1131131113", "33131113",
"11113111111111", "3111131113", "113311111111", "131311111111", "111111131113", "3113111113",
"11311111111111", "331111111111", "111113111113", "31111111111111", "111311111113",
"131111111113"};
int telepen(struct zint_symbol *symbol, unsigned char source[])
{
unsigned int i, count, check_digit;
int ascii_value;
int errno;
char dest[1000];
errno = 0;
strcpy(dest, "");
count = 0;
if(strlen(source) > 30) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
for(i = 0; i < strlen(source); i++) {
if(source[i] > 127) {
/* Cannot encode extended ASCII */
strcpy(symbol->errtxt, "error: invalid characters in input data");
return ERROR_INVALID_DATA;
}
}
/* Start character */
concat(dest, TeleTable['_']);
for (i=0; i < strlen(source); i++)
{
ascii_value = source[i];
concat(dest, TeleTable[ascii_value]);
count += source[i];
}
check_digit = 127 - (count % 127);
concat(dest, TeleTable[check_digit]);
/* Stop character */
concat(dest, TeleTable['z']);
expand(symbol, dest);
strcpy(symbol->text, source);
return errno;
}
int telepen_num(struct zint_symbol *symbol, unsigned char source[])
{
unsigned int i, count, check_digit, glyph;
int errno;
char dest[1000];
errno = 0;
strcpy(dest, "");
count = 0;
if(strlen(source) > 60) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
errno = is_sane(NESET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
/* Add a leading zero if required */
if ((strlen(source)%2) != 0)
{
unsigned int length;
char temp[200];
length = strlen(source);
strcpy(temp, source);
source[0] = '0';
for(i = 0; i <= length; i++)
{
source[i + 1] = temp[i];
}
}
/* Start character */
concat(dest, TeleTable['_']);
for (i=0; i < strlen(source); i+=2)
{
glyph = (10 * ctoi(source[i])) + ctoi(source[i + 1]);
glyph += 27;
concat(dest, TeleTable[glyph]);
count += glyph;
}
check_digit = 127 - (count % 127);
concat(dest, TeleTable[check_digit]);
/* Stop character */
concat(dest, TeleTable['z']);
expand(symbol, dest);
strcpy(symbol->text, source);
return errno;
}

691
backend/upcean.c Normal file
View File

@ -0,0 +1,691 @@
/* upcean.c - Handles UPC, EAN and ISBN
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#define NASET "0123456789+"
#define EAN2 102
#define EAN5 105
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "common.h"
/* UPC and EAN tables checked against EN 797:1996 */
static char *UPCParity0[10] = {"BBBAAA", "BBABAA", "BBAABA", "BBAAAB", "BABBAA", "BAABBA", "BAAABB",
"BABABA", "BABAAB", "BAABAB"}; /* Number set for UPC-E symbol (EN Table 4) */
static char *UPCParity1[10] = {"AAABBB", "AABABB", "AABBAB", "AABBBA", "ABAABB", "ABBAAB", "ABBBAA",
"ABABAB", "ABABBA", "ABBABA"}; /* Not covered by BS EN 797:1995 */
static char *EAN2Parity[4] = {"AA", "AB", "BA", "BB"}; /* Number sets for 2-digit add-on (EN Table 6) */
static char *EAN5Parity[10] = {"BBAAA", "BABAA", "BAABA", "BAAAB", "ABBAA", "AABBA", "AAABB", "ABABA",
"ABAAB", "AABAB"}; /* Number set for 5-digit add-on (EN Table 7) */
static char *EAN13Parity[10] = {"AAAAA", "ABABB", "ABBAB", "ABBBA", "BAABB", "BBAAB", "BBBAA", "BABAB",
"BABBA", "BBABA"}; /* Left hand of the EAN-13 symbol (EN Table 3) */
static char *EANsetA[10] = {"3211", "2221", "2122", "1411", "1132", "1231", "1114", "1312", "1213",
"3112"}; /* Representation set A and C (EN Table 1) */
static char *EANsetB[10] = {"1123", "1222", "2212", "1141", "2311", "1321", "4111", "2131", "3121",
"2113"}; /* Representation set B (EN Table 1) */
char upc_check(unsigned char source[])
{ /* Calculate the correct check digit for a UPC barcode */
unsigned int i, count, check_digit;
count = 0;
for (i = 0; i < strlen(source); i++)
{
count += ctoi(source[i]);
if ((i%2) == 0)
{
count += 2 * (ctoi(source[i]));
}
}
check_digit = 10 - (count%10);
if (check_digit == 10) { check_digit = 0; }
return itoc(check_digit);
}
void upca_draw(unsigned char source[], char dest[])
{ /* UPC A is usually used for 12 digit numbers, but this function takes a source of any length */
unsigned int i, half_way;
half_way = strlen(source) / 2;
/* start character */
concat (dest, "111");
for(i = 0; i <= strlen(source); i++)
{
if (i == half_way)
{
/* middle character - separates manufacturer no. from product no. */
/* also inverts right hand characters */
concat(dest, "11111");
}
lookup(NESET, EANsetA, source[i], dest);
}
/* stop character */
concat (dest, "111");
}
void upca(struct zint_symbol *symbol, unsigned char source[], char dest[])
{ /* Make a UPC A barcode when we haven't been given the check digit */
int length;
length = strlen(source);
source[length] = upc_check(source);
source[length + 1] = '\0';
upca_draw(source, dest);
strcpy(symbol->text, source);
}
void upce(struct zint_symbol *symbol, unsigned char source[], char dest[])
{ /* UPC E is a zero-compressed version of UPC A */
unsigned int i, num_system;
char emode, equivalent[12], check_digit, parity[8], temp[8];
char hrt[8];
/* Two number systems can be used - system 0 and system 1 */
if(strlen(source) == 7) {
switch(source[0]) {
case '0': num_system = 0; break;
case '1': num_system = 1; break;
default: num_system = 0; source[0] = '0'; break;
}
strcpy(temp, source);
strcpy(hrt, source);
for(i = 1; i <= 7; i++) {
source[i - 1] = temp[i];
}
}
else {
num_system = 0;
hrt[0] = '0';
hrt[1] = '\0';
concat(hrt, source);
}
/* Expand the zero-compressed UPCE code to make a UPCA equivalent (EN Table 5) */
emode = source[5];
for(i = 0; i < 11; i++) {
equivalent[i] = '0';
}
equivalent[1] = source[0];
equivalent[2] = source[1];
equivalent[11] = '\0';
switch(emode)
{
case '0':
case '1':
case '2':
equivalent[3] = emode;
equivalent[8] = source[2];
equivalent[9] = source[3];
equivalent[10] = source[4];
break;
case '3':
equivalent[3] = source[2];
equivalent[9] = source[3];
equivalent[10] = source[4];
if(((source[2] == '0') || (source[2] == '1')) || (source[2] == '2')) {
/* Note 1 - "X3 shall not be equal to 0, 1 or 2" */
strcpy(symbol->errtxt, "warning: invalid UPC-E data");
}
break;
case '4':
equivalent[3] = source[2];
equivalent[4] = source[3];
equivalent[10] = source[4];
if(source[3] == '0') {
/* Note 2 - "X4 shall not be equal to 0" */
strcpy(symbol->errtxt, "warning: invalid UPC-E data");
}
break;
case '5':
case '6':
case '7':
case '8':
case '9':
equivalent[3] = source[2];
equivalent[4] = source[3];
equivalent[5] = source[4];
equivalent[10] = emode;
if(source[4] == '0') {
/* Note 3 - "X5 shall not be equal to 0" */
strcpy(symbol->errtxt, "warning: invalid UPC-E data");
}
break;
}
/* Get the check digit from the expanded UPCA code */
check_digit = upc_check(equivalent);
/* Use the number system and check digit information to choose a parity scheme */
if(num_system == 1) {
strcpy(parity, UPCParity1[ctoi(check_digit)]);
} else {
strcpy(parity, UPCParity0[ctoi(check_digit)]);
}
/* Take all this information and make the barcode pattern */
/* start character */
concat (dest, "111");
for(i = 0; i <= strlen(source); i++) {
switch(parity[i]) {
case 'A': lookup(NESET, EANsetA, source[i], dest); break;
case 'B': lookup(NESET, EANsetB, source[i], dest); break;
}
}
/* stop character */
concat (dest, "111111");
hrt[7] = check_digit;
hrt[8] = '\0';
strcpy(symbol->text, hrt);
}
void add_on(unsigned char source[], char dest[], int mode)
{ /* EAN-2 and EAN-5 add-on codes */
char parity[6];
unsigned int i, code_type;
/* If an add-on then append with space */
if (mode != 0)
{
concat(dest, "9");
}
/* Start character */
concat (dest, "112");
/* Determine EAN2 or EAN5 add-on */
if(strlen(source) == 2)
{
code_type = EAN2;
}
else
{
code_type = EAN5;
}
/* Calculate parity for EAN2 */
if(code_type == EAN2)
{
int code_value, parity_bit;
code_value = (10 * ctoi(source[0])) + ctoi(source[1]);
parity_bit = code_value%4;
strcpy(parity, EAN2Parity[parity_bit]);
}
if(code_type == EAN5)
{
int values[6], parity_sum, parity_bit;
for(i = 0; i < 6; i++)
{
values[i] = ctoi(source[i]);
}
parity_sum = (3 * (values[0] + values[2] + values[4]));
parity_sum += (9 * (values[1] + values[3]));
parity_bit = parity_sum%10;
strcpy(parity, EAN5Parity[parity_bit]);
}
for(i = 0; i < strlen(source); i++)
{
switch(parity[i]) {
case 'A': lookup(NESET, EANsetA, source[i], dest); break;
case 'B': lookup(NESET, EANsetB, source[i], dest); break;
}
/* Glyph separator */
if(i != (strlen(source) - 1))
{
concat (dest, "11");
}
}
}
/* ************************ EAN-13 ****************** */
char ean_check(unsigned char source[])
{ /* Calculate the correct check digit for a EAN-13 barcode */
int i;
unsigned int h, count, check_digit;
count = 0;
h = strlen(source);
for (i = h - 1; i >= 0; i--)
{
count += ctoi(source[i]);
if (!((i%2) == 0))
{
count += 2 * ctoi(source[i]);
}
}
check_digit = 10 - (count%10);
if (check_digit == 10) { check_digit = 0; }
return itoc(check_digit);
}
void ean13(struct zint_symbol *symbol, unsigned char source[], char dest[])
{
unsigned int length, i, half_way;
char parity[6];
strcpy(parity, "");
/* Add the appropriate check digit */
length = strlen(source);
source[length] = ean_check(source);
source[length + 1] = '\0';
/* Get parity for first half of the symbol */
lookup(NASET, EAN13Parity, source[0], parity);
/* Now get on with the cipher */
half_way = 7;
/* start character */
concat (dest, "111");
for(i = 1; i <= strlen(source); i++)
{
if (i == half_way)
{
/* middle character - separates manufacturer no. from product no. */
/* also inverses right hand characters */
concat (dest, "11111");
}
if(((i > 1) && (i < 7)) && (parity[i - 2] == 'B'))
{
lookup(NESET, EANsetB, source[i], dest);
}
else
{
lookup(NESET, EANsetA, source[i], dest);
}
}
/* stop character */
concat (dest, "111");
strcpy(symbol->text, source);
}
void ean8(struct zint_symbol *symbol, unsigned char source[], char dest[])
{ /* Make an EAN-8 barcode when we haven't been given the check digit */
/* EAN-8 is basically the same as UPC-A but with fewer digits */
int length;
length = strlen(source);
source[length] = upc_check(source);
source[length + 1] = '\0';
upca_draw(source, dest);
strcpy(symbol->text, source);
}
char isbn13_check(unsigned char source[]) /* For ISBN(13) only */
{
unsigned int i, weight, sum, check;
sum = 0;
weight = 1;
for(i = 0; i < (strlen(source) - 1); i++)
{
sum += ctoi(source[i]) * weight;
if(weight == 1) weight = 3; else weight = 1;
}
check = sum % 10;
check = 10 - check;
return itoc(check);
}
char isbn_check(unsigned char source[]) /* For ISBN(10) and SBN only */
{
unsigned int i, weight, sum, check;
sum = 0;
weight = 1;
for(i = 0; i < (strlen(source) - 1); i++)
{
sum += ctoi(source[i]) * weight;
weight++;
}
check = sum % 11;
return itoc(check);
}
int isbn(struct zint_symbol *symbol, unsigned char source[], char dest[]) /* Make an EAN-13 barcode from an SBN or ISBN */
{
int i, errno;
char check_digit;
errno = 0;
to_upper(source);
errno = is_sane("0123456789X", source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in input");
return errno;
}
/* Input must be 9, 10 or 13 characters */
if(((strlen(source) < 9) || (strlen(source) > 13)) || ((strlen(source) > 10) && (strlen(source) < 13)))
{
strcpy(symbol->errtxt, "error: input wrong length");
return ERROR_TOO_LONG;
}
if(strlen(source) == 13) /* Using 13 character ISBN */
{
if(!(((source[0] == '9') && (source[1] == '7')) &&
((source[2] == '8') || (source[2] == '9'))))
{
strcpy(symbol->errtxt, "error: invalid ISBN");
return ERROR_INVALID_DATA;
}
check_digit = isbn13_check(source);
if (source[strlen(source) - 1] != check_digit)
{
strcpy(symbol->errtxt, "error: incorrect ISBN check");
return ERROR_INVALID_CHECK;
}
source[12] = '\0';
ean13(symbol, source, dest);
}
if(strlen(source) == 10) /* Using 10 digit ISBN */
{
check_digit = isbn_check(source);
if(check_digit != source[strlen(source) - 1])
{
strcpy(symbol->errtxt, "error: incorrect ISBN check");
return ERROR_INVALID_CHECK;
}
for(i = 13; i > 0; i--)
{
source[i] = source[i - 3];
}
source[0] = '9';
source[1] = '7';
source[2] = '8';
source[12] = '\0';
ean13(symbol, source, dest);
}
if(strlen(source) == 9) /* Using 9 digit SBN */
{
/* Add leading zero */
for(i = 10; i > 0; i--)
{
source[i] = source[i - 1];
}
source[0] = '0';
/* Verify check digit */
check_digit = isbn_check(source);
if(check_digit != source[strlen(source) - 1])
{
strcpy(symbol->errtxt, "error: incorrect SBN check");
return ERROR_INVALID_CHECK;
}
/* Convert to EAN-13 number */
for(i = 13; i > 0; i--)
{
source[i] = source[i - 3];
}
source[0] = '9';
source[1] = '7';
source[2] = '8';
source[12] = '\0';
ean13(symbol, source, dest);
}
return errno;
}
int eanx(struct zint_symbol *symbol, unsigned char source[])
{
/* splits string to parts before and after '+' parts */
char first_part[20], second_part[20], dest[1000];
unsigned int latch, reader, writer, with_addon;
strcpy(first_part, "");
strcpy(second_part, "");
int errno, i;
errno = 0;
strcpy(dest, "");
with_addon = FALSE;
latch = FALSE;
writer = 0;
if(strlen(source) > 19) {
strcpy(symbol->errtxt, "error: input too long");
return ERROR_TOO_LONG;
}
if(symbol->symbology != BARCODE_ISBNX) {
/* ISBN has it's own checking routine */
errno = is_sane(NASET, source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "error: invalid characters in data");
return errno;
}
}
for(reader = 0; reader <= strlen(source); reader++)
{
if(source[reader] == '+') { with_addon = TRUE; }
}
reader = 0;
if(with_addon) {
do {
if(source[reader] == '+') {
first_part[writer] = '\0';
latch = TRUE;
reader++;
writer = 0;
}
if(latch) {
second_part[writer] = source[reader];
reader++;
writer++;
} else {
first_part[writer] = source[reader];
reader++;
writer++;
}
} while (reader <= strlen(source));
} else {
strcpy(first_part, source);
}
switch(symbol->symbology)
{
case BARCODE_EANX:
switch(strlen(first_part))
{
case 2: add_on(first_part, dest, 0); strcpy(symbol->text, first_part); break;
case 5: add_on(first_part, dest, 0); strcpy(symbol->text, first_part); break;
case 7: ean8(symbol, first_part, dest); break;
case 12: ean13(symbol, first_part, dest); break;
default: strcpy(symbol->errtxt, "error: invalid length input"); return ERROR_TOO_LONG; break;
}
break;
case BARCODE_EANX_CC:
switch(strlen(first_part))
{ /* Adds vertical separator bars according to ISO/IEC 24723 section 11.4 */
case 7: symbol->encoded_data[symbol->rows][1] = '1';
symbol->encoded_data[symbol->rows][67] = '1';
symbol->encoded_data[symbol->rows + 1][0] = '1';
symbol->encoded_data[symbol->rows + 1][68] = '1';
symbol->encoded_data[symbol->rows + 2][1] = '1';
symbol->encoded_data[symbol->rows + 2][67] = '1';
symbol->row_height[symbol->rows] = 2;
symbol->row_height[symbol->rows + 1] = 2;
symbol->row_height[symbol->rows + 2] = 2;
symbol->rows += 3;
ean8(symbol, first_part, dest); break;
case 12:symbol->encoded_data[symbol->rows][1] = '1';
symbol->encoded_data[symbol->rows][95] = '1';
symbol->encoded_data[symbol->rows + 1][0] = '1';
symbol->encoded_data[symbol->rows + 1][96] = '1';
symbol->encoded_data[symbol->rows + 2][1] = '1';
symbol->encoded_data[symbol->rows + 2][95] = '1';
symbol->row_height[symbol->rows] = 2;
symbol->row_height[symbol->rows + 1] = 2;
symbol->row_height[symbol->rows + 2] = 2;
symbol->rows += 3;
ean13(symbol, first_part, dest); break;
default: strcpy(symbol->errtxt, "error: invalid length EAN input"); return ERROR_TOO_LONG; break;
}
break;
case BARCODE_UPCA:
if(strlen(first_part) == 11) {
upca(symbol, first_part, dest);
} else {
strcpy(symbol->errtxt, "error: input wrong length");
return ERROR_TOO_LONG;
}
break;
case BARCODE_UPCA_CC:
if(strlen(first_part) == 11) {
symbol->encoded_data[symbol->rows][1] = '1';
symbol->encoded_data[symbol->rows][95] = '1';
symbol->encoded_data[symbol->rows + 1][0] = '1';
symbol->encoded_data[symbol->rows + 1][96] = '1';
symbol->encoded_data[symbol->rows + 2][1] = '1';
symbol->encoded_data[symbol->rows + 2][95] = '1';
symbol->row_height[symbol->rows] = 2;
symbol->row_height[symbol->rows + 1] = 2;
symbol->row_height[symbol->rows + 2] = 2;
symbol->rows += 3;
upca(symbol, first_part, dest);
} else {
strcpy(symbol->errtxt, "error: UPCA input wrong length");
return ERROR_TOO_LONG;
}
break;
case BARCODE_UPCE:
if((strlen(first_part) >= 6) && (strlen(first_part) <= 7)) {
upce(symbol, first_part, dest);
} else {
strcpy(symbol->errtxt, "error: input wrong length");
return ERROR_TOO_LONG;
}
break;
case BARCODE_UPCE_CC:
if((strlen(first_part) >= 6) && (strlen(first_part) <= 7)) {
symbol->encoded_data[symbol->rows][1] = '1';
symbol->encoded_data[symbol->rows][51] = '1';
symbol->encoded_data[symbol->rows + 1][0] = '1';
symbol->encoded_data[symbol->rows + 1][52] = '1';
symbol->encoded_data[symbol->rows + 2][1] = '1';
symbol->encoded_data[symbol->rows + 2][51] = '1';
symbol->row_height[symbol->rows] = 2;
symbol->row_height[symbol->rows + 1] = 2;
symbol->row_height[symbol->rows + 2] = 2;
symbol->rows += 3;
upce(symbol, first_part, dest);
} else {
strcpy(symbol->errtxt, "error: UPCE input wrong length");
return ERROR_TOO_LONG;
}
break;
case BARCODE_ISBNX:
errno = isbn(symbol, first_part, dest);
if(errno > 4) {
return errno;
}
break;
}
switch(strlen(second_part))
{
case 0: break;
case 2:
add_on(second_part, dest, 1);
concat(symbol->text, "+");
concat(symbol->text, second_part);
break;
case 5:
add_on(second_part, dest, 1);
concat(symbol->text, "+");
concat(symbol->text, second_part);
break;
default:
strcpy(symbol->errtxt, "error: invalid length input");
return ERROR_TOO_LONG;
break;
}
expand(symbol, dest);
switch(symbol->symbology) {
case BARCODE_EANX_CC:
case BARCODE_UPCA_CC:
case BARCODE_UPCE_CC:
/* shift the symbol to the right one space to allow for separator bars */
for(i = (symbol->width + 1); i >= 1; i--) {
symbol->encoded_data[symbol->rows - 1][i] = symbol->encoded_data[symbol->rows - 1][i - 1];
}
symbol->encoded_data[symbol->rows - 1][0] = '0';
symbol->width += 2;
break;
}
if((symbol->errtxt[0] == 'w') && (errno == 0)) {
errno = 1; /* flag UPC-E warnings */
}
return errno;
}

133
backend/zint.h Normal file
View File

@ -0,0 +1,133 @@
/* zint.h - definitions for libzint
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#define VERSION "1.6.0"
struct zint_symbol {
int symbology;
int height;
int whitespace_width;
int border_width;
int output_options;
char fgcolour[10];
char bgcolour[10];
char outfile[256];
int option_1;
int option_2;
char text[100];
int rows;
int width;
char primary[100];
char encoded_data[155][1000];
int row_height[155];
char errtxt[100];
};
#define BARCODE_CODE11 1
#define BARCODE_C25MATRIX 2
#define BARCODE_C25INTER 3
#define BARCODE_C25IATA 4
#define BARCODE_C25LOGIC 6
#define BARCODE_C25IND 7
#define BARCODE_CODE39 8
#define BARCODE_EXCODE39 9
#define BARCODE_EANX 13
#define BARCODE_EAN128 16
#define BARCODE_CODABAR 18
#define BARCODE_CODE128 20
#define BARCODE_DPLEIT 21
#define BARCODE_DPIDENT 22
#define BARCODE_CODE16K 23
#define BARCODE_CODE93 25
#define BARCODE_FLAT 28
#define BARCODE_RSS14 29
#define BARCODE_RSS_LTD 30
#define BARCODE_RSS_EXP 31
#define BARCODE_TELEPEN 32
#define BARCODE_UPCA 34
#define BARCODE_UPCE 37
#define BARCODE_POSTNET 40
#define BARCODE_MSI_PLESSEY 47
#define BARCODE_FIM 49
#define BARCODE_LOGMARS 50
#define BARCODE_PHARMA 51
#define BARCODE_PZN 52
#define BARCODE_PHARMA_TWO 53
#define BARCODE_PDF417 55
#define BARCODE_PDF417TRUNC 56
#define BARCODE_MAXICODE 57
#define BARCODE_QRCODE 58
#define BARCODE_CODE128B 60
#define BARCODE_AUSPOST 63
#define BARCODE_AUSREPLY 66
#define BARCODE_AUSROUTE 67
#define BARCODE_AUSREDIRECT 68
#define BARCODE_ISBNX 69
#define BARCODE_RM4SCC 70
#define BARCODE_DATAMATRIX 71
#define BARCODE_ITF14 72
#define BARCODE_NVE18 75
#define BARCODE_KOREAPOST 77
#define BARCODE_RSS14STACK 79
#define BARCODE_RSS14STACK_OMNI 80
#define BARCODE_RSS_EXPSTACK 81
#define BARCODE_PLANET 82
#define BARCODE_MICROPDF417 84
#define BARCODE_ONECODE 85
#define BARCODE_PLESSEY 86
#define BARCODE_TELEPEN_NUM 100
#define BARCODE_MSI_10 101
#define BARCODE_MSI_10_10 102
#define BARCODE_MSI_11 103
#define BARCODE_MSI_11_10 104
#define BARCODE_CODE39_43 105
#define BARCODE_EXCODE39_43 106
#define BARCODE_AZTEC 107
#define BARCODE_SUPER 108
#define BARCODE_ULTRA 109
#define BARCODE_EANX_CC 110
#define BARCODE_EAN128_CC 111
#define BARCODE_RSS14_CC 112
#define BARCODE_RSS_LTD_CC 113
#define BARCODE_RSS_EXP_CC 114
#define BARCODE_UPCA_CC 115
#define BARCODE_UPCE_CC 116
#define BARCODE_RSS14STACK_CC 117
#define BARCODE_RSS14_OMNI_CC 118
#define BARCODE_RSS_EXPSTACK_CC 119
#define BARCODE_NO_ASCII 1
#define BARCODE_BIND 2
#define BARCODE_BOX 4
#define WARN_INVALID_OPTION 2
#define ERROR_TOO_LONG 5
#define ERROR_INVALID_DATA 6
#define ERROR_INVALID_CHECK 7
#define ERROR_INVALID_OPTION 8
#define ERROR_ENCODING_PROBLEM 9
#define ERROR_FILE_ACCESS 10
#define ERROR_MEMORY 11
extern struct zint_symbol *ZBarcode_Create();
extern int ZBarcode_Delete(struct zint_symbol *symbol);
extern int ZBarcode_Encode(struct zint_symbol *symbol, unsigned char *input);
extern int ZBarcode_Print(struct zint_symbol *symbol);
extern int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input);

1125
docs/appxa.html Normal file

File diff suppressed because it is too large Load Diff

316
docs/appxb.html Normal file
View File

@ -0,0 +1,316 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
<TITLE>Three Digit Country Codes</TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 2.0 (Linux)">
<META NAME="CREATED" CONTENT="20070730;21081900">
<META NAME="CHANGED" CONTENT="20070829;23503500">
<STYLE TYPE="text/css">
<!--
TD P { color: #000000 }
H1 { color: #000000 }
P { color: #000000 }
TH P { color: #000000 }
A:link { color: #0000ff }
A:visited { color: #840084 }
-->
</STYLE>
</HEAD>
<BODY LANG="en-GB" TEXT="#000000" LINK="#0000ff" VLINK="#840084" BGCOLOR="#ffffff" DIR="LTR">
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0 STYLE="page-break-before: always">
<TR>
<TH COLSPAN=3>
<P ALIGN=CENTER>Zint Barcode Generator</P>
</TH>
</TR>
<TR VALIGN=BOTTOM>
<TD WIDTH=10%>
<P ALIGN=LEFT><A HREF="appxa.html">Prev</A></P>
</TD>
<TD WIDTH=80%></TD>
<TD WIDTH=10%>
<P ALIGN=RIGHT><A HREF="appxc.html">Next</A></P>
</TD>
</TR>
</TABLE>
<HR>
<H1>B. Three Digit Country Codes (ISO 3166)</H1>
<P>Below are some of the three digit country codes as determined by
ISO 3166 for use with Maxicode symbols.</P>
<PRE>
AFGHANISTAN 004
ALAND ISLANDS 248
ALBANIA 008
ALGERIA 012
AMERICAN SAMOA 016
ANDORRA 020
ANGOLA 024
ANGUILLA 660
ANTARCTICA 010
ANTIGUA AND BARBUDA 028
ARGENTINA 032
ARMENIA 051
ARUBA 533
AUSTRALIA 036
AUSTRIA 040
AZERBAIJAN 031
BAHAMAS 044
BAHRAIN 048
BANGLADESH 050
BARBADOS 052
BELARUS 112
BELGIUM 056
BELIZE 084
BENIN 204
BERMUDA 060
BHUTAN 064
BOLIVIA 068
BOSNIA AND HERZEGOVINA 070
BOTSWANA 072
BOUVET ISLAND 074
BRAZIL 076
BRITISH INDIAN OCEAN TERRITORY 086
BRUNEI DARUSSALAM 096
BULGARIA 100
BURKINA FASO 854
BURUNDI 108
CAMBODIA 116
CAMEROON 120
CANADA 124
CAPE VERDE 132
CAYMAN ISLANDS 136
CENTRAL AFRICAN REPUBLIC 140
CHAD 148
CHILE 152
CHINA 156
CHRISTMAS ISLAND 162
COCOS (KEELING) ISLANDS 166
COLOMBIA 170
COMOROS 174
CONGO 178
CONGO, THE DEMOCRATIC REPUBLIC OF THE 180
COOK ISLANDS 184
COSTA RICA 188
COTE D'IVOIRE 384
CROATIA 191
CUBA 192
CYPRUS 196
CZECH REPUBLIC 203
DENMARK 208
DJIBOUTI 262
DOMINICA 212
DOMINICAN REPUBLIC 214
ECUADOR 218
EGYPT 818
EL SALVADOR 222
EQUATORIAL GUINEA 226
ERITREA 232
ESTONIA 233
ETHIOPIA 231
FALKLAND ISLANDS (MALVINAS) 238
FAROE ISLANDS 234
FIJI 242
FINLAND 246
FRANCE 250
FRENCH GUIANA 254
FRENCH POLYNESIA 258
FRENCH SOUTHERN TERRITORIES 260
GABON 266
GAMBIA 270
GEORGIA 268
GERMANY 276
GHANA 288
GIBRALTAR 292
GREECE 300
GREENLAND 304
GRENADA 308
GUADELOUPE 312
GUAM 316
GUATEMALA 320
GUERNSEY 831
GUINEA 324
GUINEA-BISSAU 624
GUYANA 328
HAITI 332
HEARD ISLAND AND MCDONALD ISLANDS 334
HOLY SEE (VATICAN CITY STATE) 336
HONDURAS 340
HONG KONG 344
HUNGARY 348
ICELAND 352
INDIA 356
INDONESIA 360
IRAN (ISLAMIC REPUBLIC OF) 364
IRAQ 368
IRELAND 372
ISLE OF MAN 833
ISRAEL 376
ITALY 380
JAMAICA 388
JAPAN 392
JERSEY 832
JORDAN 400
KAZAKHSTAN 398
KENYA 404
KIRIBATI 296
KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF 408
KOREA, REPUBLIC OF 410
KUWAIT 414
KYRGYZSTAN 417
LAO PEOPLE'S DEMOCRATIC REPUBLIC 418
LATVIA 428
LEBANON 422
LESOTHO 426
LIBERIA 430
LIBYAN ARAB JAMAHIRIYA 434
LIECHTENSTEIN 438
LITHUANIA 440
LUXEMBOURG 442
MACAO 446
MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF 807
MADAGASCAR 450
MALAWI 454
MALAYSIA 458
MALDIVES 462
MALI 466
MALTA 470
MARSHALL ISLANDS 584
MARTINIQUE 474
MAURITANIA 478
MAURITIUS 480
MAYOTTE 175
MEXICO 484
MICRONESIA, FEDERATED STATES OF 583
MOLDOVA, REPUBLIC OF 498
MONACO 492
MONGOLIA 496
MONTENEGRO 499
MONTSERRAT 500
MOROCCO 504
MOZAMBIQUE 508
MYANMAR 104
NAMIBIA 516
NAURU 520
NEPAL 524
NETHERLANDS 528
NETHERLANDS ANTILLES 530
NEW CALEDONIA 540
NEW ZEALAND 554
NICARAGUA 558
NIGER 562
NIGERIA 566
NIUE 570
NORFOLK ISLAND 574
NORTHERN MARIANA ISLANDS 580
NORWAY 578
OMAN 512
PAKISTAN 586
PALAU 585
PALESTINIAN TERRITORY, OCCUPIED 275
PANAMA 591
PAPUA NEW GUINEA 598
PARAGUAY 600
PERU 604
PHILIPPINES 608
PITCAIRN 612
POLAND 616
PORTUGAL 620
PUERTO RICO 630
QATAR 634
REUNION 638
ROMANIA 642
RUSSIAN FEDERATION 643
RWANDA 646
SAINT HELENA 654
SAINT KITTS AND NEVIS 659
SAINT LUCIA 662
SAINT PIERRE AND MIQUELON 666
SAINT VINCENT AND THE GRENADINES 670
SAMOA 882
SAN MARINO 674
SAO TOME AND PRINCIPE 678
SAUDI ARABIA 682
SENEGAL 686
SERBIA 688
SEYCHELLES 690
SIERRA LEONE 694
SINGAPORE 702
SLOVAKIA 703
SLOVENIA 705
SOLOMON ISLANDS 090
SOMALIA 706
SOUTH AFRICA 710
SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS 239
SPAIN 724
SRI LANKA 144
SUDAN 736
SURINAME 740
SVALBARD AND JAN MAYEN 744
ST. HELENA 654
ST. PIERRE AND MIQUELON 666
SWAZILAND 748
SWEDEN 752
SWITZERLAND 756
SYRIAN ARAB REPUBLIC 760
TAIWAN, PROVINCE OF CHINA 158
TAJIKISTAN 762
TANZANIA, UNITED REPUBLIC OF 834
THAILAND 764
TIMOR-LESTE 626
TOGO 768
TOKELAU 772
TONGA 776
TRINIDAD AND TOBAGO 780
TUNISIA 788
TURKEY 792
TURKMENISTAN 795
TURKS AND CAICOS ISLANDS 796
TUVALU 798
UGANDA 800
UKRAINE 804
UNITED ARAB EMIRATES 784
UNITED KINGDOM 826
UNITED STATES 840
UNITED STATES MINOR OUTLYING ISLANDS 581
URUGUAY 858
UZBEKISTAN 860
VANUATU 548
VATICAN CITY STATE (HOLY SEE) 336
VENEZUELA 862
VIET NAM 704
VIRGIN ISLANDS (BRITISH) 092
VIRGIN ISLANDS (U.S.) 850
WALLIS AND FUTUNA 876
WESTERN SAHARA 732
YEMEN 887
YUGOSLAVIA 891
ZAMBIA 894
ZIMBABWE 716</PRE>
<HR>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0>
<TR VALIGN=TOP>
<TD WIDTH=33% HEIGHT=5>
<P ALIGN=LEFT><A HREF="appxa.html">Prev</A></P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER><A HREF="index.html">Home</A></P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT><A HREF="appxc.html">Next</A></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=33%>
<P ALIGN=LEFT>Appendix A</P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER>&nbsp;</P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT>Appendix C</P>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>

382
docs/appxc.html Normal file
View File

@ -0,0 +1,382 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
<TITLE>GS1 General Specification</TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 2.3 (Linux)">
<META NAME="CREATED" CONTENT="20070730;21081900">
<META NAME="CHANGED" CONTENT="20080309;20283900">
<STYLE TYPE="text/css">
<!--
TD P { color: #000000 }
H1 { color: #000000 }
P { color: #000000 }
PRE { color: #000000 }
TH P { color: #000000 }
A:link { color: #0000ff }
A:visited { color: #840084 }
-->
</STYLE>
</HEAD>
<BODY LANG="en-GB" TEXT="#000000" LINK="#0000ff" VLINK="#840084" BGCOLOR="#ffffff" DIR="LTR">
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0 STYLE="page-break-before: always">
<TR>
<TH COLSPAN=3>
<P ALIGN=CENTER>Zint Barcode Generator</P>
</TH>
</TR>
<TR VALIGN=BOTTOM>
<TD WIDTH=10%>
<P ALIGN=LEFT><A HREF="appxb.html">Prev</A></P>
</TD>
<TD WIDTH=80%></TD>
<TD WIDTH=10%></TD>
</TR>
</TABLE>
<HR>
<H1>C. GS1 General Specification</H1>
<P>The GS1 General Specification defines a global standard for
encoding data about products. The full specification is available
<A HREF="http://www.gs1uk.org/EANUCC/WORD_Files/word.html">here</A>.
Data is encoded as a series of number pairs where the first number,
usually shown in (brackets) is an application identifier (AI), and
the second is a formatted representation of the data. For example
(401)6773 can be read as &quot;Consignment Number 6773&quot; where
the AI (401) signifies that the data is a consignment number. Note
that when using Zint AI data is entered using [square] brackets. This
allows rounded brackets to be included in the data which is allowed
by the specification. When the barcode symbol is generated these
square brackets are replaced by rounded brackets in the text. A list
of valid AI numbers is given below.</P>
<P><A NAME="AI"></A><FONT SIZE=4><B>C.1 Application Identifiers [1]</B></FONT></P>
<PRE>00 Serial Shipping Container Code (SSCC)
01 Global Trade Item Number (GTIN)
02 # of containers
10 Batch Number
11 Production Date
13 Packaging Date
15 Sell by Date (Quality Control)
17 Expiration Date
20 Product Variant
21 Serial Number
22 HIBCC Quantity, Date, Batch and Link
23x Lot Number
240 Additional Product Identification
250 Second Serial Number
30 Quantity Each
310y Product Net Weight in kg
311y Product Length/1st Dimension, in meters
312y Product Width/Diameter/2nd Dimension, in meters
313y Product Depth/Thickness/3rd Dimension, in meters
314y Product Area, in square meters
315y Product Volume, in liters
316y product Volume, in cubic meters
320y Product Net Weight, in pounds
321y Product Length/1st Dimension, in inches
322y Product Length/1st Dimension, in feet
323y Product Length/1st Dimension, in yards
324y Product Width/Diameter/2nd Dimension, in inches
325y Product Width/Diameter/2nd Dimension, in feet
326y Product Width/Diameter/2nd Dimension, in yards
327y Product Depth/Thickness/3rd Dimension, in inches
328y Product Depth/Thickness/3rd Dimension, in feet
329y Product Depth/Thickness/3rd Dimension, in yards
330y Container Gross Weight (kg)
331y Container Length/1st Dimension (Meters)
332y Container Width/Diameter/2nd Dimension (Meters)
333y Container Depth/Thickness/3rd Dimension (Meters)
334y Container Area (Square Meters)
335y Container Gross Volume (Liters)
336y Container Gross Volume (Cubic Meters)
340y Container Gross Weight (Pounds)
341y Container Length/1st Dimension, in inches
342y Container Length/1st Dimension, in feet
343y Container Length/1st Dimension in, in yards
344y Container Width/Diameter/2nd Dimension, in inches
345y Container Width/Diameter/2nd Dimension, in feet
346y Container Width/Diameter/2nd Dimension, in yards
347y Container Depth/Thickness/Height/3rd Dimension, in inches
348y Container Depth/Thickness/Height/3rd Dimension, in feet
349y Container Depth/Thickness/Height/3rd Dimension, in yards
350y Product Area (Square Inches)
351y Product Area (Square Feet)
352y Product Area (Square Yards)
353y Container Area (Square Inches)
354y Container Area (Square Feet)
355y Container Area (Suqare Yards)
356y Net Weight (Troy Ounces)
360y Product Volume (Quarts)
361y Product Volume (Gallons)
362y Container Gross Volume (Quarts)
363y Container Gross Volume (Gallons)
364y Product Volume (Cubic Inches)
365y Product Volume (Cubic Feet)
366y Product Volume (Cubic Yards)
367y Container Gross Volume (Cubic Inches)
368y Container Gross Volume (Cubic Feet)
369y Container Gross Volume (Cubic Yards)
37 Number of Units Contained
400 Customer Purchase Order Number
410 Ship To/Deliver To Location Code (Global Location Number)
411 Bill To/Invoice Location Code (Global Location Number)
412 Purchase From Location Code (Global Location Number)
420 Ship To/Deliver To Postal Code (Single Postal Authority)
421 Ship To/Deliver To Postal Code (Multiple Postal Authority)
8001 Roll Products - Width/Length/Core Diameter
8002 Electronic Serial Number (ESN) for Cellular Phone
8003 Global Returnable Asset Identifier
8004 Global Individual Asset Identifier
8005 Price per Unit of Measure
8100 Coupon Extended Code: Number System and Offer
8101 8101 Coupon Extended Code: Number System, Offer, End of Offer
8102 Coupon Extended Code: Number System preceded by 0
90 Mutually Agreed Between Trading Partners
91 Internal Company Codes
92 Internal Company Codes
93 Internal Company Codes
94 Internal Company Codes
95 Internal Company Codes
96 Internal Company Codes
97 Internal Company Codes
98 Internal Company Codes
99 Internal Company Codes</PRE><P>
<A NAME="FIELDS"></A><FONT SIZE=4><B>C.2 Fixed Length Fields</B></FONT></P>
<P STYLE="margin-bottom: 0cm">The GS1 Specification requires that
some of the data to be encoded fits a standard length field. Zint
requires this to be true of input data in order for data to be
encoded correctly but does not check that the input data adheres to
these rules. If this system is not followed then the resulting
barcode symbol may not be readable. The following table details which
AIs have fixed length data fields and how long the data should be for
each:</P>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<CENTER>
<TABLE WIDTH=513 BORDER=1 CELLPADDING=4 CELLSPACING=3>
<COL WIDTH=161>
<COL WIDTH=325>
<THEAD>
<TR VALIGN=TOP>
<TH WIDTH=161>
<P>Application Identifier</P>
</TH>
<TH WIDTH=325>
<P>Number of characters<BR>(AI and Data Field)</P>
</TH>
</TR>
</THEAD>
<TBODY>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>00</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>20</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>01</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>16</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>02</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>16</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>03</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>16</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>04</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>18</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>11</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>8</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>12</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>8</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>13</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>8</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>14</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>8</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>15</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>8</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>16</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>8</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>17</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>8</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>18</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>8</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>19</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>8</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>20</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>4</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>31</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>10</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>32</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>10</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>33</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>10</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>34</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>10</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>35</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>10</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>36</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>10</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=161>
<P ALIGN=CENTER>41</P>
</TD>
<TD WIDTH=325>
<P ALIGN=CENTER>16</P>
</TD>
</TR>
</TBODY>
</TABLE>
</CENTER>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<P STYLE="margin-bottom: 0cm">[1] This information taken from
<A HREF="http://en.wikipedia.org/wiki/GS1-128">Wikipedia</A> and used
under the terms of the <A HREF="http://en.wikipedia.org/wiki/Wikipedia:Text_of_the_GNU_Free_Documentation_License">GNU
Free Documentation License</A>.</P>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<HR>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0>
<TR VALIGN=TOP>
<TD WIDTH=33% HEIGHT=5>
<P ALIGN=LEFT><A HREF="appxb.html">Prev</A></P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER><A HREF="index.html">Home</A></P>
</TD>
<TD WIDTH=33%></TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=33%>
<P ALIGN=LEFT>Appendix B</P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER>&nbsp;</P>
</TD>
<TD WIDTH=33%></TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
</BODY>
</HTML>

BIN
docs/auspost.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 B

1390
docs/backend.html Normal file

File diff suppressed because it is too large Load Diff

BIN
docs/border.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 B

BIN
docs/box.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 B

BIN
docs/cca.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
docs/ccb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

BIN
docs/ccc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
docs/codabar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
docs/code11.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
docs/code128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
docs/code16k.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 B

BIN
docs/code39.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

19
docs/codesize.txt Normal file
View File

@ -0,0 +1,19 @@
0.1 97.9kB (est)
0.2 150.7kB
0.3 101.0kB
0.4 112.0kB
0.5 111.9kB
0.6 109.6kB
1.0 158.8kB
1.1 168.9kB
1.2 208.5kB
1.3 236.6kB
1.4 246.9kB
1.5 263.4kB
1.5.1a 276.2kB
1.5.1 300.2kB
1.5.2 369.4kB
1.5.3 355.3kB
1.5.4 415.3kB
1.5.5 499.9kB
1.5.6* 600.8kB

BIN
docs/compact417.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 481 B

271
docs/composite.html Normal file
View File

@ -0,0 +1,271 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
<TITLE>Composite Symbols</TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 2.3 (Linux)">
<META NAME="CREATED" CONTENT="0;0">
<META NAME="CHANGED" CONTENT="20080316;12521000">
<META NAME="ProgId" CONTENT="FrontPage.Editor.Document">
<META HTTP-EQUIV="Content-Language" CONTENT="en-gb">
<STYLE TYPE="text/css">
<!--
TD P { color: #000000 }
H1 { color: #000000 }
P { color: #000000 }
TH P { color: #000000 }
-->
</STYLE>
</HEAD>
<BODY LANG="en-GB" DIR="LTR">
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0 STYLE="page-break-before: always">
<TR>
<TH COLSPAN=3>
<P ALIGN=CENTER>Zint Barcode Generator</P>
</TH>
</TR>
<TR VALIGN=BOTTOM>
<TD WIDTH=10%>
<P ALIGN=LEFT><A HREF="stacked.html"><FONT COLOR="#0000ff">Prev</FONT></A></P>
</TD>
<TD WIDTH=80%></TD>
<TD WIDTH=10%>
<P ALIGN=RIGHT><A HREF="twotrack.html"><FONT COLOR="#0000ff">Next</FONT></A></P>
</TD>
</TR>
</TABLE>
<HR>
<H1>5.3 Composite Symbols (ISO 24723)</H1>
<P>Composite symbols employ a mixture of components to give more
comprehensive information about a product. The permissible contents
of a composite symbol is determined by the terms of the <A HREF="appxc.html">GS1
General Specification</A>. Composite symbols consist of a linear
component which can be an EAN, UPC, GS1-128 or GS1 DataBar symbol, a
2D component which is based on PDF417 or MicroPDF417, and a separator
pattern. The type of linear component to be used is determined using
the <FONT FACE="Courier">-b</FONT> or <FONT FACE="Courier">--barcode=</FONT>
switch or by adjusting <FONT FACE="Courier">symbol-&gt;symbology</FONT>
as with other encoding methods. Valid values are shown below.</P>
<CENTER>
<TABLE WIDTH=936 BORDER=1 CELLPADDING=4 CELLSPACING=3>
<COL WIDTH=105>
<COL WIDTH=254>
<COL WIDTH=540>
<TR VALIGN=TOP>
<TD WIDTH=105>
<P ALIGN=CENTER><B>Numeric Value</B></P>
</TD>
<TD WIDTH=254>
<P ALIGN=CENTER><B>Name</B></P>
</TD>
<TD WIDTH=540>
<P ALIGN=CENTER><B>Symbology</B></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=105>
<P ALIGN=CENTER>110</P>
</TD>
<TD WIDTH=254>
<P ALIGN=CENTER><FONT FACE="Courier">BARCODE_EANX_CC</FONT></P>
</TD>
<TD WIDTH=540>
<P ALIGN=CENTER>Composite Symbol with EAN linear component</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=105>
<P ALIGN=CENTER>111</P>
</TD>
<TD WIDTH=254>
<P ALIGN=CENTER><FONT FACE="Courier">BARCODE_EAN128_CC</FONT></P>
</TD>
<TD WIDTH=540>
<P ALIGN=CENTER>Composite Symbol with GS1-128 linear component</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=105>
<P ALIGN=CENTER>112</P>
</TD>
<TD WIDTH=254>
<P ALIGN=CENTER><FONT FACE="Courier">BARCODE_RSS14_CC</FONT></P>
</TD>
<TD WIDTH=540>
<P ALIGN=CENTER>Composite Symbol with GS1 DataBar-14 linear
component</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=105>
<P ALIGN=CENTER>113</P>
</TD>
<TD WIDTH=254>
<P ALIGN=CENTER><FONT FACE="Courier">BARCODE_RSS_LTD_CC</FONT></P>
</TD>
<TD WIDTH=540>
<P ALIGN=CENTER>Composite Symbol with GS1 DataBar Limited
component</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=105>
<P ALIGN=CENTER>114</P>
</TD>
<TD WIDTH=254>
<P ALIGN=CENTER><FONT FACE="Courier">BARCODE_RSS_EXP_CC</FONT></P>
</TD>
<TD WIDTH=540>
<P ALIGN=CENTER>Composite Symbol with GS1 DataBar Extended
component</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=105>
<P ALIGN=CENTER>115</P>
</TD>
<TD WIDTH=254>
<P ALIGN=CENTER><FONT FACE="Courier">BARCODE_UPCA_CC</FONT></P>
</TD>
<TD WIDTH=540>
<P ALIGN=CENTER>Composite Symbol with UPC A linear component</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=105>
<P ALIGN=CENTER>116</P>
</TD>
<TD WIDTH=254>
<P ALIGN=CENTER><FONT FACE="Courier">BARCODE_UPCE_CC</FONT></P>
</TD>
<TD WIDTH=540>
<P ALIGN=CENTER>Composite Symbol with UPC E linear component</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=105>
<P ALIGN=CENTER>117</P>
</TD>
<TD WIDTH=254>
<P ALIGN=CENTER><FONT FACE="Courier">BARCODE_RSS14STACK_CC</FONT></P>
</TD>
<TD WIDTH=540>
<P ALIGN=CENTER>Composite Symbol with GS1 DataBar-14 Stacked
component</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=105>
<P ALIGN=CENTER>118</P>
</TD>
<TD WIDTH=254>
<P ALIGN=CENTER><FONT FACE="Courier">BARCODE_RSS14_OMNI_CC</FONT></P>
</TD>
<TD WIDTH=540>
<P ALIGN=CENTER>Composite Symbol with GS1 DataBar-14 Stacked
Omnidirectional component</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=105>
<P ALIGN=CENTER>119</P>
</TD>
<TD WIDTH=254>
<P ALIGN=CENTER><FONT FACE="Courier">BARCODE_RSS_EXPSTACK_CC</FONT></P>
</TD>
<TD WIDTH=540>
<P ALIGN=CENTER>Composite Symbol with GS1 DataBar Expanded
Stacked component</P>
</TD>
</TR>
</TABLE>
</CENTER>
<P ALIGN=LEFT>The data to be encoded in the linear component of a
composite symbol should be entered into a primary string with the
data for the 2D component being entered in the normal way. To do this
at the command prompt use the <FONT FACE="Courier">--primary=</FONT>
command. For example:</P>
<P ALIGN=LEFT><FONT FACE="Courier">zint -b 110 --mode=1
--primary=331234567890 -d &quot;[99]1234-abcd&quot;</FONT></P>
<P ALIGN=LEFT>This creates an EAN-13 linear component with the data
&quot;331234567890&quot; and a 2D CC-A (see below) component with the
data &quot;(99)1234-abcd&quot;. The same results can be achieved
using the API as shown below:</P>
<P ALIGN=LEFT>&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Courier, monospace"><FONT SIZE=2>my_symbol-&gt;symbology
= 110;<BR>&nbsp;&nbsp;&nbsp;&nbsp;my_symbol-&gt;option_1 =
1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;strcpy(my_symbol-&gt;primary,
&quot;331234567890&quot;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;ZBarcode_Encode_and_Print(my_symbol,
&quot;[99]1234-abcd&quot;);</FONT></FONT></P>
<P ALIGN=LEFT>EAN-2 and EAN-5 add-on data can be used with EAN and
UPC symbols using the + symbol as described in section 5.1.3 and
5.1.4.</P>
<P ALIGN=LEFT>The 2D component of a composite symbol can use one of
three systems: CC-A, CC-B and CC-C as described below. The 2D
component type can be selected automatically by Zint dependant on the
length of the input string. Alternatively the three methods can be
accessed using the <FONT FACE="Courier">--mode= </FONT>prompt
followed by 1, 2 or 3 for CC-A, CC-B or CC-C respectively, or by
using the <FONT FACE="Courier">option_1</FONT> variable as shown
above.</P>
<P ALIGN=LEFT><FONT COLOR="#ff0000"><B>NOTE</B></FONT>: <B>2D
component data starting with a production (AI 11) or expiration (AI
17) date must be followed by a batch number (AI 10).</B> In the
absence of real data this value can be entered as &quot;0&quot;. This
is due to a known problem concerning the way the encoding is
optimised for date information. It is hoped this problem will be
resolved in a later release of Zint.</P>
<P ALIGN=LEFT>&nbsp;</P>
<P ALIGN=LEFT><A NAME="CCA"></A><FONT SIZE=5><B>5.3.1 CC-A</B></FONT></P>
<P ALIGN=LEFT>This system uses a variation of MicroPDF417 which
optimised to fit into a small space. The size of the 2D component and
the amount of error correction is determined by the amount of data to
be encoded and the type of linear component which is being used. CC-A
can encode up to 56 numeric digits or an alphanumeric string of
shorter length. To select CC-A use <FONT FACE="Courier">--mode=1</FONT>.</P>
<P ALIGN=LEFT><IMG SRC="cca.png" NAME="graphics1" ALIGN=LEFT WIDTH=223 HEIGHT=204 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P ALIGN=LEFT><A NAME="CCB"></A><FONT SIZE=5><B>5.3.2 CC-B</B></FONT></P>
<P ALIGN=LEFT>This system uses MicroPDF417 to encode the 2D
component. The size of the 2D component and the amount of error
correction is determined by the amount of data to be encoded and the
type of linear component which is being used. CC-B can encode up to
338 numeric digits or an alphanumeric string of shorter length. To
select CC-B use <FONT FACE="Courier">--mode=2</FONT>.</P>
<P ALIGN=LEFT><IMG SRC="ccb.png" NAME="graphics2" ALIGN=LEFT WIDTH=218 HEIGHT=200 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P ALIGN=LEFT><A NAME="CCC"></A><FONT SIZE=5><B>5.3.3 CC-C</B></FONT></P>
<P ALIGN=LEFT>This system uses PDF417 and can only be used in
conjunction with a GS1-128 linear component. CC-C can encode up to
2361 numeric digits or an alphanumeric string of shorter length. To
select CC-C use <FONT FACE="Courier">--mode=3</FONT>.</P>
<P ALIGN=LEFT><IMG SRC="ccc.png" NAME="graphics3" ALIGN=LEFT WIDTH=322 HEIGHT=202 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<HR>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0>
<TR VALIGN=TOP>
<TD WIDTH=33% HEIGHT=5>
<P ALIGN=LEFT><A HREF="stacked.html"><FONT COLOR="#0000ff">Prev</FONT></A></P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER><A HREF="index.html"><FONT COLOR="#0000ff">Home</FONT></A></P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT><A HREF="twotrack.html"><FONT COLOR="#0000ff">Next</FONT></A></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=33%>
<P ALIGN=LEFT>Stacked Symbologies</P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER>&nbsp;</P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT>Two-Track Symbols</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
</BODY>
</HTML>

BIN
docs/databar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
docs/dbexpand.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 B

BIN
docs/dbomni.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 391 B

BIN
docs/dbstack.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 B

BIN
docs/ean13.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
docs/fim.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 B

228
docs/fourstate.html Normal file
View File

@ -0,0 +1,228 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
<TITLE>4-State Codes</TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 2.3 (Linux)">
<META NAME="CREATED" CONTENT="20070730;21081900">
<META NAME="CHANGED" CONTENT="20080316;13072500">
<STYLE TYPE="text/css">
<!--
TD P { color: #000000 }
H1 { color: #000000 }
P { color: #000000 }
TH P { color: #000000 }
A:link { color: #0000ff }
A:visited { color: #840084 }
-->
</STYLE>
</HEAD>
<BODY LANG="en-GB" TEXT="#000000" LINK="#0000ff" VLINK="#840084" BGCOLOR="#ffffff" DIR="LTR">
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0 STYLE="page-break-before: always">
<TR>
<TH COLSPAN=3>
<P ALIGN=CENTER>Zint Barcode Generator</P>
</TH>
</TR>
<TR VALIGN=BOTTOM>
<TD WIDTH=10%>
<P ALIGN=LEFT><A HREF="twotrack.html">Prev</A></P>
</TD>
<TD WIDTH=80%></TD>
<TD WIDTH=10%>
<P ALIGN=RIGHT><A HREF="twodims.html">Next</A></P>
</TD>
</TR>
</TABLE>
<HR>
<H1>5.5 4-State Postal Codes</H1>
<P><A NAME="AUSPOST"></A><FONT SIZE=5><B>5.5.1 Australia Post 4-State
Symbols</B></FONT></P>
<P><A NAME="AUSCUST"></A><FONT SIZE=4><B>5.5.1.1 Customer Barcodes</B></FONT></P>
<P>Australia Post Standard Customer Barcode, Customer Barcode 2 and
Customer Barcode 3 are 37-bar, 52-bar and 67-bar specifications
respectively, developed by Australia Post for printing Delivery Point
ID (DPID) and customer information on mail items. Valid data
characters are 0-9, A-Z, a-z, space and hash (#). A Format Control
Code (FCC) is added by Zint and should not be included in the input
data. Reed-Solomon error correction data is generated by Zint.
Encoding behaviour is determined by the length of the input data
according to the formula shown in the following table:</P>
<CENTER>
<TABLE WIDTH=871 BORDER=1 CELLPADDING=4 CELLSPACING=3>
<COL WIDTH=110>
<COL WIDTH=322>
<COL WIDTH=175>
<COL WIDTH=89>
<COL WIDTH=115>
<THEAD>
<TR VALIGN=TOP>
<TH WIDTH=110>
<P>Input Length</P>
</TH>
<TH WIDTH=322>
<P>Required Input Format</P>
</TH>
<TH WIDTH=175>
<P>Symbol Length</P>
</TH>
<TH WIDTH=89>
<P>FCC</P>
</TH>
<TH WIDTH=115>
<P>Encoding Table</P>
</TH>
</TR>
</THEAD>
<TBODY>
<TR VALIGN=TOP>
<TD WIDTH=110>
<P ALIGN=CENTER>8</P>
</TD>
<TD WIDTH=322>
<P ALIGN=CENTER>99999999</P>
</TD>
<TD WIDTH=175>
<P ALIGN=CENTER>37-bar</P>
</TD>
<TD WIDTH=89>
<P ALIGN=CENTER>11</P>
</TD>
<TD WIDTH=115>
<P ALIGN=CENTER>None</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=110>
<P ALIGN=CENTER>13</P>
</TD>
<TD WIDTH=322>
<P ALIGN=CENTER>99999999AAAAA</P>
</TD>
<TD WIDTH=175>
<P ALIGN=CENTER>52-bar</P>
</TD>
<TD WIDTH=89>
<P ALIGN=CENTER>59</P>
</TD>
<TD WIDTH=115>
<P ALIGN=CENTER>C</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=110>
<P ALIGN=CENTER>16</P>
</TD>
<TD WIDTH=322>
<P ALIGN=CENTER>9999999999999999</P>
</TD>
<TD WIDTH=175>
<P ALIGN=CENTER>52-bar</P>
</TD>
<TD WIDTH=89>
<P ALIGN=CENTER>59</P>
</TD>
<TD WIDTH=115>
<P ALIGN=CENTER>N</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=110>
<P ALIGN=CENTER>18</P>
</TD>
<TD WIDTH=322>
<P ALIGN=CENTER>99999999AAAAAAAAAA</P>
</TD>
<TD WIDTH=175>
<P ALIGN=CENTER>67-bar</P>
</TD>
<TD WIDTH=89>
<P ALIGN=CENTER>62</P>
</TD>
<TD WIDTH=115>
<P ALIGN=CENTER>C</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=110>
<P ALIGN=CENTER>23</P>
</TD>
<TD WIDTH=322>
<P ALIGN=CENTER>99999999999999999999999</P>
</TD>
<TD WIDTH=175>
<P ALIGN=CENTER>67-bar</P>
</TD>
<TD WIDTH=89>
<P ALIGN=CENTER>62</P>
</TD>
<TD WIDTH=115>
<P ALIGN=CENTER>N</P>
</TD>
</TR>
</TBODY>
</TABLE>
</CENTER>
<P ALIGN=JUSTIFY STYLE="margin-bottom: 0cm"><BR>
</P>
<P><A NAME="AUSREPLY"></A><FONT SIZE=4><B>5.5.1.2 Reply Paid Barcode</B></FONT></P>
<P>A Reply Paid version of the Australia Post 4-State Barcode (FCC
45) which requires an 8-digit DPID input.</P>
<P><A NAME="AUSROUTE"></A><FONT SIZE=4><B>5.5.1.3 Routing Barcode</B></FONT></P>
<P>A Routing version of the Australia Post 4-State Barcode (FCC 87)
which requires an 8-digit DPID input.</P>
<P><A NAME="AUSREDIRECT"></A><FONT SIZE=4><B>5.5.1.4 Redirect Barcode</B></FONT></P>
<P>A Redirection version of the Australia Post 4-State Barcode (FCC
92) which requires an 8-digit DPID input.</P>
<P ALIGN=CENTER><IMG SRC="auspost.png" NAME="graphics1" ALIGN=LEFT WIDTH=266 HEIGHT=20 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P><A NAME="RM4SCC"></A><FONT SIZE=5><B>5.5.2 Royal Mail 4-State
Country Code (RM4SCC)</B></FONT></P>
<P>The RM4SCC standard is used by the Royal Mail in the UK to encode
postcode and customer data on mail items. Data input can consist of
numbers 0-9 and letters A-Z and usually includes delivery postcode
followed by house number. For example &quot;W1J0TR01&quot; for 1
Picadilly Circus in London. Check digit data is generated by Zint.</P>
<P ALIGN=CENTER><IMG SRC="rm4scc.png" NAME="graphics2" ALIGN=LEFT WIDTH=166 HEIGHT=20 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P><A NAME="ONECODE"></A><FONT SIZE=5><B>5.5.3 USPS OneCode</B></FONT></P>
<P>Also known as the Intelligent Mail Barcode and used in the US by
the United States Postal Service (USPS), the OneCode system is due to
replace the PostNet and PLANET symbologies by 2009. OneCode is a
fixed length (65-bar) symbol which combines routing and customer
information in a single symbol. Input data consists of a 20 digit
tracking code, followed by a dash (-), followed by a delivery point
zip-code which can be 0, 5, 9 or 11 digits in length. For example all
of the following inputs are valid data entries:</P>
<P><FONT FACE="Courier">&quot;01234567094987654321&quot;<BR>&quot;01234567094987654321-01234&quot;<BR>&quot;01234567094987654321-012345678&quot;<BR>&quot;01234567094987654321-01234567891&quot;</FONT></P>
<P ALIGN=CENTER><IMG SRC="onecode.png" NAME="graphics3" ALIGN=LEFT WIDTH=258 HEIGHT=12 BORDER=0><BR CLEAR=LEFT><BR><BR><BR>
</P>
<HR>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0>
<TR VALIGN=TOP>
<TD WIDTH=33% HEIGHT=5>
<P ALIGN=LEFT><A HREF="twotrack.html">Prev</A></P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER><A HREF="index.html">Home</A></P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT><A HREF="twodims.html">Next</A></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=33%>
<P ALIGN=LEFT>Two-Track Symbols</P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER>&nbsp;</P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT>Two-Dimensional Symbols</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
</BODY>
</HTML>

765
docs/frontend.html Normal file
View File

@ -0,0 +1,765 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
<TITLE>Using the Front End</TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 2.3 (Linux)">
<META NAME="CREATED" CONTENT="20070730;21081900">
<META NAME="CHANGED" CONTENT="20080309;20090400">
<STYLE TYPE="text/css">
<!--
TD P { color: #000000 }
H1 { color: #000000 }
P { color: #000000 }
TH P { color: #000000 }
A:link { color: #0000ff }
A:visited { color: #840084 }
-->
</STYLE>
</HEAD>
<BODY LANG="en-GB" TEXT="#000000" LINK="#0000ff" VLINK="#840084" BGCOLOR="#ffffff" DIR="LTR">
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0 STYLE="page-break-before: always">
<TR>
<TH COLSPAN=3>
<P ALIGN=CENTER>Zint Barcode Generator</P>
</TH>
</TR>
<TR VALIGN=BOTTOM>
<TD WIDTH=10%>
<P ALIGN=LEFT><A HREF="installing.html">Prev</A></P>
</TD>
<TD WIDTH=80%></TD>
<TD WIDTH=10%>
<P ALIGN=RIGHT><A HREF="backend.html">Next</A></P>
</TD>
</TR>
</TABLE>
<HR>
<H1>3. Using the Front End</H1>
<P STYLE="font-style: normal">Zint can be used to generate barcodes
as PNG images or as encapsulated Post Script (EPS) files. This page
describes how to encode data using the command line front end
program.</P>
<P><BR><BR>
</P>
<H1><A NAME="INPUT"></A><FONT SIZE=5><B>3.1 Inputting data</B></FONT></H1>
<P STYLE="font-style: normal">The data to encode can be entered at
the command line using the -d option, for example:</P>
<P STYLE="font-style: normal"><FONT FACE="Courier, monospace"><FONT SIZE=2>zint
-d 'This Text'</FONT></FONT></P>
<P STYLE="font-style: normal">This will encode the text <I>This Text</I>.
Zint will use the default symbology, Code 128, and output to the
default file out.png in the current directory.
</P>
<P><BR><BR>
</P>
<P STYLE="font-style: normal"><A NAME="OUTPUT"></A><FONT SIZE=5><B>3.2
Directing Output</B></FONT></P>
<P STYLE="font-style: normal">Output can be directed to a file other
than the default using the -o switch. For example:</P>
<P STYLE="font-style: normal"><FONT FACE="Courier, monospace"><FONT SIZE=2>zint
-o here.png -d 'This Text'</FONT></FONT></P>
<P STYLE="font-style: normal">draws a Code 128 barcode in the file
here.png. If an encapsulated Post Script file is needed simply append
the file name with .eps:</P>
<P STYLE="font-style: normal"><FONT FACE="Courier, monospace"><FONT SIZE=2>zint
-o there.eps -d 'This Text'</FONT></FONT></P>
<P><BR><BR>
</P>
<P STYLE="font-style: normal"><A NAME="BARTYPE"></A><FONT SIZE=5><B>3.3
Selecting barcode type</B></FONT></P>
<P STYLE="font-style: normal">Selecting which type of barcode you
wish to produce (i.e. which symbology to use) can be done at the
command line using the -b or --barcode= switch followed by the
appropriate integer value in the following table.</P>
<P ALIGN=JUSTIFY STYLE="page-break-before: always"><BR><BR>
</P>
<CENTER>
<TABLE WIDTH=809 BORDER=1 CELLPADDING=4 CELLSPACING=3>
<COL WIDTH=139>
<COL WIDTH=643>
<THEAD>
<TR VALIGN=TOP>
<TH WIDTH=139>
<P>ID</P>
</TH>
<TH WIDTH=643>
<P>Barcode Name</P>
</TH>
</TR>
</THEAD>
<TBODY>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>1</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Code 11</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>2</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Standard Code 2 of 5</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>3</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Interleaved 2 of 5</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>4</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Code 2 of 5 IATA</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>6</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Code 2 of 5 Data Logic</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>7</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Code 2 of 5 Industrial</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>8</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Code 3 of 9 (Code 39)</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>9</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Extended Code 3 of 9 (Code 39+)</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>13</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>EAN</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>16</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>GS1-128 (UCC.EAN-128)</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>18</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Codabar</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>20</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Code 128 (automatic subset switching)</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>21</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Deutshe Post Leitcode</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>22</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Deutshe Post Identcode</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>23</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Code 16K</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>25</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Code 93</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>28</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Flattermarken</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>29</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>GS1 DataBar-14</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>30</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>GS1 DataBar Limited</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>31</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>GS1 DataBar Extended</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>32</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Telepen Alpha</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>34</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>UPC A</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>37</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>UPC E</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>40</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>PostNet</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>47</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>MSI Code</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>49</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>FIM</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>50</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>LOGMARS</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>51</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Pharmacode One-Track</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>52</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>PZN</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>53</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Pharmacode Two-Track</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>55</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>PDF417</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>56</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>PDF417 Truncated</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>57</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Maxicode</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>58</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>QR Code</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>60</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Code 128 (Subset B)</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>63</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Australia Post Standard Customer</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>66</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Australia Post Reply Paid</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>67</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Australia Post Routing</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>68</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Australia Post Redirection</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>69</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>ISBN (EAN-13 with verification stage)</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>70</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Royal Mail 4 State (RM4SCC)</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>71</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Data Matrix</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>72</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>ITF-14</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>75</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>NVE-18</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>79</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>GS1 DataBar-14 Stacked</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>80</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>GS1 DataBar-14 Stacked Omnidirectional</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>81</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>GS1 DataBar Expanded Stacked</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>82</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>PLANET</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>84</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>MicroPDF417</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>85</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>USPS OneCode</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>86</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Plessey Code</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>100</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Telepen Numeric</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>101</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>MSI Plessey + mod 10</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>102</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>MSI Plessey + mod 10 + mod 10</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>103</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>MSI Plessey + mod 11</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>104</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>MSI Plessey + mod 10 + mod 11</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>105</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Code 39 + mod 43</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>106</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Extended Code 39 + mod 43</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>110</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Composite Symbol with EAN linear component</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>111</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Composite Symbol with GS1-128 linear component</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>112</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Composite Symbol with GS1 DataBar-14 linear
component</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>113</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Composite Symbol with GS1 DataBar Limited
component</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>114</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Composite Symbol with GS1 DataBar Extended
component</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>115</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Composite Symbol with UPC A linear component</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>116</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Composite Symbol with UPC E linear component</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>117</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Composite Symbol with GS1 DataBar-14 Stacked
component</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>118</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Composite Symbol with GS1 DataBar-14 Stacked
Omnidirectional component</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>119</P>
</TD>
<TD WIDTH=643>
<P ALIGN=CENTER>Composite Symbol with GS1 DataBar Expanded
Stacked component</P>
</TD>
</TR>
</TBODY>
</TABLE>
</CENTER>
<P ALIGN=JUSTIFY><BR><BR>
</P>
<P><A NAME="HEIGHT"></A><FONT SIZE=5><B>3.4 Adjusting height</B></FONT></P>
<P>The height of the symbol can be adjusted using the --height
switch. For example:</P>
<P><FONT FACE="Courier, monospace"><FONT SIZE=2>zint --height=100 -d
'This Text'</FONT></FONT></P>
<P>specifies a symbol height of 100 times the <I>x-resolution</I> of
the symbol.</P>
<P><BR><BR>
</P>
<P STYLE="font-style: normal"><A NAME="WHITESPACE"></A><FONT SIZE=5><B>3.5
Adjusting whitespace</B></FONT></P>
<P STYLE="font-style: normal">The amount of whitespace to the left
and right of the generated barcode can be altered using the -w
switch. For example:</P>
<P STYLE="font-style: normal"><FONT FACE="Courier, monospace"><FONT SIZE=2>zint
-w 10 -d 'This Text'</FONT></FONT></P>
<P STYLE="font-style: normal">specifies a whitespace width of 10
times the <I>x-resolution</I> of the symbol.</P>
<P><BR><BR>
</P>
<P STYLE="font-style: normal"><A NAME="BOUNDARY"></A><FONT SIZE=5><B>3.6
Adding boundary bars and boxes</B></FONT></P>
<P STYLE="font-style: normal">Zint allows the symbol to be bound with
'boundary bars' using the option --bind. These bars help to prevent
misreading of the symbol by corrupting a scan if the scanning beam
strays off the top or bottom of the symbol. Zint can also put a
border right around the symbol and its whitespace with the --box
option. This option is automatically chosen for ITF-14 symbols.</P>
<P STYLE="font-style: normal">The width of the boundary or box can be
specified using the --border switch. For example:</P>
<P STYLE="font-style: normal"><FONT FACE="Courier, monospace"><FONT SIZE=2>zint
--box --border=10 -d 'This'</FONT></FONT></P>
<P STYLE="font-style: normal">gives a box with a width 10 times the
<I>x-resolution</I> of the symbol.</P>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0>
<COL WIDTH=128*>
<COL WIDTH=128*>
<TR VALIGN=TOP>
<TD WIDTH=50%>
<P ALIGN=CENTER><IMG SRC="border.png" NAME="graphics2" ALT="bound symbol" ALIGN=MIDDLE WIDTH=238 HEIGHT=120 BORDER=0></P>
</TD>
<TD WIDTH=50%>
<P ALIGN=CENTER><IMG SRC="box.png" NAME="graphics1" ALT="boxed symbol" ALIGN=MIDDLE WIDTH=238 HEIGHT=120 BORDER=0></P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<P STYLE="font-style: normal"><A NAME="COLOUR"></A><FONT SIZE=5><B>3.7
Using colour</B></FONT></P>
<P STYLE="font-style: normal">The default colours of a symbol are a
black symbol on a white background. Zint allows you to change this.
The -r switch allows the default colours to be inverted so that a
white symbol is shown on a black background. For example the command</P>
<P STYLE="font-style: normal"><FONT FACE="Courier, monospace"><FONT SIZE=2>zint
-r -d 'This'</FONT></FONT></P>
<P STYLE="font-style: normal">gives an inverted Code 128 symbol. This
is not practical for most symbologies but white-on-black is allowed
by the Data Matrix symbology specification.</P>
<P STYLE="font-style: normal">For more specific needs the foreground
and background colours can be specified using the --fg= and --bg=
options followed by a number in RGB hexadecimal notation (the same
system used in HTML). For example the command
</P>
<P STYLE="font-style: normal"><FONT FACE="Courier, monospace"><FONT SIZE=2>zint
--fg=004700 -d 'This'</FONT></FONT></P>
<P STYLE="font-style: normal">alters the symbol to a dark green as
shown below.</P>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0>
<COL WIDTH=128*>
<COL WIDTH=128*>
<TR VALIGN=TOP>
<TD WIDTH=50%>
<P ALIGN=CENTER><IMG SRC="green.png" NAME="graphics3" ALT="symbol with green ink" ALIGN=BOTTOM WIDTH=238 HEIGHT=120 BORDER=0></P>
</TD>
<TD WIDTH=50%>
<P ALIGN=CENTER><IMG SRC="pink.png" NAME="graphics4" ALT="symbol with pink paper" ALIGN=BOTTOM WIDTH=238 HEIGHT=120 BORDER=0></P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<P STYLE="font-style: normal"><A NAME="OTHER"></A><FONT SIZE=5><B>3.8
Other options</B></FONT></P>
<P STYLE="font-style: normal">Additional options are available which
are specific to certain symbologies. These may, for example, control
the quantity of error correction data or the size of the symbol.
These options are discussed in section 5 of this guide.</P>
<P><BR><BR>
</P>
<HR>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0>
<TR VALIGN=TOP>
<TD WIDTH=33% HEIGHT=5>
<P ALIGN=LEFT><A HREF="installing.html">Prev</A></P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER><A HREF="index.html">Home</A></P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT><A HREF="backend.html">Next</A></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=33%>
<P ALIGN=LEFT>Installation</P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER>&nbsp;</P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT>Using the API</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
</BODY>
</HTML>

BIN
docs/gplv3-127x51.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
docs/green.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 B

317
docs/index.html Normal file
View File

@ -0,0 +1,317 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
<TITLE>Zint Barcode Generator</TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 2.3 (Linux)">
<META NAME="CREATED" CONTENT="20070802;10154800">
<META NAME="CHANGED" CONTENT="20080422;8300800">
<STYLE TYPE="text/css">
<!--
TD P { color: #000000 }
H3 { color: #000000 }
H1 { color: #000000 }
P { color: #000000 }
DT { color: #000000 }
DD { color: #000000 }
A:link { color: #0000ff }
A:visited { color: #840084 }
-->
</STYLE>
</HEAD>
<BODY LANG="en-GB" TEXT="#000000" LINK="#0000ff" VLINK="#840084" BGCOLOR="#ffffff" DIR="LTR">
<H1>Zint Barcode Generator</H1>
<H3>by Robin Stuart</H3>
<P>version 1.6, 22nd April 2008</P>
<P>This document is a guide to Zint, the <I>libzint</I> library and
the barcode symbologies supported by them.</P>
<HR>
<DL>
<DT><B>Table of Contents</B>
</DT><DT>
1. <A HREF="introduction.html">Introduction</A>
</DT><DT>
2. <A HREF="installing.html">Installing Zint</A>
</DT><DL>
<DT>
2.1 <A HREF="installing.html#BACKEND">Installing the Back End</A>
</DT><DT>
2.2 <A HREF="installing.html#FRONTEND">Installing the Front End</A>
</DT><DT>
2.3 <A HREF="installing.html#TESTING">Testing the Installation</A>
</DT></DL>
<DT>
3. <A HREF="frontend.html">Using the Front End</A>
</DT><DL>
<DT>
3.1 <A HREF="frontend.html#INPUT">Inputting Data</A>
</DT><DT>
3.2 <A HREF="frontend.html#OUTPUT">Directing Output</A>
</DT><DT>
3.3 <A HREF="frontend.html#BARTYPE">Selecting Barcode Type</A>
</DT><DT>
3.4 <A HREF="frontend.html#HEIGHT">Adjusting Height</A>
</DT><DT>
3.5 <A HREF="frontend.html#WHITESPACE">Adjusting Whitespace</A>
</DT><DT>
3.6 <A HREF="frontend.html#BOUNDARY">Adding Boundary Bars and Boxes</A>
</DT><DT>
3.7 <A HREF="frontend.html#COLOUR">Using Colour</A>
</DT><DT>
3.8 <A HREF="frontend.html#OTHER">Other Options</A>
</DT></DL>
<DT>
4. <A HREF="backend.html">Using the API</A>
</DT><DL>
<DT>
4.1 <A HREF="backend.html#CREATE">Creating and Deleting Symbols</A>
</DT><DT>
4.2 <A HREF="backend.html#ENCODE">Encoding and Saving to File</A>
</DT><DT>
4.3 <A HREF="backend.html#OPTIONS">Setting Options</A>
</DT><DT>
4.4 <A HREF="backend.html#ERRORS">Handling Errors</A>
</DT><DT>
4.5 <A HREF="backend.html#SYMBOL">Specifying a Symbology</A>
</DT><DT>
4.6 <A HREF="backend.html#BOXES">Adding Boxes and Boundary Bars</A>
</DT></DL>
<DT>
5. <A HREF="symbologies.html">Types of Symbol</A>
</DT><DL>
<DT>
5.1 <A HREF="onedim.html">One-Dimensional Symbols</A>
</DT><DL>
<DT>
5.1.1 <A HREF="onedim.html#CODE11">Code 11</A>
</DT><DT>
5.1.2 <A HREF="onedim.html#CODE25">Code 2 of 5</A>
</DT><DL>
<DT>
5.1.2.1 <A HREF="onedim.html#CODE25STAND">Standard Code 2 of 5</A>
</DT><DT>
5.1.2.2 <A HREF="onedim.html#IATA">IATA Code 2 of 5</A>
</DT><DT>
5.1.2.3 <A HREF="onedim.html#IND25">Industrial 2 of 5</A>
</DT><DT>
5.1.2.4 <A HREF="onedim.html#INTER25">Interleaved Code 2 of 5</A>
</DT><DT>
5.1.2.5 <A HREF="onedim.html#DLOGIC">Code 2 of 5 Data Logic</A>
</DT><DT>
5.1.2.6 <A HREF="onedim.html#ITF14">ITF-14</A>
</DT><DT>
5.1.2.7 <A HREF="onedim.html#DPLEIT">Deutche Post Leitcode</A>
</DT><DT>
5.1.2.8 <A HREF="onedim.html#DPIDENT">Deutche Post Identcode</A>
</DT></DL>
<DT>
5.1.3 <A HREF="onedim.html#UPC">Universal Product Code (EN 797)</A>
</DT><DL>
<DT>
5.1.3.1 <A HREF="onedim.html#UPCA">UPC version A</A>
</DT><DT>
5.1.3.2 <A HREF="onedim.html#UPCE">UPC version E</A>
</DT></DL>
<DT>
5.1.4 <A HREF="onedim.html#EAN">European Article Number (EN 797)</A>
</DT><DL>
<DT>
5.1.4.1 <A HREF="onedim.html#EANX">EAN-2, EAN-5, EAN-8 and EAN-13</A>
</DT><DT>
5.1.4.2 <A HREF="onedim.html#ISBN">SBN, ISBN and ISBN-13</A>
</DT></DL>
<DT>
5.1.5 <A HREF="onedim.html#PLESSEY">Plessey</A>
</DT><DT>
5.1.6 <A HREF="onedim.html#MSI">MSI Plessey</A>
</DT><DT>
5.1.7 <A HREF="onedim.html#TELEPEN">Telepen</A>
</DT><DL>
<DT>
5.1.7.1 <A HREF="onedim.html#TELEPENASCII">Telepen Alpha</A>
</DT><DT>
5.1.7.2 <A HREF="onedim.html#TELENUM">Telepen Numeric</A>
</DT></DL>
<DT>
5.1.8 <A HREF="onedim.html#CODE39">Code 39</A>
</DT><DL>
<DT>
5.1.8.1 <A HREF="onedim.html#CODE39STAND">Standard Code 39 (ISO
16388)</A>
</DT><DT>
5.1.8.2 <A HREF="onedim.html#EXCODE39">Extended Code 39</A>
</DT><DT>
5.1.8.3 <A HREF="onedim.html#CODE93">Code 93</A>
</DT><DT>
5.1.8.4 <A HREF="onedim.html#PZN">PZN</A>
</DT><DT>
5.1.8.5 <A HREF="onedim.html#LOGMARS">LOGMARS</A>
</DT></DL>
<DT>
5.1.9 <A HREF="onedim.html#CODABAR">Codabar (EN 798)</A>
</DT><DT>
5.1.10 <A HREF="onedim.html#PHARMA">Pharmacode</A>
</DT><DT>
5.1.11 <A HREF="onedim.html#CODE128">Code 128</A>
</DT><DL>
<DT>
5.1.11.1 <A HREF="onedim.html#CODE128STAND">Standard Code 128
(ISO 15417)</A>
</DT><DT>
5.1.11.2 <A HREF="onedim.html#CODE128B">Code 128 subset B</A>
</DT><DT>
5.1.11.3 <A HREF="onedim.html#EAN128">EAN-128</A>
</DT><DT>
5.1.11.4 <A HREF="onedim.html#NVE18">NVE-18</A>
</DT></DL>
<DT>
5.1.12 <A HREF="onedim.html#DATABAR">GS1 DataBar (ISO 24724)</A>
</DT><DL>
<DT>
5.1.12.1 <A HREF="onedim.html#RSS14">DataBar-14 and DataBar-14
Truncated</A></DT><DT>
5.1.12.2 <A HREF="onedim.html#RSSLTD">DataBar Limited</A></DT><DT>
5.1.12.3 <A HREF="onedim.html#RSSEXP">DataBar Expanded</A></DT></DL>
</DL>
<DT>
5.2 <A HREF="stacked.html">Stacked Symbologies</A>
</DT><DL>
<DT>
5.2.1 <A HREF="stacked.html#BASIC">Basic Symbol Stacking</A>
</DT><DT>
5.2.2 <A HREF="stacked.html#CODE16K">Code 16k (EN 12323)</A>
</DT><DT>
5.2.3 <A HREF="stacked.html#PDF417">PDF417 (ISO 15438)</A>
</DT><DT>
5.2.4 <A HREF="stacked.html#PDF417T">Compact PDF417</A>
</DT><DT>
5.2.5 <A HREF="stacked.html#MICROPDF">MicroPDF417 (ISO 24728)</A>
</DT><DT>
5.2.6 <A HREF="stacked.html#RSS14STACK">GS1 DataBar-14 Stacked
(ISO 24724)</A></DT><DT>
5.2.7 <A HREF="stacked.html#RSS14OMNI">GS1 DataBar-14 Stacked
Omnidirectional (ISO 24724)</A></DT><DT>
5.2.8 <A HREF="stacked.html#RSSEXPSTACK">GS1 DataBar Expanded
Stacked (ISO 24724)</A>
</DT></DL>
<DT>
5.3 <A HREF="composite.html">Composite Symbols (ISO 24723)</A>
</DT><DL>
<DT>
5.3.1 <A HREF="composite.html#CCA">CC-A</A>
</DT><DT>
5.3.2 <A HREF="composite.html#CCB">CC-B</A>
</DT><DT>
5.3.3 <A HREF="composite.html#CCC">CC-C</A>
</DT></DL>
<DT>
5.4 <A HREF="twotrack.html">Two-Track Symbologies</A>
</DT><DL>
<DT>
5.4.1 <A HREF="twotrack.html#PHARMA">Two-Track Pharmacode</A>
</DT><DT>
5.4.2 <A HREF="twotrack.html#POSTNET">PostNet</A>
</DT><DT>
5.4.3 <A HREF="twotrack.html#PLANET">PLANET</A>
</DT></DL>
<DT>
5.5 <A HREF="fourstate.html">4-State Postal Codes</A>
</DT><DL>
<DT>
5.5.1 <A HREF="fourstate.html#AUSPOST">Australia Post 4-State
Symbols</A>
</DT><DL>
<DT>
5.5.1.1 <A HREF="fourstate.html#AUSCUST">Customer Barcodes</A>
</DT><DT>
5.5.1.2 <A HREF="fourstate.html#AUSREPLY">Reply Paid Barcode</A>
</DT><DT>
5.5.1.3 <A HREF="fourstate.html#AUSROUTE">Routing Barcode</A>
</DT><DT>
5.5.1.4 <A HREF="fourstate.html#AUSREDIRECT">Redirect Barcode</A>
</DT></DL>
<DT>
5.5.2 <A HREF="fourstate.html#RM4SCC">Royal Mail 4-State Country
Code (RM4SCC)</A>
</DT><DT>
5.5.3 <A HREF="fourstate.html#ONECODE">USPS OneCode</A>
</DT></DL>
<DT>
5.6 <A HREF="twodims.html">Two-Dimensional Symbols</A>
</DT><DL>
<DT>
5.6.1 <A HREF="twodims.html#DMATRIX">Data Matrix (ISO 16022)</A>
</DT><DT>
5.6.2 <A HREF="twodims.html#QRCODE">QR Code (ISO 18004)</A>
</DT><DT>
5.6.3 <A HREF="twodims.html#MAXI">Maxicode (ISO 16023)</A></DT></DL>
<DT>
5.7 <A HREF="markings.html">Other Barcode-Like Markings</A>
</DT><DL>
<DT>
5.7.1 <A HREF="markings.html#FIM">Facing Identification Mark (FIM)</A>
</DT><DT>
5.7.2 <A HREF="markings.html#FLAT">Flattermarken</A>
</DT></DL>
</DT></DL>
<DT>
6 <A HREF="legal.html">Legal and Version Information</A>
</DT><DL>
<DT>
6.1 <A HREF="legal.html#LICENSE">License</A>
</DT><DT>
6.2 <A HREF="legal.html#PATENT">Patent Issues</A>
</DT><DT>
6.3 <A HREF="legal.html#VERSION">Version Information</A>
</DT><DT>
6.4 <A HREF="legal.html#CREDITS">Sources of Information</A>
</DT><DT>
6.5 <A HREF="legal.html#STANDARD">Standard Compliance</A>
</DT></DL>
<DT>
A <A HREF="appxa.html">Appendix A: Character Encoding</A>
</DT><DL>
<DT>
A.1 <A HREF="appxa.html#ASCII">ASCII Standard</A>
</DT><DT>
A.2 <A HREF="appxa.html#LATIN1">Latin Alphabet No 1 (ISO 8859-1)</A>
</DT></DL>
<DT>
B <A HREF="appxb.html">Appendix B: Three Digit Country Codes (ISO
3166)</A>
</DT><DT>
C <A HREF="appxc.html">Appendix C: GS1 General Specification</A>
</DT><DL>
<DT>
C.1 <A HREF="appxc.html#AI">Application Identifiers</A>
</DT><DT>
C.2 <A HREF="appxc.html#FIELDS">Fixed Length Fields</A>
</DT></DL>
</DL>
<HR>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0>
<TR VALIGN=TOP>
<TD WIDTH=33%>
<P ALIGN=LEFT>&nbsp;</P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER>&nbsp;</P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT><A HREF="introduction.html">Next</A></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=33%>
<P ALIGN=LEFT>&nbsp;</P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER>&nbsp;</P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT>Introduction</P>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>

125
docs/installing.html Normal file
View File

@ -0,0 +1,125 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
<TITLE>Installing Zint</TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 2.3 (Linux)">
<META NAME="CREATED" CONTENT="20070730;21081900">
<META NAME="CHANGED" CONTENT="20080329;19111200">
<STYLE TYPE="text/css">
<!--
TD P { color: #000000 }
H1 { color: #000000 }
P { color: #000000 }
TH P { color: #000000 }
A:link { color: #0000ff }
A:visited { color: #840084 }
-->
</STYLE>
</HEAD>
<BODY LANG="en-GB" TEXT="#000000" LINK="#0000ff" VLINK="#840084" BGCOLOR="#ffffff" DIR="LTR">
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0 STYLE="page-break-before: always">
<TR>
<TH COLSPAN=3>
<P ALIGN=CENTER>Zint Barcode Generator</P>
</TH>
</TR>
<TR VALIGN=BOTTOM>
<TD WIDTH=10%>
<P ALIGN=LEFT><A HREF="introduction.html">Prev</A></P>
</TD>
<TD WIDTH=80%></TD>
<TD WIDTH=10%>
<P ALIGN=RIGHT><A HREF="frontend.html">Next</A></P>
</TD>
</TR>
</TABLE>
<HR>
<H1>2. Installing Zint</H1>
<P>These instructions relate to installing Zint on a GNU/Linux
machine but should be the same or similar for other POSIX compliant
systems (including UNIX and BSD based systems). Installation on
Windows or MacOS based system should be possible but is not covered
here.</P>
<P>Zint is currently only available as source code. First download
the source code .tar.gz file from <A HREF="http://www.sourceforge.net/projects/zint">SourceForge</A>
and unpack it. The package consists of two distinct parts: a <I>front
end</I> which provides a command line interface, and a <I>back end</I>
which provides an API which allows developers to integrate encoding
into their own project. You will notice that the sorce code is
suitably arranged into frontend and backend folders. The front end
requires the back end to be installed, so the back end should be
installed first.</P>
<P><A NAME="BACKEND"></A><FONT SIZE=5><B>2.1 Installing the back end</B></FONT></P>
<P>The Zint back end, <I>libzint</I>, requires the libpng and libz
libraries. The latest version of these libraries is available from
<A HREF="http://www.libpng.org/pub/png/libpng.html">http://www.libpng.org/pub/png/libpng.html</A>.
Install these first before trying to install Zint. In addition, if
you require QR Code support, Zint uses <I>libqrencode</I> which is
available from
<A HREF="http://megaui.net/fukuchi/works/qrencode/index.en.html">http://megaui.net/fukuchi/works/qrencode/index.en.html</A>.
If you don't need QR Code support this can be disabled during
compilation.</P>
<P STYLE="font-style: normal">To install libzint with QR Code support
follow these steps</P>
<P STYLE="font-style: normal"><FONT FACE="Courier, monospace"><FONT SIZE=2>cd
backend<BR>make<BR>make install</FONT></FONT></P>
<P STYLE="font-style: normal">If you do not want QR Code support use
the following steps</P>
<P STYLE="font-style: normal"><FONT FACE="Courier, monospace"><FONT SIZE=2>cd
backend<BR>make libzint_noqr<BR>make install</FONT></FONT></P>
<P><BR><BR>
</P>
<P STYLE="font-style: normal"><A NAME="FRONTEND"></A><FONT SIZE=5><B>2.2
Installing the front end</B></FONT></P>
<P STYLE="font-style: normal">To install the front end follow these
steps</P>
<P STYLE="font-style: normal"><FONT FACE="Courier, monospace"><FONT SIZE=2>cd
frontend<BR>make<BR>make install</FONT></FONT></P>
<P><BR><BR>
</P>
<P STYLE="font-style: normal"><A NAME="TESTING"></A><FONT SIZE=5><B>2.3
Testing the Installation</B></FONT></P>
<P STYLE="font-style: normal">To test that the installation has been
sucessful a shell script is included in the frontend folder. To run
the test type</P>
<P STYLE="font-style: normal"><FONT FACE="Courier, monospace"><FONT SIZE=2>./test.sh</FONT></FONT></P>
<P STYLE="font-style: normal">This should create numerous files
showing the many modes of operation which are available from Zint. If
you get the following message...</P>
<P STYLE="font-style: normal"><FONT FACE="Courier, monospace"><FONT SIZE=2>zint:
error while loading shared libraries: libzint.so: cannot open shared
object file: No such file or directory</FONT></FONT></P>
<P STYLE="font-style: normal">try the following as root:</P>
<P STYLE="font-style: normal"><FONT FACE="Courier, monospace"><FONT SIZE=2>ldconfig</FONT></FONT></P>
<P><BR><BR>
</P>
<HR>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0>
<TR VALIGN=TOP>
<TD WIDTH=33% HEIGHT=5>
<P ALIGN=LEFT><A HREF="introduction.html">Prev</A></P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER><A HREF="index.html">Home</A></P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT><A HREF="frontend.html">Next</A></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=33%>
<P ALIGN=LEFT>Introduction</P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER>&nbsp;</P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT>Using the Front End</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
</BODY>
</HTML>

97
docs/introduction.html Normal file
View File

@ -0,0 +1,97 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
<TITLE>Introduction</TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 2.3 (Linux)">
<META NAME="CREATED" CONTENT="20070730;21081900">
<META NAME="CHANGED" CONTENT="20080309;19055500">
<STYLE TYPE="text/css">
<!--
TD P { color: #000000 }
H1 { color: #000000 }
P { color: #000000 }
TH P { color: #000000 }
A:link { color: #0000ff }
A:visited { color: #840084 }
-->
</STYLE>
</HEAD>
<BODY LANG="en-GB" TEXT="#000000" LINK="#0000ff" VLINK="#840084" BGCOLOR="#ffffff" DIR="LTR">
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0 STYLE="page-break-before: always">
<TR>
<TH COLSPAN=3>
<P ALIGN=CENTER>Zint Barcode Generator</P>
</TH>
</TR>
<TR VALIGN=BOTTOM>
<TD WIDTH=10%>
<P ALIGN=LEFT><A HREF="index.html">Prev</A></P>
</TD>
<TD WIDTH=80%></TD>
<TD WIDTH=10%>
<P ALIGN=RIGHT><A HREF="installing.html">Next</A></P>
</TD>
</TR>
</TABLE>
<HR>
<H1><A NAME="INTRODUCTION"></A>1. Introduction</H1>
<P>Zint is an open source barcode generator which allows you to
encode data in over 30 types of barcode symbol. In this documentation
a barcode encoding method is termed a <I>symbology</I> and the
resulting barcode image is termed a <I>symbol</I>. The symbologies
currently supported by Zint are: [1]</P>
<P>Code 11, Standard Code 2 of 5, IATA Code 2 of 5, Industrial Code 2
of 5, Interleaved Code 2 of 5, Code 2 of 5 Data Logic, ITF-14,
Deutche Post Leitcode, Deutche Post Identcode, UPC-A, UPC-E, EAN-2,
EAN-5, EAN-8, EAN-13, UK Plessey, MSI Plessey, Telepen Alpha, Telepen
Numeric, Code 39, Extended Code 39, Code 93, PZN, LOGMARS, Codabar,
Pharmacode, Code 128, GS1-128, NVE-18, GS1 DataBar, DataBar-14,
DataBar Limited, DataBar Extended, Code 16k, PDF417, MicroPDF417,
Two-Track Pharmacode, PostNet, PLANET, Australia Post 4-State
Symbols, RM4SCC, USPS OneCode, Data Matrix, QR Code, Maxicode,
Composite Symbols, FIM and Flattermarken.</P>
<P>In addition Zint also provides barcode stacking, colour options
and a verification stage for SBN, ISBN and ISBN-13 data. The aim of
the Zint project is to provide an open source API for encoding all
public domain barcode symbologies.</P>
<P>This document is a guide to the Zint API and front end program as
well as a guide to the barcode technologies which they make
available. Please remember that, although a great deal of care has
been taken to de-bug Zint, many of the symbologies have not been
tested with commercial barcode scanners so you are recommended to
test that symbols decode properly before you use them.</P>
<P><BR><BR>
</P>
<P>[1] Note that some of these symbologies have more than one name,
and that some of the names given in this list are not the official
names for the symbologies referred to.</P>
<HR>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0>
<TR VALIGN=TOP>
<TD WIDTH=33%>
<P ALIGN=LEFT><A HREF="index.html">Prev</A></P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER><A HREF="index.html">Home</A></P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT><A HREF="installing.html">Next</A></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=33%>
<P ALIGN=LEFT>Zint Barcode Generator</P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER>&nbsp;</P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT>Installing Zint</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
</BODY>
</HTML>

BIN
docs/itf14.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

265
docs/legal.html Normal file
View File

@ -0,0 +1,265 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
<TITLE>Legal and Version Information</TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 2.3 (Linux)">
<META NAME="CREATED" CONTENT="20070730;21081900">
<META NAME="CHANGED" CONTENT="20080422;8453800">
<STYLE TYPE="text/css">
<!--
TD P { color: #000000 }
H1 { color: #000000 }
P { color: #000000 }
TH P { color: #000000 }
A:link { color: #0000ff }
A:visited { color: #840084 }
-->
</STYLE>
</HEAD>
<BODY LANG="en-GB" TEXT="#000000" LINK="#0000ff" VLINK="#840084" BGCOLOR="#ffffff" DIR="LTR">
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0 STYLE="page-break-before: always">
<TR>
<TH COLSPAN=3>
<P ALIGN=CENTER>Zint Barcode Generator</P>
</TH>
</TR>
<TR VALIGN=BOTTOM>
<TD WIDTH=10%>
<P ALIGN=LEFT><A HREF="markings.html">Prev</A></P>
</TD>
<TD WIDTH=80%></TD>
<TD WIDTH=10%>
<P ALIGN=RIGHT><A HREF="appxa.html">Next</A></P>
</TD>
</TR>
</TABLE>
<HR>
<H1>6. Legal and Version Information</H1>
<P><A NAME="LICENSE"></A><FONT SIZE=5><B>6.1 License</B></FONT></P>
<P><IMG SRC="gplv3-127x51.png" NAME="graphics1" ALIGN=RIGHT WIDTH=127 HEIGHT=51 BORDER=0>Zint
and <I>libzint</I> are Copyright &copy; 2008 Robin Stuart and are
distributed under the terms of the <A HREF="http://www.gnu.org/copyleft/gpl.html">GNU
General Public License</A> version 3 [1]. See the file <FONT FACE="Courier">COPYING</FONT>
for more information. The following terms form part of the GPL:</P>
<P><FONT FACE="Courier">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.</FONT></P>
<P><FONT FACE="Courier">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.</FONT></P>
<P>Data Matrix code is Copyright &copy; 2004 Adrian Kennard, Andrews
&amp; Arnold Ltd and &copy; 2006 Stefan Schmidt, used under the terms
of the GNU General Public Licence.</P>
<P>Reed-Solomon code is Copyright &copy; 2004 Cliff Hones, used under
the terms of the GNU General Public Licence.</P>
<P>Portions of GS1 DataBar and Composite Symbology code are Copyright
&copy; 2006 ISO/BSI Global and used with permission.</P>
<P>Portions of OneCode code is &copy; 2006 United States Postal
Service. This is indicated where appropriate in the source code and
is used on the understanding that this code has been released to the
public domain and that such use is intended by the copyright holder.</P>
<P><I>libqrencode</I> is Copyright &copy; 2006, 2007, 2008 Kentaro
Fukuchi and is released under the terms of the GNU General Public
Licence.</P>
<P>QR Code is a registered trademark of Denso Corp. of Kariya, Japan.</P>
<P><A NAME="PATENT"></A><FONT SIZE=5><B>6.2 Patent Issues</B></FONT></P>
<P>All of the code in Zint is developed using information in the
public domain, usually freely available on the Internet. Some of the
techniques used may be subject to patents and other intellectual
property legislation. It is my belief that any patents involved in
the technology underlying symbologies utilised by Zint are
'unadopted', that is the holder does not object to their methods
being used. If, however, you are a patent holder or hold any other
intellectual property rights on the methods used by Zint or the
symbologies which Zint generates, and do not want Zint to continue to
support your symbology then please contact me and I will update the
code to accommodate your wishes at the soonest opportunity.</P>
<P>Any methods patented or owned by third parties or trademarks or
registered trademarks used within Zint or in this document are and
remain the property of their respective owners and do not indicate
endorsement or affiliation with those owners, companies or
organisations.</P>
<P><A NAME="VERSION"></A><FONT SIZE=5><B>6.3 Version Information</B></FONT></P>
<P>v0.1 - (as <I>Zebar</I>) Draws UPC-A. UPC-E, EAN-8, EAN-13,
Interlaced 2 of 5, Codabar, Code 39, Extended Code 39 and Code 93
barcodes and Add-on codes EAN-2 and EAN-5 without parity. 13/11/2006</P>
<P>v0.2 - Added Code 128 (which is now the default), Code 11, Code 2
of 5, Add-on codes EAN-2 and EAN-5 parity and MSI/Plessey without
check digit. 12/12/2006</P>
<P>v0.3 - Added MSI/Plessey Mod 10 check and 2 x Mod 10 check
options, Telepen ASCII and Telepen numeric, Postnet, RM4SCC. Code has
been tidied up quite a bit. Bind option added. 30/12/2006</P>
<P>v0.4 - Added barcode stacking (now stacks up to 16 barcodes) and
Code16k (stub). 15/1/2007</P>
<P>v0.5 - Added Australia Post 4-State Barcodes and Pharmacode (1 and
2 track). 4-state codes now draw with correct height/width ratio.
28/2/2007</P>
<P>v0.6 - Added Plessey and some derivative codes (EAN-128, Code 128
subset B, Auspost Reply, Auspost Routing, Auspost Redirect, ITF-14).
Tidied up code again: separated symbologies into more files and put
all lookup tables into arrays (much reducing the amount of code,
especially for Code 39e and Code 93). Errors now output to stderr.
Added proper input verification. Distribution now packs with this
HTML page instead of separate README. Outputs to PNG. Outputs colour.
User variable whitespace and border width. Box option. Fixed EAN
add-on bug. Added whitespace and height options. Project name changed
to Zint to avoid conflict with extant trade name. Added escape
character input. 1/4/2007</P>
<P>v1.0 - Corrected problem with escape character codes. Supports
PDF417. This completes the list of features I originally wanted (plus
a few more), hence skip to version 1.0. 20/4/2007</P>
<P>v1.1 - Added more derivatives (Code 2 of 5 Matrix, IATA and Data
Logic, Truncated PDF417, Deutsche Post Leitcode and Identcode,
Pharmazentralnummer, Planet) and Flattermarken. Tidied up 2 of 5
code. 26/4/2007</P>
<P>v1.2 - Supports Data Matrix (by absorption of IEC16022 code by
Stefan Schmidt et al). Added reverse colours, FIM, MSI/Plessey Modulo
11 and Modulo 11/10. Corrected Code 16k check digit calculation.
28/5/2007</P>
<P>v1.3 - Supports USPS OneCode and LOGMARS. Brought all usage
information into one User Manual document. 13/6/2007</P>
<P>v1.4 - Added NVE-18 support. Corrected some problems with
compilation and input verification. Added zint.1 man page. Command
line option handling now uses getopt(), and all the switches have
changed. Added --font option. 20/6/2007</P>
<P>v1.5 - Pulled everything together to make an API. Corrected errors
with EAN-13, PDF417 and LOGMARS. Added EPS output. Added QR Code
support using libqrencode. Corrected ISBN verification error.
Re-compiled documentation in HTML form. Put in place proper error
handling routines. --font option removed. Encoding is now done with a
restructured zint_symbol structure. Added make install option and
optional QR Code support to Makefile. Corrected minor problem with
4-State Codes. Restructured code into fewer source code files. Added
MicroPDF417 support. 12/8/2007</P>
<P>v1.5.1 - Added formatting code to EPS output of EAN and UPC
symbols according to EN 797:1996. Checked against and, where
appropriate, altered or corrected to comply with ISO 16388 and ISO
15417 including Latin-1 support. Altered default image settings,
added automatic ITF border. Corrected error with USPS OneCode. Tidied
up Code 39 quite a bit, added Mod 43 options. 3/9/2007</P>
<P>v1.5.2 - Added extended ASCII support to Code 16k. Corrected Code
128 error. Added Maxicode support by integrating code by John Lien.
26/9/2007</P>
<P>v1.5.3 - Made huge corrections to Maxicode support by removing and
re-writing much of John's code. Maxicode now supports extended ASCII
and modes 4, 5 and 6. 10/10/2007</P>
<P>v1.5.4 - Added GS1 DataBar (Reduced Space Symbology) support.
26/11/2007</P>
<P>v1.5.5 - Added composite symbology support. Corrected errors with
GS1-128 and PDF417/MicroPDF417 byte processing. Transferred licence
to GPL version 3. 9/3/2008</P>
<P>v1.6 Data Matrix, Maxicode and Australia Post now use common
Reed-Solomon functions this also fixes a bug in Maxicode error
correction and replaces the last of the Lien code. Added PNG output
for Maxicode symbols. Removed some useless code. Updated QR support
for <I>libqrencode</I> v2.0.0. 22/4/2008</P>
<P><A NAME="CREDITS"></A><FONT SIZE=5><B>6.4 Sources of Information</B></FONT></P>
<P>Below is a list of some of the sources used in rough chronological
order:</P>
<P><A HREF="http://www.spatula.net/proc/barcode/index.src">Nick
Johnson's Barcode Specifications</A></P>
<P><A HREF="http://www.barcode-1.net/pub/russadam/spec.html">Bar Code
1 Specification Source Page</A></P>
<P><A HREF="http://www.telepen-barcode.co.uk/">SB Electronic Systems
Telepen website</A></P>
<P>Pharmacode specifications from <A HREF="http://www.laetus.com/">Laetus</A></P>
<P><A HREF="http://www.morovia.com/education/symbology/royalmail.asp">Morovia
RM4SCC specification</A></P>
<P><A HREF="http://www.auspost.com.au/">Austalia Post's</A> 'A Guide
to Printing the 4-State Barcode' and bcsample source code</P>
<P>Plessey algorithm from <A HREF="http://ar.linux.it/pub/barcode">GNU-Barcode
v0.98</A> by Leonid A. Broukhis</P>
<P><A HREF="http://www.gs1uk.org/EANUCC/WORD_Files/word.html">GS1
General Specifications v 7.0</A></P>
<P><A HREF="http://www.linpng.org/pub/png/book/">PNG: The Definitive
Guide</A> and wpng source code by Greg Reolofs</P>
<P>PDF417 specification and pdf417 source code by <A HREF="http://grandzebu.net/index.php">Grand
Zebu</A></P>
<P>Barcode Reference, TBarCode/X User Documentation and TBarCode/X
demonstration program from <A HREF="http://www.tec-it.com/">Tec-It</A></P>
<P><A HREF="http://www.datenfreihafen.org/projects/iec16022.html">IEC16022
source code by Stefan Schmidt et al</A></P>
<P><A HREF="http://ribbs.usps.gov/onecodesolution/">United States
Postal Service Specification USPS-B-3200</A></P>
<P>Adobe Systems Incorporated Encapsulated PostScript File Format
Specification</P>
<P><A HREF="http://www.bsi-global.com/">BSI Online</A> Library</P>
<P><A NAME="STANDARD"></A><FONT SIZE=5><B>6.5 Standard Compliance</B></FONT></P>
<P>Zint was developed to provide compliance with the following
British and international standards:
</P>
<P>BS EN 797:1996 Bar coding Symbology specifications - 'EAN/UPC'</P>
<P>BS EN 798:1996 Bar coding Symbology specifications - “Codabar”</P>
<P>BS ISO/IEC 12323:2005 AIDC technologies Symbology
specifications Code 16K</P>
<P>BS ISO/IEC 15417:2007 Information technology Automatic
identification and data capture techniques Code 128 bar code
symbology specification</P>
<P>BS ISO/IEC 15438:2006 Information technology Automatic
identification and data capture techniques PDF417 bar code
symbology specification</P>
<P>BS ISO/IEC 16022:2006 Information technology Automatic
identification and data capture techniques Data Matrix bar code
symbology specification</P>
<P>BS ISO/IEC 16023:2000 Information technology International
symbology specification - Maxicode</P>
<P>BS ISO/IEC 16388:2007 Information technology Automatic
identification and data capture techniques Code 39 bar code
symbology specification</P>
<P>BS ISO/IEC 18004:2006 Information technology Automatic
identification and data capture techniques QR Code 2005 bar code
symbology specification</P>
<P>BS ISO/IEC 24723:2006 Information technology Automatic
identification and data capture techniques EAN.UCC Composite bar
code symbology specification</P>
<P>BS ISO/IEC 24724:2006 Information technology Automatic
identification and data capture techniques Reduced Space
Symbology (RSS) bar code symbology specification</P>
<P>BS ISO/IEC 24728:2006 Information technology Automatic
identification and data capture techniques MicroPDF417 bar code
symbology specification</P>
<P ALIGN=LEFT><BR><BR>
</P>
<P ALIGN=LEFT>[1] Some of the third party code in this library was
distributed under the terms of <A HREF="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html">version
2 of the GNU Public Licence</A> with the option of using a later
version. For the purpose of Zint as a whole package I have chosen to
take this option and redistribute the code under version 3 of the
licence. This decision takes effect from version 1.5.5 of the code
and does not affect the licence of previously released versions of
the code. Some third party source code files, however, are included
in Zint as verbatim (unaltered) copies and therefore the right to
change the license terms remains exclusively with the original
copyright holder. R. Stuart 9/3/2008</P>
<HR>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0>
<TR VALIGN=TOP>
<TD WIDTH=33% HEIGHT=5>
<P ALIGN=LEFT><A HREF="markings.html">Prev</A></P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER><A HREF="index.html">Home</A></P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT><A HREF="appxa.html">Next</A></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=33%>
<P ALIGN=LEFT>Other Markings</P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER>&nbsp;</P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT>Appendix A</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
</BODY>
</HTML>

138
docs/markings.html Normal file
View File

@ -0,0 +1,138 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
<TITLE>Other Markings</TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 2.3 (Linux)">
<META NAME="CREATED" CONTENT="20070730;21081900">
<META NAME="CHANGED" CONTENT="20080316;13275900">
<STYLE TYPE="text/css">
<!--
TD P { color: #000000 }
H1 { color: #000000 }
P { color: #000000 }
TH P { color: #000000 }
A:link { color: #0000ff }
A:visited { color: #840084 }
-->
</STYLE>
</HEAD>
<BODY LANG="en-GB" TEXT="#000000" LINK="#0000ff" VLINK="#840084" BGCOLOR="#ffffff" DIR="LTR">
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0 STYLE="page-break-before: always">
<TR>
<TH COLSPAN=3>
<P ALIGN=CENTER>Zint Barcode Generator</P>
</TH>
</TR>
<TR VALIGN=BOTTOM>
<TD WIDTH=10%>
<P ALIGN=LEFT><A HREF="twodims.html">Prev</A></P>
</TD>
<TD WIDTH=80%></TD>
<TD WIDTH=10%>
<P ALIGN=RIGHT><A HREF="legal.html">Next</A></P>
</TD>
</TR>
</TABLE>
<HR>
<H1>5.7 Other Barcode-Like Markings</H1>
<P><A NAME="FIM"></A><FONT SIZE=5><B>5.7.1. Facing Identification
Mark (FIM)</B></FONT></P>
<P ALIGN=LEFT>Used by the United States Postal Service (USPS), the
FIM symbology is used to assist automated mail processing. There are
only 4 valid symbols which can be generated using the characters A-D
as shown in the table below.</P>
<CENTER>
<TABLE WIDTH=776 BORDER=1 CELLPADDING=4 CELLSPACING=3>
<COL WIDTH=124>
<COL WIDTH=625>
<THEAD>
<TR VALIGN=TOP>
<TH WIDTH=124>
<P>Code Letter</P>
</TH>
<TH WIDTH=625>
<P>Usage</P>
</TH>
</TR>
</THEAD>
<TBODY>
<TR VALIGN=TOP>
<TD WIDTH=124>
<P ALIGN=CENTER>A</P>
</TD>
<TD WIDTH=625>
<P ALIGN=CENTER>Used for courtesy reply mail and metered reply
mail with a pre-printed PostNet symbol.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=124>
<P ALIGN=CENTER>B</P>
</TD>
<TD WIDTH=625>
<P ALIGN=CENTER>Used for business reply mail without a
pre-printed zip code.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=124>
<P ALIGN=CENTER>C</P>
</TD>
<TD WIDTH=625>
<P ALIGN=CENTER>Used for business reply mail with a pre-printed
zip code.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=124>
<P ALIGN=CENTER>D</P>
</TD>
<TD WIDTH=625>
<P ALIGN=CENTER>Used for Information Based Indicia (IBI)
postage.</P>
</TD>
</TR>
</TBODY>
</TABLE>
</CENTER>
<P ALIGN=CENTER><BR><BR>
</P>
<P ALIGN=LEFT><IMG SRC="fim.png" NAME="graphics1" ALIGN=LEFT WIDTH=30 HEIGHT=100 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P ALIGN=LEFT><A NAME="FLAT"></A><FONT SIZE=5><B>5.7.2 Flattermarken</B></FONT></P>
<P ALIGN=LEFT>Used for the recognition of page sequences in
print-shops, the Flattermarken is not a true barcode symbol and
requires precise knowledge of the position of the mark on the page.
The Flattermarken system can encode any length numeric data and does
not include a check digit.<BR><BR><BR>
</P>
<HR>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0>
<TR VALIGN=TOP>
<TD WIDTH=33% HEIGHT=5>
<P ALIGN=LEFT><A HREF="twodims.html">Prev</A></P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER><A HREF="index.html">Home</A></P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT><A HREF="legal.html">Next</A></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=33%>
<P ALIGN=LEFT>4-State Codes</P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER>&nbsp;</P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT>Legal</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
</BODY>
</HTML>

BIN
docs/matrix.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 312 B

BIN
docs/maxicode.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
docs/micropdf.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 625 B

BIN
docs/msi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
docs/onecode.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 B

413
docs/onedim.html Normal file
View File

@ -0,0 +1,413 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
<TITLE>One-Dimensional Symbols</TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 2.3 (Linux)">
<META NAME="CREATED" CONTENT="20070730;21081900">
<META NAME="CHANGED" CONTENT="20080316;11412400">
<STYLE TYPE="text/css">
<!--
TD P { color: #000000 }
H1 { color: #000000 }
P { color: #000000 }
TH P { color: #000000 }
A:link { color: #0000ff }
A:visited { color: #840084 }
-->
</STYLE>
</HEAD>
<BODY LANG="en-GB" TEXT="#000000" LINK="#0000ff" VLINK="#840084" BGCOLOR="#ffffff" DIR="LTR">
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0 STYLE="page-break-before: always">
<TR>
<TH COLSPAN=3>
<P ALIGN=CENTER>Zint Barcode Generator</P>
</TH>
</TR>
<TR VALIGN=BOTTOM>
<TD WIDTH=10%>
<P ALIGN=LEFT><A HREF="symbologies.html">Prev</A></P>
</TD>
<TD WIDTH=80%></TD>
<TD WIDTH=10%>
<P ALIGN=RIGHT><A HREF="stacked.html">Next</A></P>
</TD>
</TR>
</TABLE>
<HR>
<H1>5.1 One-Dimensional Symbols</H1>
<P>One-Dimensional Symbols are what most people associate with the
term <I>barcode</I>. They consist of a number of bars and a number of
spaces of differing widths.</P>
<P><BR><BR>
</P>
<P><A NAME="CODE11"></A><FONT SIZE=5><B>5.1.1 Code 11</B></FONT></P>
<P>Developed by Intermec in 1977, Code 11 is similar to Code 2 of 5
Matrix and is primarily used in telecommunications. The symbol can
encode any length string consisting of the digits 0-9 and the dash
character (-). One modulo-11 check digit is calculated.</P>
<P ALIGN=CENTER><IMG SRC="code11.png" NAME="graphics1" ALIGN=LEFT WIDTH=225 HEIGHT=140 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P><A NAME="CODE25"></A><FONT SIZE=5><B>5.1.2 Code 2 of 5</B></FONT></P>
<P>Code 2 of 5 is a family of one-dimensional symbols, 8 of which are
supported by Zint.</P>
<P><A NAME="CODE25STAND"></A><FONT SIZE=4><B>5.1.2.1 Standard Code 2
of 5</B></FONT></P>
<P>Also known as Code 2 of 5 Matrix is a self-checking code used in
industrial applications and photo development. Standard Code 2 of 5
will encode any length numeric input (digits 0-9).</P>
<P><A NAME="IATA"></A><FONT SIZE=4><B>5.1.2.2 IATA Code 2 of 5</B></FONT></P>
<P>Used for baggage handling in the air-transport industry by the
International Air Transport Agency, this self-checking code will
encode any length numeric input (digits 0-9) and does not include a
check digit.</P>
<P><A NAME="IND25"></A><FONT SIZE=4><B>5.1.2.3 Industrial Code 2 of 5</B></FONT></P>
<P>Industrial Code 2 of 5 can encode any length numeric input (digits
0-9) and does not include a check digit.</P>
<P><A NAME="INTER25"></A><FONT SIZE=4><B>5.1.2.4 Interleaved Code 2
of 5</B></FONT></P>
<P>This self-checking symbology encodes pairs of numbers, and so can
only encode an even number of digits (0-9). If an odd number of
digits is entered a leading zero is added by Zint. No check digit is
added.</P>
<P><A NAME="DLOGIC"></A><FONT SIZE=4><B>5.1.2.5 Code 2 of 5 Data
Logic</B></FONT></P>
<P>Data Logic is a proprietary variation of Standard Code 2 of 5.
Data Logic does not include a check digit and can encode any length
numeric input (digits 0-9).</P>
<P><A NAME="ITF14"></A><FONT SIZE=4><B>5.1.2.6 ITF-14</B></FONT></P>
<P>ITF-14, also known as UPC Shipping Container Symbol, Case Code and
EAN-14, is based on Interleaved Code 2 of 5 and requires a 13 digit
numeric input (digits 0-9). One modulo-10 check digit is calculated.</P>
<P><A NAME="DPLEIT"></A><FONT SIZE=4><B>5.1.2.7 Deutche Post Leitcode</B></FONT></P>
<P>Leitcode is based on Interleaved Code 2 of 5 and is used by
Deutche Post for mailing purposes. Leitcode requires a 13-digit
numerical input and includes a check digit.</P>
<P><A NAME="DPIDENT"></A><FONT SIZE=4><B>5.1.2.8 Deutche Post
Identcode</B></FONT></P>
<P>Identcode is based on Interleaved Code 2 of 5 and is used by
Deutche Post for mailing purposes. Identcode requires an 11-digit
numerical input and includes a check digit.</P>
<P ALIGN=CENTER><IMG SRC="itf14.png" NAME="graphics2" ALIGN=LEFT WIDTH=451 HEIGHT=177 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P><A NAME="UPC"></A><FONT SIZE=5><B>5.1.3 Universal Product Code (EN
797)</B></FONT></P>
<P><A NAME="UPCA"></A><FONT SIZE=4><B>5.1.3.1 UPC Version A</B></FONT></P>
<P>UPC-A is used in the United States for retail applications. The
symbol requires an 11 digit article number. The check digit is
calculated by Zint. In addition EAN-2 and EAN-5 add-on symbols can be
added using the + character. For example, to draw a UPC-A symbol with
the data 72527270270 with an EAN-5 add-on showing the data 12345 use
the command:</P>
<P><FONT FACE="Courier, monospace"><FONT SIZE=2>zint --barcode=34 -d
72527270270+12345</FONT></FONT></P>
<P>or encode a data string with the + character included:
</P>
<P><FONT FACE="Courier, monospace"><FONT SIZE=2>my_symbol-&gt;symbology
= BARCODE_UPCA;<BR>error = ZBarcode_Encode_and_Print(my_symbol,
&quot;72527270270+12345&quot;);</FONT></FONT></P>
<P><A NAME="UPCE"></A><FONT SIZE=4><B>5.1.3.2 UPC Version E</B></FONT></P>
<P>UPC-E is a zero-compressed version of UPC-A developed for smaller
packages. The code requires a 6 digit article number (digits 0-9).
The check digit is calculated by Zint. EAN-2 and EAN-5 add-on symbols
can be added using the + character as with UPC-A. In addition Zint
also supports Number System 1 encoding by entering a 7-digit article
number stating with the digit 1. For example:</P>
<P><FONT FACE="Courier, monospace"><FONT SIZE=2>zint --barcode=37 -d
1123456</FONT></FONT></P>
<P>or</P>
<P><FONT FACE="Courier, monospace"><FONT SIZE=2>my_symbol-&gt;symbology
= BARCODE_UPCE;<BR>error = ZBarcode_Encode_and_Print(my_symbol,
&quot;1123456&quot;);</FONT></FONT></P>
<P><IMG SRC="upca.png" NAME="graphics3" ALIGN=LEFT WIDTH=272 HEIGHT=140 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P><A NAME="EAN"></A><FONT SIZE=5><B>5.1.4 European Article Number
(EN 797)</B></FONT></P>
<P><A NAME="EANX"></A><FONT SIZE=4><B>5.1.5.1 EAN-2, EAN-5, EAN-8 and
EAN-13</B></FONT></P>
<P>The EAN system is used in retail across Europe and includes
standards for EAN-2 and EAN-5 add-on codes, EAN-8 and EAN-13 which
encode 2, 5, 7 or 12 digit numbers respectively. Zint will decide
which symbology to use depending on the length of the input data. In
addition EAN-2 and EAN-5 add-on symbols can be added using the +
symbol as with UPC symbols. For example</P>
<P><FONT FACE="Courier, monospace"><FONT SIZE=2>zint --barcode=13 -d
54321</FONT></FONT></P>
<P>will encode a stand-alone EAN-5, whereas</P>
<P><FONT FACE="Courier, monospace"><FONT SIZE=2>zint --barcode=13 -d
7432365+54321</FONT></FONT></P>
<P>will encode an EAN-8 symbol with an EAN-5 add-on. As before these
results can be achieved using the API:</P>
<P><FONT FACE="Courier, monospace"><FONT SIZE=2>my_symbol-&gt;symbology
= BARCODE_EANX<BR>error = ZBarcode_Encode_and_Print(my_symbol,
&quot;54321&quot;);<BR>error = ZBarcode_Encode_and_Print(my_symbol,
&quot;7432365+54321&quot;);</FONT></FONT></P>
<P>All of the EAN symbols include check data which is added by Zint.</P>
<P><A NAME="ISBN"></A><FONT SIZE=4><B>5.1.4.2 SBN, ISBN and ISBN-13</B></FONT></P>
<P>EAN-13 symbols (also known as Bookland EAN-13) can also be
produced from 9-digit SBN, 10-digit ISBN or 13-digit ISBN-13 data.
The relevant check digit needs to be present in the input data and
will be verified before the symbol is generated. In addition EAN-2
and EAN-5 add-on symbols can be added using the + symbol as with UPC
symbols.</P>
<P><IMG SRC="ean13.png" NAME="graphics4" ALIGN=LEFT WIDTH=272 HEIGHT=140 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P><A NAME="PLESSEY"></A><FONT SIZE=5><B>5.1.5 Plessey</B></FONT></P>
<P>Also known as Plessey Code, this symbology was developed by the
Plessey Company Ltd. in the UK. The symbol can encode any length data
consisting of digits (0-9) or letters A-F and includes a CRC check
digit.</P>
<P ALIGN=CENTER><IMG SRC="plessey.png" NAME="graphics5" ALIGN=LEFT WIDTH=461 HEIGHT=140 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P><A NAME="MSI"></A><FONT SIZE=5><B>5.1.6 MSI Plessey</B></FONT></P>
<P>Based on Plessey and developed by MSE Data Corporation, MSI
Plessey is available with a range of check digit options. Any length
numeric (digits 0-9) input can be encoded. The table below shows the
options available:</P>
<CENTER>
<TABLE WIDTH=817 BORDER=1 CELLPADDING=4 CELLSPACING=3>
<COL WIDTH=139>
<COL WIDTH=263>
<COL WIDTH=377>
<THEAD>
<TR VALIGN=TOP>
<TH WIDTH=139>
<P>Symbology ID</P>
</TH>
<TH WIDTH=263>
<P>Symbology Name</P>
</TH>
<TH WIDTH=377>
<P>Check Digits</P>
</TH>
</TR>
</THEAD>
<TBODY>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>47</P>
</TD>
<TD WIDTH=263>
<P ALIGN=CENTER><FONT FACE="Courier, monospace">BARCODE_MSI_PLESSEY</FONT></P>
</TD>
<TD WIDTH=377>
<P ALIGN=CENTER>None</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>101</P>
</TD>
<TD WIDTH=263>
<P ALIGN=CENTER><FONT FACE="Courier, monospace">BARCODE_MSI_10</FONT></P>
</TD>
<TD WIDTH=377>
<P ALIGN=CENTER>Modulo-10</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>102</P>
</TD>
<TD WIDTH=263>
<P ALIGN=CENTER><FONT FACE="Courier, monospace">BARCODE_MSI_10_10</FONT></P>
</TD>
<TD WIDTH=377>
<P ALIGN=CENTER>Modulo-10 &amp; Modulo-10</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>103</P>
</TD>
<TD WIDTH=263>
<P ALIGN=CENTER><FONT FACE="Courier, monospace">BARCODE_MSI_11</FONT></P>
</TD>
<TD WIDTH=377>
<P ALIGN=CENTER>Modulo-11</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=139>
<P ALIGN=CENTER>104</P>
</TD>
<TD WIDTH=263>
<P ALIGN=CENTER><FONT FACE="Courier, monospace">BARCODE_MSI_11_10</FONT></P>
</TD>
<TD WIDTH=377>
<P ALIGN=CENTER>Modulo-11 &amp; Modulo-10</P>
</TD>
</TR>
</TBODY>
</TABLE>
</CENTER>
<P><BR><BR>
</P>
<P ALIGN=CENTER><IMG SRC="msi.png" NAME="graphics6" ALIGN=LEFT WIDTH=244 HEIGHT=140 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P><A NAME="TELEPEN"></A><FONT SIZE=5><B>5.1.7 Telepen</B></FONT></P>
<P><A NAME="TELEPENASCII"></A><FONT SIZE=4><B>5.1.7.1 Telepen Alpha</B></FONT></P>
<P>Telepen Alpha was developed by SB Electronic Systems Limited and
can encode any length of ASCII text input. Telepen includes a
modulo-127 check digit.</P>
<P><A NAME="TELENUM"></A><FONT SIZE=4><B>5.1.7.2 Telepen Numeric</B></FONT></P>
<P>Telepen Numeric allows compression of purely numeric data into a
Telepen symbol and includes a modulo-127 check digit.</P>
<P ALIGN=CENTER><IMG SRC="telepen.png" NAME="graphics7" ALIGN=LEFT WIDTH=378 HEIGHT=140 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P><A NAME="CODE39"></A><FONT SIZE=5><B>5.1.8 Code 39</B></FONT></P>
<P><A NAME="CODE39STAND"></A><FONT SIZE=4><B>5.1.8.1 Standard Code 39
(ISO 16388)</B></FONT></P>
<P>Standard Code 39 was developed in 1974 by Intermec. Input data can
be of any length and supports the characters 0-9, A-Z, dash (-), full
stop (.), space, asterisk (*), dollar ($), slash (/), plus (+) and
percent (%). The original standard (symbology 8) does not require a
check digit but a modulo-43 check digit can be added if required
(symbology 105).</P>
<P><A NAME="EXCODE39"></A><FONT SIZE=4><B>5.1.8.2 Extended Code 39</B></FONT></P>
<P>Also known as Code 39e and Code39+, this symbology expands on
Standard Code 39 to provide support to the full ASCII character set.
The original standard (symbology 9) does not require a check digit
but a modulo-43 check digit can be added if required (symbology 106).</P>
<P><A NAME="CODE93"></A><FONT SIZE=4><B>5.1.8.3 Code 93</B></FONT></P>
<P>A variation of Extended Code 39, Code 93 also supports full ASCII
text. Two check digits are added.</P>
<P><A NAME="PZN"></A><FONT SIZE=4><B>5.1.8.4 PZN</B></FONT></P>
<P>PZN is a Code 39 based symbology used by the pharmaceutical
industry in Germany. PZN encodes a 6 digit number and includes a
modulo-10 check digit.</P>
<P><A NAME="LOGMARS"></A><FONT SIZE=4><B>5.1.8.5 LOGMARS</B></FONT></P>
<P>LOGMARS (Logistics Applications of Automated Marking and Reading
Symbols) is a variation of the Code 39 symbology used by the US
Department of Defence. LOGMARS encodes the same character set as
Standard Code 39 and adds a modulo-43 check digit.</P>
<P ALIGN=CENTER><IMG SRC="code39.png" NAME="graphics8" ALIGN=LEFT WIDTH=244 HEIGHT=140 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P><A NAME="CODABAR"></A><FONT SIZE=5><B>5.1.9 Codabar (EN 798)</B></FONT></P>
<P>Also known as NW-7, Monarch, ABC Codabar, USD-4, Ames Code and
Code 27, this symbology was developed in 1972 by Monarch Marketing
Systems for retail purposes. The American Blood Commission adopted
Codabar in 1977 as the standard symbology for blood identification.
Codabar can encode any length string starting and ending with the
letters A-D and containing between these letters the numbers 0-9,
dash (-), dollar ($), colon (:), slash (/), full stop (.) or plus
(+). No check digit is generated.</P>
<P ALIGN=CENTER><IMG SRC="codabar.png" NAME="graphics9" ALIGN=LEFT WIDTH=194 HEIGHT=140 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P><A NAME="PHARMA"></A><FONT SIZE=5><B>5.1.10 Pharmacode</B></FONT></P>
<P>Developed by Laetus, Pharmacode One-Track is used for the
identification of pharmaceuticals. The symbology is able to encode
whole numbers between 3 and 131070.</P>
<P ALIGN=LEFT><IMG SRC="pharma.png" NAME="graphics10" ALIGN=LEFT WIDTH=116 HEIGHT=100 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P><A NAME="CODE128"></A><FONT SIZE=5><B>5.1.11 Code 128</B></FONT></P>
<P><A NAME="CODE128STAND"></A><FONT SIZE=4><B>5.1.11.1 Standard Code
128 (ISO 15417)</B></FONT></P>
<P>One of the most widely used one-dimensional barcode symbologies,
Code 128 was developed in 1981 by Computer Identics. This symbology
supports full ASCII text and uses a three-mode system to compress the
data into a smaller symbol. Zint automatically switches between modes
and adds a modulo-103 check digit. Code 128 is the default barcode
symbology used by Zint. In addition Zint supports the encoding of
Latin-1 (non-English) characters in Code 128 symbols. The Latin-1
character set is shown in <A HREF="appxa.html">Appendix A</A>.</P>
<P><A NAME="CODE128B"></A><FONT SIZE=4><B>5.1.11.2 Code 128 Subset B</B></FONT></P>
<P>It is sometimes advantageous to stop Code 128 from using subset
mode C which compresses numerical data. The <FONT FACE="Courier, monospace">BARCODE_CODE128B</FONT>
option suppresses mode C in favour of mode B.</P>
<P><A NAME="EAN128"></A><FONT SIZE=4><B>5.1.11.3 GS1-128</B></FONT></P>
<P>A variation of Code 128 also known as UCC/EAN-128, this symbology
is defined by the <A HREF="appxc.html">GS1 General Specification.</A>
Application Identifiers (AIs) should be entered using [square
brackets] notation. These will be converted to (round brackets) for
the human readable text. This will allow (round brackets) to be used
in the data strings to be encoded. Fixed length data should be
entered at the appropriate length for correct encoding - this is not
checked by Zint and incorrect length data will result in a symbol
which does not read correctly (see <A HREF="appxc.html">Appendix C</A>).
GS1-128 does not support extended ASCII characters. Check digits for
GTIN data (AI 01) are not generated and need to be included in input
data. The following is an example of a valid GS1-128 input:</P>
<P ALIGN=LEFT STYLE="font-weight: medium"><FONT FACE="Courier, monospace"><FONT SIZE=2>zint
--barcode=16 -d &quot;[01]98898765432106[3202]012345[15]991231&quot;</FONT></FONT></P>
<P><A NAME="NVE18"></A><FONT SIZE=4><B>5.1.11.4 NVE-18</B></FONT></P>
<P>A variation of Code 128 the Nummber der Versandeinheit standard
includes both modulo-10 and modulo-103 check digits. NVE-18 requires
a 17 digit numerical input.</P>
<P ALIGN=CENTER><IMG SRC="code128.png" NAME="graphics11" ALIGN=LEFT WIDTH=291 HEIGHT=140 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P ALIGN=LEFT><A NAME="DATABAR"></A><FONT SIZE=5><B>5.1.12 GS1
DataBar (ISO 24724)</B></FONT></P>
<P ALIGN=LEFT>Also known as RSS (Reduced Spaced Symbology) these
symbols are due to replace GS1-128 symbols starting in 2010 in
accordance with the <A HREF="http://www.gs1uk.org/EANUCC/WORD_Files/word.html">GS1
General Specification.</A> If a GS1 DataBar symbol is to be printed
with a 2D component as specified in ISO 24723 set <FONT FACE="Courier, monospace">option_1
= 2</FONT> or use the option <FONT FACE="Courier, monospace">--mode=2</FONT>
at the command prompt. See the section <A HREF="composite.html">Composite
Symbols</A> to generate DataBar symbols with 2D components.</P>
<P ALIGN=LEFT><A NAME="RSS14"></A><FONT SIZE=4><B>5.1.12.1 DataBar-14
and DataBar-14 Truncated</B></FONT></P>
<P ALIGN=LEFT STYLE="font-weight: medium"><FONT SIZE=3>Also known as
RSS-14 the DataBar-14 encodes a 13 digit item code. A check digit and
application identifier of (01) are added by Zint. Note that for full
standard compliance symbol height should be greater than or equal to
33 modules. For DataBar-14 Truncated set the symbol height to a
minimum of 13.</FONT></P>
<P ALIGN=LEFT><A NAME="RSSLTD"></A><FONT SIZE=4><B>5.1.12.2 DataBar
Limited</B></FONT></P>
<P ALIGN=LEFT STYLE="font-weight: medium"><FONT SIZE=3>Also known as
RSS Limited the DataBar Limited symbol also encodes 13 digit item
codes and can be used in the same way as DataBar-14 above. DataBar
Limited, however, is limited to data starting with digits 0 and 1
(i.e. numbers in the range 0 to 1999999999999). As with DataBar-14 a
check digit and application identifier of (01) are added by Zint.</FONT></P>
<P ALIGN=LEFT><A NAME="RSSEXP"></A><FONT SIZE=4><B>5.1.12.3 DataBar
Expanded</B></FONT></P>
<P ALIGN=LEFT><FONT SIZE=3><SPAN STYLE="font-weight: medium">Also
known as RSS Expanded this is a variable length symbology capable of
encoding data from a number of AIs in a single symbol. AIs should be
encased in [square brackets] in the input data. This will be
converted to (rounded brackets) before it is included in the human
readable text attached to the symbol. This method allows the
inclusion of rounded brackets in the data to be encoded. GTIN data
(AI 01) should also include the check digit data as this is not
calculated by Zint when this symbology is encoded. </SPAN></FONT><SPAN STYLE="font-weight: medium">Fixed
length data should be entered at the appropriate length for correct
encoding - this is not checked by Zint and incorrect length data will
result in a symbol which does not read correctly (see <A HREF="appxc.html">Appendix
C</A>). </SPAN><FONT SIZE=3><SPAN STYLE="font-weight: medium">The
following is an example of a valid DataBar Expanded input</SPAN></FONT></P>
<P ALIGN=LEFT STYLE="font-weight: medium"><FONT FACE="Courier, monospace"><FONT SIZE=2>zint
--barcode=31 -d &quot;[01]98898765432106[3202]012345[15]991231&quot;</FONT></FONT></P>
<P ALIGN=CENTER><IMG SRC="databar.png" NAME="graphics12" ALIGN=LEFT WIDTH=357 HEIGHT=140 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<HR>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0>
<TR VALIGN=TOP>
<TD WIDTH=33% HEIGHT=5>
<P ALIGN=LEFT><A HREF="symbologies.html">Prev</A></P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER><A HREF="index.html">Home</A></P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT><A HREF="stacked.html">Next</A></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=33%>
<P ALIGN=LEFT>Types of Symbol</P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER>&nbsp;</P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT>Stacked Symbols</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
</BODY>
</HTML>

BIN
docs/pdf417.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 566 B

BIN
docs/pharma.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 B

BIN
docs/pharma2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 B

BIN
docs/pink.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 B

BIN
docs/planet.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 B

BIN
docs/plessey.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
docs/postnet.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 B

BIN
docs/qr.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 B

BIN
docs/rm4scc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 B

172
docs/stacked.html Normal file
View File

@ -0,0 +1,172 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
<TITLE>Stacked Symbols</TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 2.3 (Linux)">
<META NAME="CREATED" CONTENT="20070730;21081900">
<META NAME="CHANGED" CONTENT="20080316;12224200">
<STYLE TYPE="text/css">
<!--
TD P { color: #000000 }
H1 { color: #000000 }
P { color: #000000 }
TH P { color: #000000 }
A:link { color: #0000ff }
A:visited { color: #840084 }
-->
</STYLE>
</HEAD>
<BODY LANG="en-GB" TEXT="#000000" LINK="#0000ff" VLINK="#840084" BGCOLOR="#ffffff" DIR="LTR">
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0 STYLE="page-break-before: always">
<TR>
<TH COLSPAN=3>
<P ALIGN=CENTER>Zint Barcode Generator</P>
</TH>
</TR>
<TR VALIGN=BOTTOM>
<TD WIDTH=10%>
<P ALIGN=LEFT><A HREF="onedim.html">Prev</A></P>
</TD>
<TD WIDTH=80%></TD>
<TD WIDTH=10%>
<P ALIGN=RIGHT><A HREF="composite.html">Next</A></P>
</TD>
</TR>
</TABLE>
<HR>
<H1 ALIGN=LEFT>5.2 Stacked Symbologies</H1>
<P ALIGN=LEFT><A NAME="BASIC"></A><FONT SIZE=5><B>5.2.1 Basic Symbol
Stacking</B></FONT></P>
<P ALIGN=LEFT>An early innovation to get more information into a
symbol, used primarily in the vehicle industry, is to simply stack
one-dimensional codes on top of each other. This can be achieved at
the command prompt by giving more than one set of input data. For
example</P>
<P ALIGN=LEFT><FONT FACE="Courier, monospace"><FONT SIZE=2>zint -d
'This' -d 'That'</FONT></FONT></P>
<P ALIGN=LEFT>will draw two Code 128 symbols, one on top of the
other. The same result can be achieved using the API by executing the
<FONT FACE="Courier, monospace">ZBarcode_Encode() </FONT>function
more than once on a symbol. For example:</P>
<P ALIGN=LEFT><FONT FACE="Courier, monospace"><FONT SIZE=2>my_symbol-&gt;symbology
= BARCODE_CODE128;<BR>error = ZBarcode_Encode(my_symbol,
&quot;This&quot;);<BR>error = ZBarcode_Encode(my_symbol,
&quot;That&quot;);<BR>error = ZBarcode_Print(my_symbol);</FONT></FONT></P>
<P ALIGN=LEFT>The example below shows 5 EAN-13 symbols stacked in
this way.</P>
<P ALIGN=LEFT><IMG SRC="stacked.png" NAME="graphics1" ALIGN=LEFT WIDTH=190 HEIGHT=100 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P ALIGN=LEFT><A NAME="CODE16K"></A><FONT SIZE=5><B>5.2.2 Code 16k
(EN 12323)</B></FONT></P>
<P ALIGN=LEFT>A more sophisticated method is to use some type of line
indexing which indicates to the barcode reader which order the
symbols should be read. This is demonstrated by Code 16k which uses a
Code128 based system which can stack up to 16 rows in a block. This
gives a maximum data capacity of 77 characters or 154 numerical
digits and includes two modulo-107 check digits. Code 16k also
supports extended ASCII character encoding in the same manner as Code
128.</P>
<P ALIGN=LEFT><IMG SRC="code16k.png" NAME="graphics2" ALIGN=LEFT WIDTH=212 HEIGHT=120 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P ALIGN=LEFT><A NAME="PDF417"></A><FONT SIZE=5><B>5.2.3 PDF417 (ISO
15438)</B></FONT></P>
<P ALIGN=LEFT>Heavily used in the parcel industry, the PDF417
symbology can encode a vast amount of data into a small space. Zint
supports encoding up to the ISO standard maximum symbol size of 925
codewords which (at error correction level 0) allows a maximum data
size of 1850 text characters, or 2710 digits. The width of the
generated PDF417 symbol can be specified at the command line using
the --cols switch followed by a number between 1 and 30, and the
amount of check digit information can be specified by using the
--security switch followed by a number between 0 and 8 where the
number of codewords used for check information is determined by
2<SUP>(value + 1)</SUP>. If using the API these values are assigned
to <FONT FACE="Courier, monospace">option_2</FONT> and <FONT FACE="Courier, monospace">option_1</FONT>
respectively. The default level of check information is determined by
the amount of data being encoded. International text support is
provided using the Latin-1 character set as described in <A HREF="appxa.html">Appendix
A</A>.</P>
<P ALIGN=LEFT><IMG SRC="pdf417.png" NAME="graphics3" ALIGN=LEFT WIDTH=240 HEIGHT=54 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P ALIGN=LEFT><A NAME="PDF417T"></A><FONT SIZE=5><B>5.2.4 Compact
PDF417</B></FONT></P>
<P ALIGN=LEFT>Also known as truncated PDF417. Options are as for
PDF417 above.</P>
<P ALIGN=LEFT><IMG SRC="compact417.png" NAME="graphics4" ALIGN=LEFT WIDTH=172 HEIGHT=54 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P ALIGN=LEFT><A NAME="MICROPDF"></A><FONT SIZE=5><B>5.2.5
MicroPDF417 (ISO 24728)</B></FONT></P>
<P ALIGN=LEFT>A variation of the PDF417 standard, MicroPDF417 is
intended for applications where symbol size needs to be kept to a
minimum. 34 pre-defined symbol sizes are available with 1 - 4 columns
and 4 - 44 rows. The maximum size MicroPDF417 symbol can hold 250
alphanumeric characters or 366 digits. The amount of error correction
used is dependant on symbol size. The number of columns used can be
determined using the <FONT FACE="Courier, monospace">--cols</FONT>
switch or <FONT FACE="Courier, monospace">option_2</FONT> as with
PDF417.</P>
<P ALIGN=LEFT><IMG SRC="micropdf.png" NAME="graphics5" ALIGN=LEFT WIDTH=110 HEIGHT=80 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P ALIGN=LEFT><A NAME="RSS14STACK"></A><FONT SIZE=5><B>5.2.6 GS1
DataBar-14 Stacked (ISO 24724)</B></FONT></P>
<P ALIGN=LEFT>A stacked variation of the GS1 DataBar-14 symbol
requiring the same input (see section <A HREF="onedim.html#RSS14">5.1.12.1</A>).
The height of this symbol is fixed. The data is encoded in two rows
of bars with a central finder pattern. This symbol can be generated
with a two-dimensional component to make a <A HREF="composite.html">composite
symbol</A>.</P>
<P ALIGN=LEFT><IMG SRC="dbstack.png" NAME="graphics6" ALIGN=LEFT WIDTH=100 HEIGHT=26 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P ALIGN=LEFT><A NAME="RSS14OMNI"></A><FONT SIZE=5><B>5.2.7 GS1
DataBar-14 Stacked Omnidirectional (ISO 24724)</B></FONT></P>
<P ALIGN=LEFT>Another variation of the GS1 DataBar-14 symbol
requiring the same input (see section <A HREF="onedim.html#RSS14">5.1.12.1</A>).
The data is encoded in two rows of bars with a central finder
pattern. This symbol can be generated with a two-dimensional
component to make a <A HREF="composite.html">composite symbol</A>.</P>
<P ALIGN=LEFT><IMG SRC="dbomni.png" NAME="graphics7" ALIGN=LEFT WIDTH=100 HEIGHT=138 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P ALIGN=LEFT><A NAME="RSSEXPSTACK"></A><FONT SIZE=5><B>5.2.8 GS1
DataBar Expanded Stacked (ISO 24724)</B></FONT></P>
<P ALIGN=LEFT>A stacked variation of the GS1 DataBar Expanded symbol
for smaller packages. Input is the same as for GS1 DataBar Expanded
(see section <A HREF="onedim.html#RSSEXP">5.1.12.3</A>). In addition
the width of the symbol can be altered using the <FONT FACE="Courier, monospace">--cols</FONT>
switch or <FONT FACE="Courier, monospace">option_2</FONT>. In this
case the number of columns relates to the number of character pairs
on each row of the symbol. For symbols with a 2D component the number
of columns must be at least 2. This symbol can be generated with a
two-dimensional component to make a <A HREF="composite.html">composite
symbol</A>.</P>
<P ALIGN=LEFT><IMG SRC="dbexpand.png" NAME="graphics8" ALIGN=LEFT WIDTH=204 HEIGHT=100 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<HR>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0>
<TR VALIGN=TOP>
<TD WIDTH=33% HEIGHT=5>
<P ALIGN=LEFT><A HREF="onedim.html">Prev</A></P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER><A HREF="index.html">Home</A></P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT><A HREF="composite.html">Next</A></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=33%>
<P ALIGN=LEFT>One-Dimensional Symbols</P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER>&nbsp;</P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT>Composite Symbols</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
</BODY>
</HTML>

BIN
docs/stacked.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 B

183
docs/symbologies.html Normal file
View File

@ -0,0 +1,183 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
<TITLE>Types of Symbol</TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 2.3 (Linux)">
<META NAME="CREATED" CONTENT="20070730;21081900">
<META NAME="CHANGED" CONTENT="20080316;13273800">
<STYLE TYPE="text/css">
<!--
TD P { color: #000000 }
H1 { color: #000000 }
P { color: #000000 }
TH P { color: #000000 }
A:link { color: #0000ff }
A:visited { color: #840084 }
-->
</STYLE>
</HEAD>
<BODY LANG="en-GB" TEXT="#000000" LINK="#0000ff" VLINK="#840084" BGCOLOR="#ffffff" DIR="LTR">
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0 STYLE="page-break-before: always">
<TR>
<TH COLSPAN=3>
<P ALIGN=CENTER>Zint Barcode Generator</P>
</TH>
</TR>
<TR VALIGN=BOTTOM>
<TD WIDTH=10%>
<P ALIGN=LEFT><A HREF="backend.html">Prev</A></P>
</TD>
<TD WIDTH=80%></TD>
<TD WIDTH=10%>
<P ALIGN=RIGHT><A HREF="onedim.html">Next</A></P>
</TD>
</TR>
</TABLE>
<HR>
<H1>5. Types of Symbol</H1>
<P STYLE="font-style: normal">This section is intended to be a brief
guide to the barcode symbologies supported by Zint. The symbologies
break down easily into groups as shown in the table below. Each group
has a page dedicated to it.</P>
<P ALIGN=JUSTIFY STYLE="margin-bottom: 0cm"><BR>
</P>
<CENTER>
<TABLE WIDTH=868 BORDER=1 CELLPADDING=4 CELLSPACING=3>
<COL WIDTH=265>
<COL WIDTH=318>
<COL WIDTH=247>
<THEAD>
<TR VALIGN=TOP>
<TH WIDTH=265>
<P>Symbol Type</P>
</TH>
<TH WIDTH=318>
<P>Example Symbol</P>
</TH>
<TH WIDTH=247>
<P>Example Symbologies</P>
</TH>
</TR>
</THEAD>
<TBODY>
<TR VALIGN=TOP>
<TD WIDTH=265>
<P ALIGN=CENTER><A HREF="onedim.html">One-Dimensional</A></P>
</TD>
<TD WIDTH=318>
<P ALIGN=CENTER><IMG SRC="box.png" NAME="graphics1" ALIGN=BOTTOM WIDTH=238 HEIGHT=120 BORDER=0></P>
</TD>
<TD WIDTH=247>
<P ALIGN=CENTER STYLE="font-style: normal; font-weight: medium">Code
11, Code 2 of 5, UPC, EAN, Plessey, MSI, Telepen, Code 39,
Codabar, Pharmacode</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=265>
<P ALIGN=CENTER><A HREF="stacked.html">Stacked Symbols</A></P>
</TD>
<TD WIDTH=318>
<P ALIGN=CENTER><IMG SRC="code16k.png" NAME="graphics2" ALIGN=BOTTOM WIDTH=212 HEIGHT=120 BORDER=0></P>
</TD>
<TD WIDTH=247>
<P ALIGN=CENTER STYLE="font-style: normal; font-weight: medium">Code
16k, PDF417</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=265>
<P ALIGN=CENTER><A HREF="composite.html">Composite Symbols</A></P>
</TD>
<TD WIDTH=318>
<P ALIGN=CENTER><IMG SRC="cca.png" NAME="graphics3" ALIGN=BOTTOM WIDTH=160 HEIGHT=146 BORDER=0></P>
</TD>
<TD WIDTH=247>
<P ALIGN=CENTER>CC-A, CC-B, CC-C</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=265>
<P ALIGN=CENTER><A HREF="twotrack.html">Two-Track Symbols</A></P>
</TD>
<TD WIDTH=318>
<P ALIGN=CENTER><IMG SRC="postnet.png" NAME="graphics4" ALIGN=BOTTOM WIDTH=246 HEIGHT=24 BORDER=0></P>
</TD>
<TD WIDTH=247>
<P ALIGN=CENTER STYLE="font-style: normal; font-weight: medium">Two-Track
Pharmacode, PostNet, PLANET</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=265>
<P ALIGN=CENTER><A HREF="fourstate.html">4-State Codes</A></P>
</TD>
<TD WIDTH=318>
<P ALIGN=CENTER><IMG SRC="auspost.png" NAME="graphics5" ALIGN=BOTTOM WIDTH=266 HEIGHT=20 BORDER=0></P>
</TD>
<TD WIDTH=247>
<P ALIGN=CENTER STYLE="font-style: normal; font-weight: medium">USPS
OneCode, RM4SCC, Australia Post 4-State Codes</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=265>
<P ALIGN=CENTER><A HREF="twodims.html">Two-Dimensional</A></P>
</TD>
<TD WIDTH=318>
<P ALIGN=CENTER><IMG SRC="qr.png" NAME="graphics6" ALIGN=BOTTOM WIDTH=50 HEIGHT=50 BORDER=0></P>
</TD>
<TD WIDTH=247>
<P ALIGN=CENTER STYLE="font-style: normal; font-weight: medium">Data
Matrix, QR Code, Maxicode</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=265>
<P ALIGN=CENTER><A HREF="markings.html">Other Markings</A></P>
</TD>
<TD WIDTH=318>
<P ALIGN=CENTER><IMG SRC="fim.png" NAME="graphics7" ALIGN=BOTTOM WIDTH=30 HEIGHT=100 BORDER=0></P>
</TD>
<TD WIDTH=247>
<P ALIGN=CENTER STYLE="font-style: normal; font-weight: medium">FIM,
Flattermarken</P>
</TD>
</TR>
</TBODY>
</TABLE>
</CENTER>
<P ALIGN=JUSTIFY><BR><BR>
</P>
<P><BR><BR>
</P>
<HR>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0>
<TR VALIGN=TOP>
<TD WIDTH=33% HEIGHT=5>
<P ALIGN=LEFT><A HREF="backend.html">Prev</A></P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER><A HREF="index.html">Home</A></P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT><A HREF="onedim.html">Next</A></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=33%>
<P ALIGN=LEFT>Using the API</P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER>&nbsp;</P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT>One-Dimensional Symbols</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
</BODY>
</HTML>

BIN
docs/telepen.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 984 B

375
docs/twodims.html Normal file
View File

@ -0,0 +1,375 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
<TITLE>Two-Dimensional Symbols</TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 2.3 (Linux)">
<META NAME="CREATED" CONTENT="20070730;21081900">
<META NAME="CHANGED" CONTENT="20080422;8283700">
<STYLE TYPE="text/css">
<!--
TD P { color: #000000 }
H1 { color: #000000 }
P { color: #000000 }
TH P { color: #000000 }
A:link { color: #0000ff }
A:visited { color: #840084 }
-->
</STYLE>
</HEAD>
<BODY LANG="en-GB" TEXT="#000000" LINK="#0000ff" VLINK="#840084" BGCOLOR="#ffffff" DIR="LTR">
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0 STYLE="page-break-before: always">
<TR>
<TH COLSPAN=3>
<P ALIGN=CENTER>Zint Barcode Generator</P>
</TH>
</TR>
<TR VALIGN=BOTTOM>
<TD WIDTH=10%>
<P ALIGN=LEFT><A HREF="fourstate.html">Prev</A></P>
</TD>
<TD WIDTH=80%></TD>
<TD WIDTH=10%>
<P ALIGN=RIGHT><A HREF="markings.html">Next</A></P>
</TD>
</TR>
</TABLE>
<HR>
<H1>5.6 Two-Dimensional Symbols</H1>
<P><A NAME="DMATRIX"></A><FONT SIZE=5><B>5.6.1 Data Matrix (ISO
16022)</B></FONT></P>
<P>Also known as Semacode this symbology can encode a large amount of
data in a small area. Any length ASCII string can be encoded up to
780 characters. Symbol size is determined by the length of the input
data and Reed-Solomon error correction is added.</P>
<P ALIGN=CENTER><IMG SRC="matrix.png" NAME="graphics1" ALIGN=LEFT WIDTH=44 HEIGHT=44 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P><A NAME="QRCODE"></A><FONT SIZE=5><B>5.6.2 QR Code (ISO 18004)</B></FONT></P>
<P>Also known as Quick Response Code this symbology was developed by
Denso. QR Code support in Zint relies on <I>libqrencode</I> (version
2.0.0) which is available from
<A HREF="http://megaui.net/fukuchi/works/qrencode/index.en.html">http://megaui.net/fukuchi/works/qrencode/index.en.html</A>.
Support for QR Code through <I>libzint</I> means that developers only
need to write handlers for one API which covers QR Code as well as
all of the other code symbologies provided by <I>libzint</I>. Four
levels of error correction are available using the <FONT FACE="Courier, monospace">security=</FONT>
option or setting <FONT FACE="Courier, monospace">option_1</FONT> as
shown in the following table.</P>
<DL>
<DL>
<DL>
<DL>
<DL>
<DL>
<DL>
<DD>
<TABLE WIDTH=715 BORDER=1 CELLPADDING=4 CELLSPACING=3>
<COL WIDTH=74>
<COL WIDTH=113>
<COL WIDTH=261>
<COL WIDTH=218>
<TR VALIGN=TOP>
<TD WIDTH=74>
<P ALIGN=CENTER><B>Input</B></P>
</TD>
<TD WIDTH=113>
<P ALIGN=CENTER><B>ECC Level</B></P>
</TD>
<TD WIDTH=261>
<P ALIGN=CENTER><B>Error Correction Capacity</B></P>
</TD>
<TD WIDTH=218>
<P ALIGN=CENTER><B>Recovery Capacity</B></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=74>
<P ALIGN=CENTER>1</P>
</TD>
<TD WIDTH=113>
<P ALIGN=CENTER>L (default)</P>
</TD>
<TD WIDTH=261>
<P ALIGN=CENTER>Approx 20% of symbol</P>
</TD>
<TD WIDTH=218>
<P ALIGN=CENTER>Approx 7%</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=74>
<P ALIGN=CENTER>2</P>
</TD>
<TD WIDTH=113>
<P ALIGN=CENTER>M</P>
</TD>
<TD WIDTH=261>
<P ALIGN=CENTER>Approx 37% of symbol</P>
</TD>
<TD WIDTH=218>
<P ALIGN=CENTER>Approx 15%</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=74>
<P ALIGN=CENTER>3</P>
</TD>
<TD WIDTH=113>
<P ALIGN=CENTER>Q</P>
</TD>
<TD WIDTH=261>
<P ALIGN=CENTER>Approx 55% of symbol</P>
</TD>
<TD WIDTH=218>
<P ALIGN=CENTER>Approx 25%</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=74>
<P ALIGN=CENTER>4</P>
</TD>
<TD WIDTH=113>
<P ALIGN=CENTER>H</P>
</TD>
<TD WIDTH=261>
<P ALIGN=CENTER>Approx 65% of symbol</P>
</TD>
<TD WIDTH=218>
<P ALIGN=CENTER>Approx 30%</P>
</TD>
</TR>
</TABLE>
</DL>
</DL>
</DL>
</DL>
</DL>
</DL>
</DL>
<P><BR><BR>
</P>
<P>The size of the symbol can be set by using the <FONT FACE="Courier, monospace">vers=</FONT>
option or setting <FONT FACE="Courier, monospace">option_2</FONT> to
the QR Code version required (1-40). The maximum capacity of a
(version 40) QR Code symbol is 7089 numeric digits, 4296 alphanumeric
characters or 2953 bytes of data.</P>
<P ALIGN=CENTER><IMG SRC="qr.png" NAME="graphics2" ALIGN=LEFT WIDTH=50 HEIGHT=50 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P><A NAME="MAXI"></A><FONT SIZE=5><B>5.6.3 Maxicode (ISO 16023)</B></FONT></P>
<P ALIGN=LEFT>Developed by UPS the Maxicode symbology employs a grid
of hexagons surrounding a 'bulls-eye' finder pattern. This symbology
is designed for the identification of parcels. Zint encodes Maxicode
symbols in Mode 2 or Mode 3 depending on the postcode data entered.
In these modes Maxicode symbols are composed of two parts named the
primary and secondary messages. The primary message consists of a
structured data field which includes various data about the package
being sent, the secondary message usually consists of address data in
a data structure. The format of the primary message is given in the
following table:
</P>
<CENTER>
<TABLE WIDTH=810 BORDER=1 CELLPADDING=4 CELLSPACING=3>
<COL WIDTH=270>
<COL WIDTH=513>
<THEAD>
<TR VALIGN=TOP>
<TH WIDTH=270>
<P>Characters</P>
</TH>
<TH WIDTH=513>
<P>Meaning</P>
</TH>
</TR>
</THEAD>
<TBODY>
<TR VALIGN=TOP>
<TD WIDTH=270>
<P ALIGN=CENTER>1-9</P>
</TD>
<TD WIDTH=513>
<P ALIGN=CENTER>Postcode data which can consist of up to 9
digits (for mode 2) or up to 6 alphanumeric characters (for mode
3). Remaining unused characters should be filled with the SPACE
character (ASCII 32).</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=270>
<P ALIGN=CENTER>10-12</P>
</TD>
<TD WIDTH=513>
<P ALIGN=CENTER>Three digit country code according to ISO 3166
(see <A HREF="appxb.html">Appendix B</A>).</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=270>
<P ALIGN=CENTER>13-15</P>
</TD>
<TD WIDTH=513>
<P ALIGN=CENTER>Three digit service code. This depends on your
parcel courier.</P>
</TD>
</TR>
</TBODY>
</TABLE>
</CENTER>
<P ALIGN=LEFT><BR><BR>
</P>
<P ALIGN=LEFT>The primary message can be designated at the command
prompt using the <FONT FACE="Courier, monospace">--primary=</FONT>
switch. The secondary message uses the normal data entry method. For
example:</P>
<P ALIGN=LEFT><FONT FACE="Courier, monospace">zint -o test.eps -b 57
--primary='999999999840012' -d 'Secondary Message Here'</FONT></P>
<P ALIGN=LEFT>When using the API the primary message must be placed
in the <FONT FACE="Courier, monospace">symbol-&gt;primary</FONT>
string. The secondary is entered in the same way as described in
section 4.2.</P>
<P ALIGN=LEFT>Modes 4 to 6 can be encoded using the <FONT FACE="Courier, monospace">--mode=</FONT>
switch or by setting <FONT FACE="Courier, monospace">option_1</FONT>.
Modes 4 to 6 do not require a primary message. For example:</P>
<P ALIGN=LEFT><FONT FACE="Courier, monospace">zint -o test.eps -b 57
--mode=4 -d 'A MaxiCode Message in Mode 4'</FONT></P>
<P ALIGN=LEFT>Mode 6 is reserved for the maintenance of scanner
hardware and should not be used to encode user data. All modes
support extended ASCII characters and number compression. The maximum
length of text which can be placed in a Maxicode symbol depends on
the type of characters used in the text. Example maximum data lengths
are given in the table below:</P>
<CENTER>
<TABLE WIDTH=664 BORDER=1 CELLPADDING=4 CELLSPACING=3>
<COL WIDTH=138>
<COL WIDTH=160>
<COL WIDTH=164>
<COL WIDTH=153>
<THEAD>
<TR VALIGN=TOP>
<TH WIDTH=138>
<P>Mode</P>
</TH>
<TH WIDTH=160>
<P>Maximum Data Length for Capital Letters</P>
</TH>
<TH WIDTH=164>
<P>Maximum Data Length for Numeric Digits</P>
</TH>
<TH WIDTH=153>
<P>Number of Error Correction Codewords</P>
</TH>
</TR>
</THEAD>
<TBODY>
<TR VALIGN=TOP>
<TD WIDTH=138>
<P ALIGN=CENTER>2 (secondary only)</P>
</TD>
<TD WIDTH=160>
<P ALIGN=CENTER>84</P>
</TD>
<TD WIDTH=164>
<P ALIGN=CENTER>126</P>
</TD>
<TD WIDTH=153>
<P ALIGN=CENTER>50</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=138>
<P ALIGN=CENTER>3 (secondary only)</P>
</TD>
<TD WIDTH=160>
<P ALIGN=CENTER>84</P>
</TD>
<TD WIDTH=164>
<P ALIGN=CENTER>126</P>
</TD>
<TD WIDTH=153>
<P ALIGN=CENTER>50</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=138>
<P ALIGN=CENTER>4</P>
</TD>
<TD WIDTH=160>
<P ALIGN=CENTER>93</P>
</TD>
<TD WIDTH=164>
<P ALIGN=CENTER>135</P>
</TD>
<TD WIDTH=153>
<P ALIGN=CENTER>50</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=138>
<P ALIGN=CENTER>5</P>
</TD>
<TD WIDTH=160>
<P ALIGN=CENTER>77</P>
</TD>
<TD WIDTH=164>
<P ALIGN=CENTER>110</P>
</TD>
<TD WIDTH=153>
<P ALIGN=CENTER>66</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=138>
<P ALIGN=CENTER>6</P>
</TD>
<TD WIDTH=160>
<P ALIGN=CENTER>93</P>
</TD>
<TD WIDTH=164>
<P ALIGN=CENTER>135</P>
</TD>
<TD WIDTH=153>
<P ALIGN=CENTER>50</P>
</TD>
</TR>
</TBODY>
</TABLE>
</CENTER>
<P ALIGN=LEFT><BR><BR>
</P>
<P ALIGN=LEFT><B>PLEASE NOTE</B> that due to the unique style of the
Maxicode symbol not all of the options available for other
symbologies are available. Settings for height, whitespace width,
border width and output options will be ignored. Colour options are
available as with other symbologies. PNG output is set at a
resolution of 12 pixels per millimetre (approx 300 dpi) and uses the
methods set out in Annex J of the ISO/IEC standard.</P>
<P ALIGN=LEFT><IMG SRC="maxicode.png" NAME="graphics3" ALIGN=LEFT WIDTH=150 HEIGHT=150 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<HR>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0>
<TR VALIGN=TOP>
<TD WIDTH=33% HEIGHT=5>
<P ALIGN=LEFT><A HREF="fourstate.html">Prev</A></P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER><A HREF="index.html">Home</A></P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT><A HREF="markings.html">Next</A></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=33%>
<P ALIGN=LEFT>4-State Codes</P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER>&nbsp;</P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT>Markings</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
</BODY>
</HTML>

95
docs/twotrack.html Normal file
View File

@ -0,0 +1,95 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
<TITLE>Two-Track Symbols</TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 2.3 (Linux)">
<META NAME="CREATED" CONTENT="20070730;21081900">
<META NAME="CHANGED" CONTENT="20080316;13023600">
<STYLE TYPE="text/css">
<!--
TD P { color: #000000 }
H1 { color: #000000 }
P { color: #000000 }
TH P { color: #000000 }
A:link { color: #0000ff }
A:visited { color: #840084 }
-->
</STYLE>
</HEAD>
<BODY LANG="en-GB" TEXT="#000000" LINK="#0000ff" VLINK="#840084" BGCOLOR="#ffffff" DIR="LTR">
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0 STYLE="page-break-before: always">
<TR>
<TH COLSPAN=3>
<P ALIGN=CENTER>Zint Barcode Generator</P>
</TH>
</TR>
<TR VALIGN=BOTTOM>
<TD WIDTH=10%>
<P ALIGN=LEFT><A HREF="composite.html">Prev</A></P>
</TD>
<TD WIDTH=80%></TD>
<TD WIDTH=10%>
<P ALIGN=RIGHT><A HREF="fourstate.html">Next</A></P>
</TD>
</TR>
</TABLE>
<HR>
<H1 ALIGN=LEFT>5.4 Two-Track Symbols</H1>
<P ALIGN=LEFT><A NAME="PHARMA"></A><FONT SIZE=5><B>5.4.1 Two-Track
Pharmacode</B></FONT></P>
<P ALIGN=LEFT>Developed by Laetus, Pharmacode Two-Track is an
alternative system to Pharmacode One-Track used for the
identification of pharmaceuticals. The symbology is able to encode
whole numbers between 4 and 64570080.</P>
<P ALIGN=LEFT><IMG SRC="pharma2.png" NAME="graphics1" ALIGN=LEFT WIDTH=58 HEIGHT=100 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P ALIGN=LEFT><A NAME="POSTNET"></A><FONT SIZE=5><B>5.4.2 PostNet</B></FONT></P>
<P ALIGN=LEFT>Used by the United States Postal Service and due to be
superseded by the OneCode system by 2009, the PostNet barcode is used
for encoding zip-codes on mail items. PostNet uses numerical input
data and includes a modulo-10 check digit. While Zint will encode
PostNet symbols of any length, standard lengths used by USPS are
PostNet6 (5 digits ZIP input), PostNet10 (5 digit ZIP + 4 digit user
data) and PostNet12 (5 digit ZIP + 6 digit user data).</P>
<P ALIGN=LEFT><IMG SRC="postnet.png" NAME="graphics2" ALIGN=LEFT WIDTH=246 HEIGHT=24 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<P ALIGN=LEFT><A NAME="PLANET"></A><FONT SIZE=5><B>5.4.3 PLANET</B></FONT></P>
<P ALIGN=LEFT>Used by the United States Postal Service and due to be
superseded by the OneCode system by 2009, the PLANET (Postal Alpha
Numeric Encoding Technique) barcode is used for encoding routing data
on mail items. Planet uses numerical input data and includes a
modulo-10 check digit. While Zint will encode PLANET symbols of any
length, standard lengths used by USPS are Planet12 (11 digit input)
and Planet14 (13 digit input).</P>
<P ALIGN=LEFT><IMG SRC="planet.png" NAME="graphics3" ALIGN=LEFT WIDTH=286 HEIGHT=24 BORDER=0><BR CLEAR=LEFT><BR><BR>
</P>
<HR>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0>
<TR VALIGN=TOP>
<TD WIDTH=33% HEIGHT=5>
<P ALIGN=LEFT><A HREF="composite.html">Prev</A></P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER><A HREF="index.html">Home</A></P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT><A HREF="fourstate.html">Next</A></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD WIDTH=33%>
<P ALIGN=LEFT>Composite Symbols</P>
</TD>
<TD WIDTH=34%>
<P ALIGN=CENTER>&nbsp;</P>
</TD>
<TD WIDTH=33%>
<P ALIGN=RIGHT>4-State Codes</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
</BODY>
</HTML>

BIN
docs/upca.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

674
frontend/COPYING Normal file
View File

@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

24
frontend/Makefile Normal file
View File

@ -0,0 +1,24 @@
# Linux makefile for zint - requires libzint
#
# make compiles zint
# make install copies binary to /usr/local/bin
# make uninstall removes the binary
# make clean cleans up a previous compilation and any object or editor files
#
CC := gcc
INCLUDE := -I/usr/local/include
zint: main.c
$(CC) $(INCLUDE) -g main.c -o zint -lzint
.PHONY: install uninstall clean dist
clean:
rm -f zint *.o *.a *~ *.png *.eps
install:
mv zint /usr/local/bin
uninstall:
rm /usr/local/bin/zint

239
frontend/main.c Normal file
View File

@ -0,0 +1,239 @@
/* main.c - Command line handling routines for Zint */
/*
libzint - the open source barcode library
Copyright (C) 2008 Robin Stuart <zint@hotmail.co.uk>
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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <zint.h>
#define NESET "0123456789"
void usage(void)
{
printf(
"Zint version %s\n"
"Encode input data in a barcode and save as a PNG or EPS file.\n\n"
" -h, --help Display this message.\n"
" -o, --output=FILE Write image to FILE. (default is out.png)\n"
" -d, --data=DATA Barcode content.\n"
" -b, --barcode=NUMBER Number of barcode type (default is 20 (=Code128)).\n"
" --height=HEIGHT Height of my_symbol in pixels.\n"
" -w, --whitesp=NUMBER Width of whitespace in pixels.\n"
" --border=NUMBER Width of border in pixels.\n"
" --box Add a box.\n"
" --bind Add boundary bars.\n"
" -r, --reverse Reverse colours (white on black).\n"
" --fg=COLOUR Specify a foreground colour.\n"
" --bg=COLOUR Specify a background colour.\n"
" --cols=NUMBER (PDF417) Number of columns.\n"
" --vers=NUMBER (QR Code) Version\n"
" --secure=NUMBER (PDF417 and QR Code) Error correction level.\n"
" --primary=STRING (Maxicode and Composite) Structured primary message.\n"
" --mode=NUMBER (Maxicode and Composite) Set encoding mode.\n"
, VERSION);
}
int main(int argc, char **argv)
{
struct zint_symbol *my_symbol;
int i, mode, stack_row;
int c;
int errornum;
errornum = 0;
my_symbol = ZBarcode_Create();
if(argc == 1) {
usage();
exit(1);
}
while(1) {
int option_index = 0;
static struct option long_options[] = {
{"help", 0, 0, 'h'},
{"bind", 0, 0, 0},
{"box", 0, 0, 0},
{"barcode=", 1, 0, 'b'},
{"height=", 1, 0, 0},
{"whitesp=", 1, 0, 'w'},
{"border=", 1, 0, 0},
{"data=", 1, 0, 'd'},
{"output=", 1, 0, 'o'},
{"fg=", 1, 0, 0},
{"bg=", 1, 0, 0},
{"cols=", 1, 0, 0},
{"vers=", 1, 0, 0},
{"secure=", 1, 0, 0},
{"reverse", 1, 0, 'r'},
{"case", 0, 0, 'c'},
{"mode=", 1, 0, 0},
{"primary=", 1, 0, 0},
{0, 0, 0, 0}
};
c = getopt_long(argc, argv, "hb:w:d:o:i:rcmp", long_options, &option_index);
if(c == -1) break;
switch(c) {
case 0:
if(!strcmp(long_options[option_index].name, "bind")) {
my_symbol->output_options = BARCODE_BIND;
}
if(!strcmp(long_options[option_index].name, "box")) {
my_symbol->output_options = BARCODE_BOX;
}
if(!strcmp(long_options[option_index].name, "fg=")) {
strncpy(my_symbol->fgcolour, optarg, 7);
}
if(!strcmp(long_options[option_index].name, "bg=")) {
strncpy(my_symbol->bgcolour, optarg, 7);
}
if(!strcmp(long_options[option_index].name, "border=")) {
errornum = is_sane(NESET, optarg);
if(errornum == ERROR_INVALID_DATA) {
fprintf(stderr, "Invalid border width\n");
exit(1);
}
if((atoi(optarg) >= 0) && (atoi(optarg) <= 1000)) {
my_symbol->border_width = atoi(optarg);
} else {
fprintf(stderr, "Border width out of range\n");
}
}
if(!strcmp(long_options[option_index].name, "height=")) {
errornum = is_sane(NESET, optarg);
if(errornum == ERROR_INVALID_DATA) {
fprintf(stderr, "Invalid symbol height\n");
exit(1);
}
if((atoi(optarg) >= 1) && (atoi(optarg) <= 1000)) {
my_symbol->height = atoi(optarg);
} else {
fprintf(stderr, "Symbol height out of range\n");
}
}
if(!strcmp(long_options[option_index].name, "cols=")) {
if((atoi(optarg) >= 1) && (atoi(optarg) <= 30)) {
my_symbol->option_2 = atoi(optarg);
} else {
fprintf(stderr, "Number of columns out of range\n");
}
}
if(!strcmp(long_options[option_index].name, "vers=")) {
if((atoi(optarg) >= 1) && (atoi(optarg) <= 40)) {
my_symbol->option_2 = atoi(optarg);
} else {
fprintf(stderr, "Invalid QR Code version\n");
}
}
if(!strcmp(long_options[option_index].name, "secure=")) {
if((atoi(optarg) >= 1) && (atoi(optarg) <= 8)) {
my_symbol->option_1 = atoi(optarg);
} else {
fprintf(stderr, "ECC level out of range\n");
}
}
if(!strcmp(long_options[option_index].name, "primary=")) {
if(strlen(optarg) <= 90) {
strcpy(my_symbol->primary, optarg);
} else {
fprintf(stderr, "Primary data string too long");
}
}
if(!strcmp(long_options[option_index].name, "mode=")) {
/* Don't allow specification of modes 2 and 3 - do it
automagically instead */
if((optarg[0] >= '0') && (optarg[0] <= '6')) {
my_symbol->option_1 = optarg[0] - '0';
} else {
fprintf(stderr, "Invalid mode\n");
}
}
break;
case 'h':
usage();
break;
case 'b':
errornum = is_sane(NESET, optarg);
if(errornum == ERROR_INVALID_DATA) {
printf("Invalid barcode type\n");
exit(1);
}
my_symbol->symbology = atoi(optarg);
break;
case 'w':
errornum = is_sane(NESET, optarg);
if(errornum == ERROR_INVALID_DATA) {
printf("Invalid whitespace value\n");
exit(1);
}
if((atoi(optarg) >= 0) && (atoi(optarg) <= 1000)) {
my_symbol->whitespace_width = atoi(optarg);
} else {
fprintf(stderr, "Whitespace value out of range");
}
break;
case 'd': /* we have some data! */
if(ZBarcode_Encode_and_Print(my_symbol, optarg) != 0) {
printf("%s\n", my_symbol->errtxt);
return 1;
}
break;
case 'o':
strncpy(my_symbol->outfile, optarg, 250);
break;
case 'r':
strcpy(my_symbol->fgcolour, "ffffff");
strcpy(my_symbol->bgcolour, "000000");
break;
case '?':
break;
default:
printf("?? getopt error 0%o\n", c);
}
}
if (optind < argc) {
printf("Invalid option ");
while (optind < argc)
printf("%s", argv[optind++]);
printf("\n");
}
if(strcmp(my_symbol->errtxt, "")) {
printf(my_symbol->errtxt);
printf("\n");
}
ZBarcode_Delete(my_symbol);
return errornum;
}

258
frontend/test.sh Executable file
View File

@ -0,0 +1,258 @@
echo testing Code 11
zint -o bar01.png -b 1 --height=50 -d 87654321
zint -o bar01.eps -b 1 --height=50 -d 87654321
echo testing Code 2 of 5 Standard
zint -o bar02.png -b 2 --height=50 -d 87654321
zint -o bar02.eps -b 2 --height=50 -d 87654321
echo testing Interleaved 2 of 5
zint -o bar03.png -b 3 --height=50 -d 87654321
zint -o bar03.eps -b 3 --height=50 -d 87654321
echo testing Code 2 of 5 IATA
zint -o bar04.png -b 4 --height=50 -d 87654321
zint -o bar04.eps -b 4 --height=50 -d 87654321
echo testing Code 2 of 5 Data Logic
zint -o bar06.png -b 6 --height=50 -d 87654321
zint -o bar06.eps -b 6 --height=50 -d 87654321
echo testing Code 2 of 5 Industrial
zint -o bar07.png -b 7 --height=50 -d 87654321
zint -o bar07.eps -b 7 --height=50 -d 87654321
echo testing Code 39
zint -o bar08.png -b 8 --height=50 -d CODE39
zint -o bar08.eps -b 8 --height=50 -d CODE39
echo testing Extended Code 39
zint -o bar09.png -b 9 --height=50 -d 'Code 39e'
zint -o bar09.eps -b 9 --height=50 -d 'Code 39e'
echo testing EAN8
zint -o bar10.png -b 13 --height=50 -d 7654321
zint -o bar10.eps -b 13 --height=50 -d 7654321
echo testing EAN8 - 2 digits add on
zint -o bar11.png -b 13 --height=50 -d 7654321+21
zint -o bar11.eps -b 13 --height=50 -d 7654321+21
echo testing EAN8 - 5 digits add-on
zint -o bar12.png -b 13 --height=50 -d 7654321+54321
zint -o bar12.eps -b 13 --height=50 -d 7654321+54321
echo testing EAN13
zint -o bar13.png -b 13 --height=50 -d 210987654321
zint -o bar13.eps -b 13 --height=50 -d 210987654321
echo testing EAN13 - 2 digits add-on
zint -o bar14.png -b 13 --height=50 -d 210987654321+21
zint -o bar14.eps -b 13 --height=50 -d 210987654321+21
echo testing EAN13 - 5 digits add-on
zint -o bar15.png -b 13 --height=50 -d 210987654321+54321
zint -o bar15.eps -b 13 --height=50 -d 210987654321+54321
echo testing GS1-128
zint -o bar16.png -b 16 --height=50 -d "[01]98898765432106[3202]012345[15]991231"
zint -o bar16.eps -b 16 --height=50 -d "[01]98898765432106[3202]012345[15]991231"
echo testing CodaBar
zint -o bar18.png -b 18 --height=50 -d D765432C
zint -o bar18.eps -b 18 --height=50 -d D765432C
echo testing Code 128
zint -o bar20.png -b 20 --height=50 -d 'Code 128'
zint -o bar20.eps -b 20 --height=50 -d 'Code 128'
echo testing Deutshe Post Leitcode
zint -o bar21.png -b 21 --height=50 -d 3210987654321
zint -o bar21.eps -b 21 --height=50 -d 3210987654321
echo testing Deutche Post Identcode
zint -o bar22.png -b 22 --height=50 -d 10987654321
zint -o bar22.eps -b 22 --height=50 -d 10987654321
echo testing Code 16k
zint -o bar23.png -b 23 --height=50 -d 'Code 16k is a stacked symbology'
zint -o bar23.eps -b 23 --height=50 -d 'Code 16k is a stacked symbology'
echo testing Code 93
zint -o bar25.png -b 25 --height=50 -d 'Code 93'
zint -o bar25.eps -b 25 --height=50 -d 'Code 93'
echo testing Flattermarken
zint -o bar28.png -b 28 --height=50 -d 87654321
zint -o bar28.eps -b 28 --height=50 -d 87654321
echo testing GS1 DataBar-14
zint -o bar29.png -b 29 --height=33 -d 2001234567890
zint -o bar29.eps -b 29 --height=33 -d 2001234567890
echo testing GS1 DataBar Limited
zint -o bar30.png -b 30 --height=50 -w 2 -d 31234567890
zint -o bar30.eps -b 30 --height=50 -w 2 -d 31234567890
echo testing GS1 DataBar Expanded
zint -o bar31.png -b 31 --height=50 -d "[01]90012345678908[3103]001750"
zint -o bar31.eps -b 31 --height=50 -d "[01]90012345678908[3103]001750"
echo testing Telepen Alpha
zint -o bar32.png -b 32 --height=50 -d 'Telepen'
zint -o bar32.eps -b 32 --height=50 -d 'Telepen'
echo testing UPC A
zint -o bar34.png -b 34 --height=50 -d 10987654321
zint -o bar34.eps -b 34 --height=50 -d 10987654321
echo testing UPC A - 2 digit add-on
zint -o bar35.png -b 34 --height=50 -d 10987654321+21
zint -o bar35.eps -b 34 --height=50 -d 10987654321+21
echo testing UPC A - 5 digit add-on
zint -o bar36.png -b 36 --height=50 -d 10987654321+54321
zint -o bar36.eps -b 36 --height=50 -d 10987654321+54321
echo testing UPC E
zint -o bar37.png -b 37 --height=50 -d 654321
zint -o bar37.eps -b 37 --height=50 -d 654321
echo testing UPC E - 2 digit add-on
zint -o bar38.png -b 37 --height=50 -d 654321+21
zint -o bar38.eps -b 37 --height=50 -d 654321+21
echo testing UPC E - 5 digit add-on
zint -o bar39.png -b 37 --height=50 -d 654321+54321
zint -o bar39.eps -b 37 --height=50 -d 654321+54321
echo testing PostNet-6
zint -o bar41.png -b 40 -d 54321
zint -o bar41.eps -b 40 -d 54321
echo testing PostNet-10
zint -o bar43.png -b 40 -d 987654321
zint -o bar43.eps -b 40 -d 987654321
echo testing PostNet-12
zint -o bar45.png -b 40 -d 10987654321
zint -o bar45.eps -b 40 -d 10987654321
echo testing MSI Code
zint -o bar47.png -b 47 --height=50 -d 87654321
zint -o bar47.eps -b 47 --height=50 -d 87654321
echo testing FIM
zint -o bar49.png -b 49 --height=50 -d D
zint -o bar49.eps -b 49 --height=50 -d D
echo testing LOGMARS
zint -o bar50.png -b 50 --height=50 -d LOGMARS
zint -o bar50.eps -b 50 --height=50 -d LOGMARS
echo testing Pharmacode One-Track
zint -o bar51.png -b 51 --height=50 -d 123456
zint -o bar51.eps -b 51 --height=50 -d 123456
echo testing Pharmazentralnumber
zint -o bar52.png -b 52 --height=50 -d 654321
zint -o bar52.eps -b 52 --height=50 -d 654321
echo testing Pharmacode Two-Track
zint -o bar53.png -b 53 --height=50 -d 12345678
zint -o bar53.eps -b 53 --height=50 -d 12345678
echo testing PDF417
zint -o bar55.png -b 55 -d 'PDF417 is a stacked symbology'
zint -o bar55.eps -b 55 -d 'PDF417 is a stacked symbology'
echo testing PDF417 Truncated
zint -o bar56.png -b 56 -d 'PDF417 is a stacked symbology'
zint -o bar56.eps -b 56 -d 'PDF417 is a stacked symbology'
echo testing Maxicode
zint -o bar57.png -b 57 --primary="999999999840012" -d 'UPS Maxicode with hexagons'
zint -o bar57.eps -b 57 --primary="999999999840012" -d 'UPS Maxicode with hexagons'
echo testing QR Code
zint -o bar58.png -b 58 -d 'QR Code is a matrix symbology'
zint -o bar58.eps -b 58 -d 'QR Code is a matrix symbology'
echo testing Code 128 Subset B
zint -o bar60.png -b 60 --height=50 -d 87654321
zint -o bar60.eps -b 60 --height=50 -d 87654321
echo testing Australian Post Standard Customer
zint -o bar63.png -b 63 -d 87654321
zint -o bar63.eps -b 63 -d 87654321
echo testing Australian Post Customer 2
zint -o bar64.png -b 63 -d 87654321AUSPS
zint -o bar64.eps -b 63 -d 87654321AUSPS
echo testing Australian Post Customer 3
zint -o bar65.png -b 63 -d '87654321 AUSTRALIA'
zint -o bar65.eps -b 63 -d '87654321 AUSTRALIA'
echo testing Australian Post Reply Paid
zint -o bar66.png -b 66 -d 87654321
zint -o bar66.eps -b 66 -d 87654321
echo testing Australian Post Routing
zint -o bar67.png -b 67 -d 87654321
zint -o bar67.eps -b 67 -d 87654321
echo testing Australian Post Redirection
zint -o bar68.png -b 68 -d 87654321
zint -o bar68.eps -b 68 -d 87654321
echo testing ISBN Code
zint -o bar69.png -b 69 --height=50 -d 0333638514
zint -o bar69.eps -b 69 --height=50 -d 0333638514
echo testing Royal Mail 4 State
zint -o bar70.png -b 70 -d ROYALMAIL
zint -o bar70.eps -b 70 -d ROYALMAIL
echo testing Data Matrix
zint -o bar71.png -b 71 -d 'Data Matrix is a matrix symbology'
zint -o bar71.eps -b 71 -d 'Data Matrix is a matrix symbology'
echo testing EAN-14
zint -o bar72.png -b 72 --height=50 -d 3210987654321
zint -o bar72.eps -b 72 --height=50 -d 3210987654321
echo testing NVE-18
zint -o bar75.png -b 75 --height=50 -d 76543210987654321
zint -o bar75.eps -b 75 --height=50 -d 76543210987654321
echo testing GS1 DataBar Truncated
zint -o bar78.eps -b 29 --height=13 -d 1234567890
zint -o bar78.png -b 29 --height=13 -d 1234567890
echo testing GS1 DataBar Stacked
zint -o bar79.eps -b 79 -d 1234567890
zint -o bar79.png -b 79 -d 1234567890
echo testing GS1 DataBar Stacked Omnidirectional
zint -o bar80.eps -b 80 --height=69 -d 3456789012
zint -o bar80.png -b 80 --height=69 -d 3456789012
echo testing GS1 DataBar Expanded Stacked
zint -o bar81.eps -b 81 -d "[01]98898765432106[3202]012345[15]991231"
zint -o bar81.png -b 81 -d "[01]98898765432106[3202]012345[15]991231"
echo testing Planet 12 Digit
zint -o bar82.png -b 82 -d 10987654321
zint -o bar82.eps -b 82 -d 10987654321
echo testing Planet 14 Digit
zint -o bar83.png -b 82 -d 3210987654321
zint -o bar83.eps -b 82 -d 3210987654321
echo testing Micro PDF417
zint -o bar84.png -b 84 -d 'MicroPDF417 is a very small stacked symbology'
zint -o bar84.eps -b 84 -d 'MicroPDF417 is a very small stacked symbology'
echo testing USPS OneCode 4-State Customer Barcode
zint -o bar85.png -b 85 -d 01234567094987654321
zint -o bar85.eps -b 85 -d 01234567094987654321
echo testing Plessey Code with bidirectional reading support
zint -o bar86.png -b 86 --height=50 -d 87654321
zint -o bar86.eps -b 86 --height=50 -d 87654321
echo testing Telepen Numeric
zint -o bar100.png -b 100 --height=50 -d 87654321
zint -o bar100.eps -b 100 --height=50 -d 87654321
echo testing MSI Plessey with Mod-10 check
zint -o bar101.png -b 101 --height=50 -d 87654321
zint -o bar101.eps -b 101 --height=50 -d 87654321
echo testing MSI Plessey with 2 x Mod-10 checks
zint -o bar102.png -b 102 --height=50 -d 87654321
zint -o bar102.eps -b 102 --height=50 -d 87654321
echo testing MSI Plessey with Mod-11 check
zint -o bar103.png -b 103 --height=50 -d 87654321
zint -o bar103.eps -b 103 --height=50 -d 87654321
echo testing MSI Plessey with Mod-10 and Mod-11 check
zint -o bar104.png -b 104 --height=50 -d 87654321
zint -o bar104.eps -b 104 --height=50 -d 87654321
echo testing Code 39 with Modulo 43 check
zint -o bar105.png -b 105 --height=50 -d 'CODE 39 MOD 43'
zint -o bar105.eps -b 105 --height=50 -d 'CODE 39 MOD 43'
echo testing Extended Code 39 with Modulo 43 check
zint -o bar106.png -b 106 --height=50 -d 'Code 39e MOD 43'
zint -o bar106.eps -b 106 --height=50 -d 'Code 39e MOD 43'
echo testing Aztec Code
zint -o bar107.eps -b 107 -d "Demonstration Aztec Code symbol generated by libzint"
zint -o bar107.png -b 107 -d "Demonstration Aztec Code symbol generated by libzint"
echo testing UPC-E Composite with CC-A
zint -o bar116.eps -b 116 --height=100 --mode=1 --primary=121230 -d "[15]021231"
zint -o bar116.png -b 116 --height=100 --mode=1 --primary=121230 -d "[15]021231"
echo testing UPC-A Composite with CC-A
zint -o bar115.eps -b 115 --height=100 --mode=1 --primary=10987654321 -d "[15]021231"
zint -o bar115.png -b 115 --height=100 --mode=1 --primary=10987654321 -d "[15]021231"
echo testing EAN-8 Composite with CC-A
zint -o bar110.eps -b 110 --height=100 --mode=1 --primary=1234567 -d "[21]A12345678"
zint -o bar110.png -b 110 --height=100 --mode=1 --primary=1234567 -d "[21]A12345678"
echo testing EAN-13 Composite with CC-A
zint -o bar110a.eps -b 110 --height=100 --mode=1 --primary=331234567890 -d "[99]1234-abcd"
zint -o bar110a.png -b 110 --height=100 --mode=1 --primary=331234567890 -d "[99]1234-abcd"
echo testing RSS-14 Stacked Composite with CC-A
zint -o bar117.eps -b 117 --mode=1 --primary=341234567890 -d "[17]010200"
zint -o bar117.png -b 117 --mode=1 --primary=341234567890 -d "[17]010200"
echo testing RSS-14 Stacked Omnidirectional Composite with CC-A
zint -o bar118.eps -b 118 --mode=1 --primary=341234567890 -d "[17]010200"
zint -o bar118.png -b 118 --mode=1 --primary=341234567890 -d "[17]010200"
echo testing RSS Limited Composite with CC-B
zint -o bar113.eps -b 113 --height=100 --mode=2 --primary=351234567890 -d "[21]abcdefghijklmnopqrstuv"
zint -o bar113.png -b 113 --height=100 --mode=2 --primary=351234567890 -d "[21]abcdefghijklmnopqrstuv"
echo testing RSS-14 Composite with CC-A
zint -o bar112.eps -b 112 --height=100 --mode=1 --primary=361234567890 -d "[11]990102"
zint -o bar112.png -b 112 --height=100 --mode=1 --primary=361234567890 -d "[11]990102"
echo testing RSS Expanded Composite with CC-A
zint -o bar114.eps -b 114 --height=100 --mode=1 --primary="[01]93712345678904[3103]001234" -d "[91]1A2B3C4D5E"
zint -o bar114.png -b 114 --height=100 --mode=1 --primary="[01]93712345678904[3103]001234" -d "[91]1A2B3C4D5E"
echo testing RSS Expanded Stacked Composite with CC-A
zint -o bar119.eps -b 119 --height=150 --mode=1 --primary="[01]00012345678905[10]ABCDEF" -d "[21]12345678"
zint -o bar119.png -b 119 --height=150 --mode=1 --primary="[01]00012345678905[10]ABCDEF" -d "[21]12345678"
echo testing UCC/EAN-128 Composite with CC-A
zint -o bar111.eps -b 111 --height=100 --mode=1 --primary="[01]03212345678906" -d "[10]1234567ABCDEFG"
zint -o bar111.png -b 111 --height=100 --mode=1 --primary="[01]03212345678906" -d "[10]1234567ABCDEFG"
echo testing UCC/EAN-128 Composite with CC-C
zint -o bar111a.eps -b 111 --height=100 --mode=3 --primary="[00]030123456789012340" -d "[02]130123456789093724[10]1234567ABCDEFG"
zint -o bar111a.png -b 111 --height=100 --mode=3 --primary="[00]030123456789012340" -d "[02]130123456789093724[10]1234567ABCDEFG"

39
readme Normal file
View File

@ -0,0 +1,39 @@
Zint and libzint 1.6.0
----------------------
Zint is a front end program and library which provides support for over 30 barcode symbologies
in an open source package released under the GNU General Public License. Currently supported
symbologies include:
Code 11, Standard Code 2 of 5, IATA Code 2 of 5, Industrial Code 2 of 5, Interleaved Code 2 of 5,
Code 2 of 5 Data Logic, ITF-14, Deutche Post Leitcode, Deutche Post Identcode, UPC-A, UPC-E, EAN-2,
EAN-5, EAN-8, EAN-13, UK Plessey, MSI Plessey, Telepen Alpha, Telepen Numeric, Code 39,
Extended Code 39, Code 93, PZN, LOGMARS, Codabar, Pharmacode, Code 128, EAN-128, NVE-18, Code 16k,
PDF417, MicroPDF417, Two-Track Pharmacode, PostNet, PLANET, Australia Post 4-State Symbols, RM4SCC,
USPS OneCode, GS1 DataBar, DataBar-14, DataBar Limited, DataBar Extended, DataBar Stacked,
Composite Symbology, Data Matrix, QR Code, Maxicode, FIM and Flattermarken.
Full documentation is included in the 'docs' directory. The libzint back end code is included
in the 'backend' directory, and the front end command line program 'zint' is included in the
'frontend' directory. See the HTML documentation for full installation instructions. The file
DEVELOPERS in the backend folder gives a brief guide to which symbologies are handled by which
source code files.
CONTACT ME
----------
The home of libzint is
http://www.sourceforge.net/projects/zint
and a new home for information about Zint is under construction at:
http://www.zint.org.uk
I am keen to hear your ideas / recieve bug reports at zint@hotmail.co.uk
Thanks for your interest in libzint.
Happy encoding.
Robin.