diff --git a/.gitignore b/.gitignore index 914bf30ad..98a014701 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,8 @@ Encrypt/bin/ Encrypt/obj/ GemCard/bin GemCard/obj +GenCode128/bin +GenCode128/obj GraphLib/bin GraphLib/obj TracingDB/bin diff --git a/GenCode128/AssemblyInfo.cs b/GenCode128/AssemblyInfo.cs new file mode 100644 index 000000000..4fe350d4c --- /dev/null +++ b/GenCode128/AssemblyInfo.cs @@ -0,0 +1,51 @@ +using System.Reflection; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("GenCode128")] +[assembly: AssemblyDescription("GenCode128")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Chris Wuestefeld")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("2006 Chris Wuestefeld")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] + +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/GenCode128/Code128Code.cs b/GenCode128/Code128Code.cs new file mode 100644 index 000000000..ea119b1a8 --- /dev/null +++ b/GenCode128/Code128Code.cs @@ -0,0 +1,139 @@ +namespace GenCode128 +{ + /// + /// Static tools for determining codes for individual characters in the content + /// + public static class Code128Code + { + private const int CShift = 98; + private const int CCodeA = 101; + private const int CCodeB = 100; + private const int CStartA = 103; + private const int CStartB = 104; + private const int CStop = 106; + + /// + /// Indicates which code sets can represent a character -- CodeA, CodeB, or either + /// + public enum CodeSetAllowed + { + CodeA, + CodeB, + CodeAorB + } + + /// + /// Get the Code128 code value(s) to represent an ASCII character, with + /// optional look-ahead for length optimization + /// + /// The ASCII value of the character to translate + /// The next character in sequence (or -1 if none) + /// The current codeset, that the returned codes need to follow; + /// if the returned codes change that, then this value will be changed to reflect it + /// An array of integers representing the codes that need to be output to produce the + /// given character + public static int[] CodesForChar(int charAscii, int lookAheadAscii, ref CodeSet currentCodeSet) + { + int[] result; + var shifter = -1; + + if (!CharCompatibleWithCodeset(charAscii, currentCodeSet)) + { + // if we have a lookahead character AND if the next character is ALSO not compatible + if ((lookAheadAscii != -1) && !CharCompatibleWithCodeset(lookAheadAscii, currentCodeSet)) + { + // we need to switch code sets + switch (currentCodeSet) + { + case CodeSet.CodeA: + shifter = CCodeB; + currentCodeSet = CodeSet.CodeB; + break; + case CodeSet.CodeB: + shifter = CCodeA; + currentCodeSet = CodeSet.CodeA; + break; + } + } + else + { + // no need to switch code sets, a temporary SHIFT will suffice + shifter = CShift; + } + } + + if (shifter != -1) + { + result = new int[2]; + result[0] = shifter; + result[1] = CodeValueForChar(charAscii); + } + else + { + result = new int[1]; + result[0] = CodeValueForChar(charAscii); + } + + return result; + } + + /// + /// Tells us which codesets a given character value is allowed in + /// + /// ASCII value of character to look at + /// Which codeset(s) can be used to represent this character + public static CodeSetAllowed CodesetAllowedForChar(int charAscii) + { + if (charAscii >= 32 && charAscii <= 95) + { + return CodeSetAllowed.CodeAorB; + } + else + { + return charAscii < 32 ? CodeSetAllowed.CodeA : CodeSetAllowed.CodeB; + } + } + + /// + /// Determine if a character can be represented in a given codeset + /// + /// character to check for + /// codeset context to test + /// true if the codeset contains a representation for the ASCII character + public static bool CharCompatibleWithCodeset(int charAscii, CodeSet currentCodeSet) + { + var csa = CodesetAllowedForChar(charAscii); + return csa == CodeSetAllowed.CodeAorB || (csa == CodeSetAllowed.CodeA && currentCodeSet == CodeSet.CodeA) + || (csa == CodeSetAllowed.CodeB && currentCodeSet == CodeSet.CodeB); + } + + /// + /// Gets the integer code128 code value for a character (assuming the appropriate code set) + /// + /// character to convert + /// code128 symbol value for the character + public static int CodeValueForChar(int charAscii) + { + return charAscii >= 32 ? charAscii - 32 : charAscii + 64; + } + + /// + /// Return the appropriate START code depending on the codeset we want to be in + /// + /// The codeset you want to start in + /// The code128 code to start a barcode in that codeset + public static int StartCodeForCodeSet(CodeSet cs) + { + return cs == CodeSet.CodeA ? CStartA : CStartB; + } + + /// + /// Return the Code128 stop code + /// + /// the stop code + public static int StopCode() + { + return CStop; + } + } +} \ No newline at end of file diff --git a/GenCode128/Code128Content.cs b/GenCode128/Code128Content.cs new file mode 100644 index 000000000..505efe4d4 --- /dev/null +++ b/GenCode128/Code128Content.cs @@ -0,0 +1,97 @@ +namespace GenCode128 +{ + using System.Collections; + using System.Text; + + /// + /// Represent the set of code values to be output into barcode form + /// + public class Code128Content + { + /// + /// Create content based on a string of ASCII data + /// + /// the string that should be represented + public Code128Content(string asciiData) + { + this.Codes = this.StringToCode128(asciiData); + } + + /// + /// Provides the Code128 code values representing the object's string + /// + public int[] Codes + { + get { return codes; } + set { codes = value; } + } + int[] codes; + + /// + /// Transform the string into integers representing the Code128 codes + /// necessary to represent it + /// + /// String to be encoded + /// Code128 representation + private int[] StringToCode128(string asciiData) + { + // turn the string into ascii byte data + var asciiBytes = Encoding.ASCII.GetBytes(asciiData); + + // decide which codeset to start with + var csa1 = asciiBytes.Length > 0 + ? Code128Code.CodesetAllowedForChar(asciiBytes[0]) + : Code128Code.CodeSetAllowed.CodeAorB; + var csa2 = asciiBytes.Length > 1 + ? Code128Code.CodesetAllowedForChar(asciiBytes[1]) + : Code128Code.CodeSetAllowed.CodeAorB; + var currentCodeSet = this.GetBestStartSet(csa1, csa2); + + // set up the beginning of the barcode + // assume no codeset changes, account for start, checksum, and stop + var codes = new ArrayList(asciiBytes.Length + 3) { Code128Code.StartCodeForCodeSet(currentCodeSet) }; + + // add the codes for each character in the string + for (var i = 0; i < asciiBytes.Length; i++) + { + int thischar = asciiBytes[i]; + var nextchar = asciiBytes.Length > i + 1 ? asciiBytes[i + 1] : -1; + + codes.AddRange(Code128Code.CodesForChar(thischar, nextchar, ref currentCodeSet)); + } + + // calculate the check digit + var checksum = (int)codes[0]; + for (var i = 1; i < codes.Count; i++) + { + checksum += i * (int)codes[i]; + } + + codes.Add(checksum % 103); + + codes.Add(Code128Code.StopCode()); + + var result = codes.ToArray(typeof(int)) as int[]; + return result; + } + + /// + /// Determines the best starting code set based on the the first two + /// characters of the string to be encoded + /// + /// First character of input string + /// Second character of input string + /// The codeset determined to be best to start with + private CodeSet GetBestStartSet(Code128Code.CodeSetAllowed csa1, Code128Code.CodeSetAllowed csa2) + { + var vote = 0; + + vote += csa1 == Code128Code.CodeSetAllowed.CodeA ? 1 : 0; + vote += csa1 == Code128Code.CodeSetAllowed.CodeB ? -1 : 0; + vote += csa2 == Code128Code.CodeSetAllowed.CodeA ? 1 : 0; + vote += csa2 == Code128Code.CodeSetAllowed.CodeB ? -1 : 0; + + return vote > 0 ? CodeSet.CodeA : CodeSet.CodeB; // ties go to codeB due to my own prejudices + } + } +} diff --git a/GenCode128/Code128Rendering.cs b/GenCode128/Code128Rendering.cs new file mode 100644 index 000000000..0dd7fc148 --- /dev/null +++ b/GenCode128/Code128Rendering.cs @@ -0,0 +1,188 @@ +namespace GenCode128 +{ + using System; + using System.Drawing; + + /// + /// Summary description for Code128Rendering. + /// + public static class Code128Rendering + { + private const int CQuietWidth = 10; + + // Code patterns: + // in principle these rows should each have 6 elements + // however, the last one -- STOP -- has 7. The cost of the + // extra integers is trivial, and this lets the code flow + // much more elegantly + private static readonly int[,] CPatterns = + { + { 2, 1, 2, 2, 2, 2, 0, 0 }, // 0 + { 2, 2, 2, 1, 2, 2, 0, 0 }, // 1 + { 2, 2, 2, 2, 2, 1, 0, 0 }, // 2 + { 1, 2, 1, 2, 2, 3, 0, 0 }, // 3 + { 1, 2, 1, 3, 2, 2, 0, 0 }, // 4 + { 1, 3, 1, 2, 2, 2, 0, 0 }, // 5 + { 1, 2, 2, 2, 1, 3, 0, 0 }, // 6 + { 1, 2, 2, 3, 1, 2, 0, 0 }, // 7 + { 1, 3, 2, 2, 1, 2, 0, 0 }, // 8 + { 2, 2, 1, 2, 1, 3, 0, 0 }, // 9 + { 2, 2, 1, 3, 1, 2, 0, 0 }, // 10 + { 2, 3, 1, 2, 1, 2, 0, 0 }, // 11 + { 1, 1, 2, 2, 3, 2, 0, 0 }, // 12 + { 1, 2, 2, 1, 3, 2, 0, 0 }, // 13 + { 1, 2, 2, 2, 3, 1, 0, 0 }, // 14 + { 1, 1, 3, 2, 2, 2, 0, 0 }, // 15 + { 1, 2, 3, 1, 2, 2, 0, 0 }, // 16 + { 1, 2, 3, 2, 2, 1, 0, 0 }, // 17 + { 2, 2, 3, 2, 1, 1, 0, 0 }, // 18 + { 2, 2, 1, 1, 3, 2, 0, 0 }, // 19 + { 2, 2, 1, 2, 3, 1, 0, 0 }, // 20 + { 2, 1, 3, 2, 1, 2, 0, 0 }, // 21 + { 2, 2, 3, 1, 1, 2, 0, 0 }, // 22 + { 3, 1, 2, 1, 3, 1, 0, 0 }, // 23 + { 3, 1, 1, 2, 2, 2, 0, 0 }, // 24 + { 3, 2, 1, 1, 2, 2, 0, 0 }, // 25 + { 3, 2, 1, 2, 2, 1, 0, 0 }, // 26 + { 3, 1, 2, 2, 1, 2, 0, 0 }, // 27 + { 3, 2, 2, 1, 1, 2, 0, 0 }, // 28 + { 3, 2, 2, 2, 1, 1, 0, 0 }, // 29 + { 2, 1, 2, 1, 2, 3, 0, 0 }, // 30 + { 2, 1, 2, 3, 2, 1, 0, 0 }, // 31 + { 2, 3, 2, 1, 2, 1, 0, 0 }, // 32 + { 1, 1, 1, 3, 2, 3, 0, 0 }, // 33 + { 1, 3, 1, 1, 2, 3, 0, 0 }, // 34 + { 1, 3, 1, 3, 2, 1, 0, 0 }, // 35 + { 1, 1, 2, 3, 1, 3, 0, 0 }, // 36 + { 1, 3, 2, 1, 1, 3, 0, 0 }, // 37 + { 1, 3, 2, 3, 1, 1, 0, 0 }, // 38 + { 2, 1, 1, 3, 1, 3, 0, 0 }, // 39 + { 2, 3, 1, 1, 1, 3, 0, 0 }, // 40 + { 2, 3, 1, 3, 1, 1, 0, 0 }, // 41 + { 1, 1, 2, 1, 3, 3, 0, 0 }, // 42 + { 1, 1, 2, 3, 3, 1, 0, 0 }, // 43 + { 1, 3, 2, 1, 3, 1, 0, 0 }, // 44 + { 1, 1, 3, 1, 2, 3, 0, 0 }, // 45 + { 1, 1, 3, 3, 2, 1, 0, 0 }, // 46 + { 1, 3, 3, 1, 2, 1, 0, 0 }, // 47 + { 3, 1, 3, 1, 2, 1, 0, 0 }, // 48 + { 2, 1, 1, 3, 3, 1, 0, 0 }, // 49 + { 2, 3, 1, 1, 3, 1, 0, 0 }, // 50 + { 2, 1, 3, 1, 1, 3, 0, 0 }, // 51 + { 2, 1, 3, 3, 1, 1, 0, 0 }, // 52 + { 2, 1, 3, 1, 3, 1, 0, 0 }, // 53 + { 3, 1, 1, 1, 2, 3, 0, 0 }, // 54 + { 3, 1, 1, 3, 2, 1, 0, 0 }, // 55 + { 3, 3, 1, 1, 2, 1, 0, 0 }, // 56 + { 3, 1, 2, 1, 1, 3, 0, 0 }, // 57 + { 3, 1, 2, 3, 1, 1, 0, 0 }, // 58 + { 3, 3, 2, 1, 1, 1, 0, 0 }, // 59 + { 3, 1, 4, 1, 1, 1, 0, 0 }, // 60 + { 2, 2, 1, 4, 1, 1, 0, 0 }, // 61 + { 4, 3, 1, 1, 1, 1, 0, 0 }, // 62 + { 1, 1, 1, 2, 2, 4, 0, 0 }, // 63 + { 1, 1, 1, 4, 2, 2, 0, 0 }, // 64 + { 1, 2, 1, 1, 2, 4, 0, 0 }, // 65 + { 1, 2, 1, 4, 2, 1, 0, 0 }, // 66 + { 1, 4, 1, 1, 2, 2, 0, 0 }, // 67 + { 1, 4, 1, 2, 2, 1, 0, 0 }, // 68 + { 1, 1, 2, 2, 1, 4, 0, 0 }, // 69 + { 1, 1, 2, 4, 1, 2, 0, 0 }, // 70 + { 1, 2, 2, 1, 1, 4, 0, 0 }, // 71 + { 1, 2, 2, 4, 1, 1, 0, 0 }, // 72 + { 1, 4, 2, 1, 1, 2, 0, 0 }, // 73 + { 1, 4, 2, 2, 1, 1, 0, 0 }, // 74 + { 2, 4, 1, 2, 1, 1, 0, 0 }, // 75 + { 2, 2, 1, 1, 1, 4, 0, 0 }, // 76 + { 4, 1, 3, 1, 1, 1, 0, 0 }, // 77 + { 2, 4, 1, 1, 1, 2, 0, 0 }, // 78 + { 1, 3, 4, 1, 1, 1, 0, 0 }, // 79 + { 1, 1, 1, 2, 4, 2, 0, 0 }, // 80 + { 1, 2, 1, 1, 4, 2, 0, 0 }, // 81 + { 1, 2, 1, 2, 4, 1, 0, 0 }, // 82 + { 1, 1, 4, 2, 1, 2, 0, 0 }, // 83 + { 1, 2, 4, 1, 1, 2, 0, 0 }, // 84 + { 1, 2, 4, 2, 1, 1, 0, 0 }, // 85 + { 4, 1, 1, 2, 1, 2, 0, 0 }, // 86 + { 4, 2, 1, 1, 1, 2, 0, 0 }, // 87 + { 4, 2, 1, 2, 1, 1, 0, 0 }, // 88 + { 2, 1, 2, 1, 4, 1, 0, 0 }, // 89 + { 2, 1, 4, 1, 2, 1, 0, 0 }, // 90 + { 4, 1, 2, 1, 2, 1, 0, 0 }, // 91 + { 1, 1, 1, 1, 4, 3, 0, 0 }, // 92 + { 1, 1, 1, 3, 4, 1, 0, 0 }, // 93 + { 1, 3, 1, 1, 4, 1, 0, 0 }, // 94 + { 1, 1, 4, 1, 1, 3, 0, 0 }, // 95 + { 1, 1, 4, 3, 1, 1, 0, 0 }, // 96 + { 4, 1, 1, 1, 1, 3, 0, 0 }, // 97 + { 4, 1, 1, 3, 1, 1, 0, 0 }, // 98 + { 1, 1, 3, 1, 4, 1, 0, 0 }, // 99 + { 1, 1, 4, 1, 3, 1, 0, 0 }, // 100 + { 3, 1, 1, 1, 4, 1, 0, 0 }, // 101 + { 4, 1, 1, 1, 3, 1, 0, 0 }, // 102 + { 2, 1, 1, 4, 1, 2, 0, 0 }, // 103 + { 2, 1, 1, 2, 1, 4, 0, 0 }, // 104 + { 2, 1, 1, 2, 3, 2, 0, 0 }, // 105 + { 2, 3, 3, 1, 1, 1, 2, 0 } // 106 + }; + + /// + /// Make an image of a Code128 barcode for a given string + /// + /// Message to be encoded + /// Base thickness for bar width (1 or 2 works well) + /// Add required horizontal margins (use if output is tight) + /// An Image of the Code128 barcode representing the message + public static Image MakeBarcodeImage(string inputData, int barWeight, bool addQuietZone) + { + // get the Code128 codes to represent the message + var content = new Code128Content(inputData); + var codes = content.Codes; + + var width = (((codes.Length - 3) * 11) + 35) * barWeight; + var height = Convert.ToInt32(Math.Ceiling(Convert.ToSingle(width) * .15F)); + + if (addQuietZone) + { + width += 2 * CQuietWidth * barWeight; // on both sides + } + + // get surface to draw on + Image myImage = new Bitmap(width, height); + using (var gr = Graphics.FromImage(myImage)) + { + // set to white so we don't have to fill the spaces with white + gr.FillRectangle(Brushes.White, 0, 0, width, height); + + // skip quiet zone + var cursor = addQuietZone ? CQuietWidth * barWeight : 0; + + for (var codeIdx = 0; codeIdx < codes.Length; codeIdx++) + { + var code = codes[codeIdx]; + + // take the bars two at a time: a black and a white + for (var bar = 0; bar < 8; bar += 2) + { + var barWidth = CPatterns[code, bar] * barWeight; + var spcWidth = CPatterns[code, bar + 1] * barWeight; + + // if width is zero, don't try to draw it + if (barWidth > 0) + { + gr.FillRectangle(Brushes.Black, cursor, 0, barWidth, height); + } + + // note that we never need to draw the space, since we + // initialized the graphics to all white + + // advance cursor beyond this pair + cursor += barWidth + spcWidth; + } + } + } + + return myImage; + } + } +} diff --git a/GenCode128/CodeSet.cs b/GenCode128/CodeSet.cs new file mode 100644 index 000000000..b59bfd2cf --- /dev/null +++ b/GenCode128/CodeSet.cs @@ -0,0 +1,9 @@ +namespace GenCode128 +{ + public enum CodeSet + { + CodeA, + CodeB + //// CodeC // not supported + } +} diff --git a/GenCode128/GenCode128.csproj b/GenCode128/GenCode128.csproj new file mode 100644 index 000000000..9d7c60b71 --- /dev/null +++ b/GenCode128/GenCode128.csproj @@ -0,0 +1,147 @@ + + + + Local + 8.0.50727 + 2.0 + {32817BF9-E380-4467-9C7F-936F4B122BC7} + + + + + + + + + Debug + AnyCPU + + + + + GenCode128 + + + JScript + Grid + IE50 + false + Library + GenCode128 + OnBuildSuccess + + + + + + + v4.0 + 2.0 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + none + prompt + + + + System + + + System.Data + + + System.Drawing + + + System.Windows.Forms + + + System.XML + + + + + + + Code + + + Code + + + Code + + + + + False + .NET Framework 3.5 SP1 + true + + + + + + + + + + \ No newline at end of file diff --git a/TBF.sln b/TBF.sln index a8419aff9..4f62fad0f 100644 --- a/TBF.sln +++ b/TBF.sln @@ -50,6 +50,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decrypt", "Decrypt\Decrypt. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Encrypt", "Encrypt\Encrypt.csproj", "{DA9B09F3-A99D-4883-A954-537560453674}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GenCode128", "GenCode128\GenCode128.csproj", "{32817BF9-E380-4467-9C7F-936F4B122BC7}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -202,6 +204,16 @@ Global {DA9B09F3-A99D-4883-A954-537560453674}.Release|Mixed Platforms.Build.0 = Release|x86 {DA9B09F3-A99D-4883-A954-537560453674}.Release|x86.ActiveCfg = Release|x86 {DA9B09F3-A99D-4883-A954-537560453674}.Release|x86.Build.0 = Release|x86 + {32817BF9-E380-4467-9C7F-936F4B122BC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {32817BF9-E380-4467-9C7F-936F4B122BC7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {32817BF9-E380-4467-9C7F-936F4B122BC7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {32817BF9-E380-4467-9C7F-936F4B122BC7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {32817BF9-E380-4467-9C7F-936F4B122BC7}.Debug|x86.ActiveCfg = Debug|Any CPU + {32817BF9-E380-4467-9C7F-936F4B122BC7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {32817BF9-E380-4467-9C7F-936F4B122BC7}.Release|Any CPU.Build.0 = Release|Any CPU + {32817BF9-E380-4467-9C7F-936F4B122BC7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {32817BF9-E380-4467-9C7F-936F4B122BC7}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {32817BF9-E380-4467-9C7F-936F4B122BC7}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/clean.bat b/clean.bat index f3a34da4d..ee80a0f72 100644 --- a/clean.bat +++ b/clean.bat @@ -10,6 +10,8 @@ rmdir /s /q Encrypt\bin rmdir /s /q Encrypt\obj rmdir /s /q GemCard\bin rmdir /s /q GemCard\obj +rmdir /s /q GenCode128\bin +rmdir /s /q GenCode128\obj rmdir /s /q GraphLib\bin rmdir /s /q GraphLib\obj rmdir /s /q TracingDB\bin