using System;
using System.Text;
using FastReport.Utils;
namespace FastReport.Barcode
{
///
/// Generates the Code93 barcode.
///
public class Barcode93 : LinearBarcodeBase
{
#if READONLY_STRUCTS
private readonly struct Code93
#else
private struct Code93
#endif
{
public readonly string data;
#pragma warning disable FR0006 // Field name of struct must be longer than 2 characters.
public readonly string c;
#pragma warning restore FR0006 // Field name of struct must be longer than 2 characters.
public Code93(string _c, string _data)
{
data = _data;
c = _c;
}
}
private static Code93[] tabelle_93 = {
new Code93("0", "131112"),
new Code93("1", "111213"),
new Code93("2", "111312"),
new Code93("3", "111411"),
new Code93("4", "121113"),
new Code93("5", "121212"),
new Code93("6", "121311"),
new Code93("7", "111114"),
new Code93("8", "131211"),
new Code93("9", "141111"),
new Code93("A", "211113"),
new Code93("B", "211212"),
new Code93("C", "211311"),
new Code93("D", "221112"),
new Code93("E", "221211"),
new Code93("F", "231111"),
new Code93("G", "112113"),
new Code93("H", "112212"),
new Code93("I", "112311"),
new Code93("J", "122112"),
new Code93("K", "132111"),
new Code93("L", "111123"),
new Code93("M", "111222"),
new Code93("N", "111321"),
new Code93("O", "121122"),
new Code93("P", "131121"),
new Code93("Q", "212112"),
new Code93("R", "212211"),
new Code93("S", "211122"),
new Code93("T", "211221"),
new Code93("U", "221121"),
new Code93("V", "222111"),
new Code93("W", "112122"),
new Code93("X", "112221"),
new Code93("Y", "122121"),
new Code93("Z", "123111"),
new Code93("-", "121131"),
new Code93(".", "311112"),
new Code93(" ", "311211"),
new Code93("$", "321111"),
new Code93("/", "112131"),
new Code93("+", "113121"),
new Code93("%", "211131"),
new Code93("[", "121221"), // only used for Extended Code 93
new Code93("]", "312111"), // only used for Extended Code 93}
new Code93("{", "311121"), // only used for Extended Code 93}
new Code93("}", "122211") // only used for Extended Code 93}
};
///
public override bool IsNumeric
{
get { return false; }
}
private int FindBarItem(string c)
{
for (int i = 0; i < tabelle_93.Length; i++)
{
if (c == tabelle_93[i].c)
return i;
}
return -1;
}
internal override string GetPattern()
{
string result = "111141"; // Startcode
foreach (char c in text)
{
int idx = FindBarItem(c.ToString());
if (idx < 0)
throw new Exception(Res.Get("Messages,InvalidBarcode2"));
result += tabelle_93[idx].data;
}
// Checksums
if (CalcCheckSum)
{
int checkC = 0;
int checkK = 0;
int weightC = 1;
int weightK = 2;
for (int i = text.Length - 1; i >= 0; i--)
{
int idx = FindBarItem(text[i].ToString());
checkC += idx * weightC;
checkK += idx * weightK;
weightC++;
if (weightC > 20)
weightC = 1;
weightK++;
if (weightK > 15)
weightC = 1;
};
checkK += checkC;
checkC = checkC % 47;
checkK = checkK % 47;
result += tabelle_93[checkC].data + tabelle_93[checkK].data;
}
// Stopcode
result += "1111411";
return DoConvert(result);
}
}
///
/// Generates the Code93 extended barcode.
///
public class Barcode93Extended : Barcode93
{
private static string[] code93x = {
"]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", "{M", "{N", "{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"
};
internal override string GetPattern()
{
string saveText = text;
text = "";
for (int i = 0; i < saveText.Length; i++)
{
if (saveText[i] <= (char)127)
text += code93x[saveText[i]];
}
string pattern = base.GetPattern();
text = saveText;
return pattern;
}
}
}