* FoxPro encoder functions for Code128 (Auto, A, B and C) and UCC/EAN128 * Copyright by MW6 Technologies Inc. All rights reserved. * * This code may not be modified or distributed unless you purchase * the license from MW6. * Rename this file to MW6Code128.PRG, add MW6Code128.PRG to your VFP project, * put the following command in VFP code: * SET PROCEDURE TO MW6Code128.PRG ADDITIVE * * Sample code * private res * res = Code128Auto("String to encode using Code128 Auto Mode") * res = Code128A("String to encode using Code128 Set A") * res = Code128B("String to encode using Code128 Set B") * res = Code128C("String to encode using Code128 Set C") * res = Code128UCCEAN128("String to encode using UCC/EAN128") Function Code128Auto parameters Src private I, CurrChar, CurrSet, CheckSum, StartChar CheckSum = 104 * 2 indicates Set B CurrSet = 2 * start character with value 202 for Set B StartChar = Chr(202) CurrChar = Asc(SubStr(Src, 1, 1)) If ((CurrChar <= 31) and (CurrChar >= 0)) Then * switch to Set A * 1 indicates Set A CurrSet = 1 * start character with value 201 for Set A StartChar = Chr(201) CheckSum = 103 EndIf return GeneralEncode(Src, StartChar, CurrSet, CheckSum, 1) EndFunc Function UCCEAN128 parameters Src return GeneralEncode(Src, Chr(203) + Chr(200), 3, 105 + 102, 2) EndFunc Function GeneralEncode parameter Src, StartChar, StartSet, StartCheckSum, CurrWeight private I, tmp, CurrDone, CurrChar, NextChar, CurrSet, EncodedMessage, CheckSum StrLen = Len(Src) EncodedMessage = StartChar CurrSet = StartSet CheckSum = StartCheckSum Weight = CurrWeight I = 1 Do While (I <= StrLen) CurrChar = Asc(SubStr(Src, I, 1)) CurrDone = .F. If ((I + 1) <= StrLen) Then NextChar = Asc(SubStr(Src, I + 1, 1)) If ((CurrChar >= Asc("0")) And (CurrChar <= Asc("9")) And ; (NextChar >= Asc("0")) And (NextChar <= Asc("9"))) Then tmp = (CurrChar - Asc("0")) * 10 + (NextChar - Asc("0")) * 2 digits If (CurrSet <> 3) Then * the previous set is not Set C EncodedMessage = EncodedMessage + Chr(99 + 98) CheckSum = CheckSum + Weight * 99 Weight = Weight + 1 CurrSet = 3 EndIf If (tmp = 0) Then EncodedMessage = EncodedMessage + Chr(192) Else If ((tmp > 0) And (tmp < 95)) Then EncodedMessage = EncodedMessage + Chr(tmp + 32) Else EncodedMessage = EncodedMessage + Chr(tmp + 98) EndIf EndIf CheckSum = CheckSum + Weight * tmp I = I + 2 CurrDone = .T. EndIf EndIf If (Not CurrDone) Then If (CurrChar >= 0 And CurrChar <= 31) Then * choose Set A If (CurrSet <> 1) Then * the previous set is not Set A EncodedMessage = EncodedMessage + Chr(101 + 98) CheckSum = CheckSum + Weight * 101 Weight = Weight + 1 CurrSet = 1 EndIf If (CurrChar = 31) Then EncodedMessage = EncodedMessage + Chr(193) CheckSum = CheckSum + Weight * 95 Else EncodedMessage = EncodedMessage + Chr(CurrChar + 96) CheckSum = CheckSum + Weight * (CurrChar + 64) EndIf Else * choose Set B If (CurrSet <> 2) Then * the previous set is not Set B EncodedMessage = EncodedMessage + Chr(100 + 98) CheckSum = CheckSum + Weight * 100 Weight = Weight + 1 CurrSet = 2 EndIf If (CurrChar = 32) Then EncodedMessage = EncodedMessage + Chr(192) Else If (CurrChar = 127) Then EncodedMessage = EncodedMessage + Chr(193) CheckSum = CheckSum + Weight * 95 Else EncodedMessage = EncodedMessage + Chr(CurrChar) CheckSum = CheckSum + Weight * (CurrChar - 32) EndIf EndIf EndIf I = I + 1 EndIf Weight = Weight + 1 EndDo While * add CheckDigit CheckSum = Mod(CheckSum, 103) If (CheckSum = 0) Then EncodedMessage = EncodedMessage + Chr(192) Else If (CheckSum <= 94) Then EncodedMessage = EncodedMessage + Chr(CheckSum + 32) Else EncodedMessage = EncodedMessage + Chr(CheckSum + 98) EndIf EndIf * add stop character (204) EncodedMessage = EncodedMessage + Chr(204) return EncodedMessage EndFunc Function Code128A parameters Src private I, CurrChar, Weight, EncodedMessage, CheckSum, StrLen StrLen = Len(Src) CheckSum = 103 * start character (201) for Set A EncodedMessage = Chr(201) Weight = 1 For I = 1 To StrLen CurrChar = Asc(SubStr(Src, I, 1)) If (CurrChar = 32) Then EncodedMessage = EncodedMessage + Chr(192) Else If (CurrChar = 31) Then EncodedMessage = EncodedMessage + Chr(193) CheckSum = CheckSum + Weight * 95 Else If ((CurrChar <= 95) And (CurrChar > 32)) Then EncodedMessage = EncodedMessage + Chr(CurrChar) CheckSum = CheckSum + Weight * (CurrChar - 32) Else If ((CurrChar >= 0) And (CurrChar <= 31)) Then EncodedMessage = EncodedMessage + Chr(CurrChar + 96) CheckSum = CheckSum + Weight * (CurrChar + 64) Else return Code128Auto(Src) EndIf EndIf EndIf EndIf Weight = Weight + 1 Next I * add CheckDigit CheckSum = Mod(CheckSum, 103) If (CheckSum = 0) Then EncodedMessage = EncodedMessage + Chr(192) Else If (CheckSum <= 94) Then EncodedMessage = EncodedMessage + Chr(CheckSum + 32) Else EncodedMessage = EncodedMessage + Chr(CheckSum + 98) EndIf EndIf * add stop character (204) EncodedMessage = EncodedMessage + Chr(204) return EncodedMessage EndFunc Function Code128B parameters Src private I, CurrChar, Weight, EncodedMessage, CheckSum, StrLen StrLen = Len(Src) CheckSum = 104 * start character (202) for Set B EncodedMessage = Chr(202) Weight = 1 For I = 1 To StrLen CurrChar = Asc(SubStr(Src, I, 1)) If (CurrChar = 32) Then EncodedMessage = EncodedMessage + Chr(192) Else If (CurrChar = 127) Then EncodedMessage = EncodedMessage + Chr(193) CheckSum = CheckSum + Weight * 95 Else If ((CurrChar < 127) And (CurrChar > 32)) Then EncodedMessage = EncodedMessage + Chr(CurrChar) CheckSum = CheckSum + Weight * (CurrChar - 32) Else return Code128Auto(Src) EndIf EndIf EndIf Weight = Weight + 1 Next I * add CheckDigit CheckSum = Mod(CheckSum, 103) If (CheckSum = 0) Then EncodedMessage = EncodedMessage + Chr(192) Else If (CheckSum <= 94) Then EncodedMessage = EncodedMessage + Chr(CheckSum + 32) Else EncodedMessage = EncodedMessage + Chr(CheckSum + 98) EndIF EndIf * add stop character (204) EncodedMessage = EncodedMessage + Chr(204) return EncodedMessage EndFunc Function Code128C parameters Src private I, CurrChar, Weight, EncodedMessage, CheckSum, StrLen StrLen = Len(Src) CheckSum = 105 * start character (203) for Set C EncodedMessage = Chr(203) Weight = 1 I = 1 Do While (I <= StrLen) CurrChar = Asc(SubStr(Src, I, 1)) If ((I + 1) <= StrLen) Then NextChar = Asc(SubStr(Src, I + 1, 1)) If (CurrChar >= Asc("0") And CurrChar <= Asc("9") And ; NextChar >= Asc("0") And NextChar <= Asc("9")) Then * 2 digits tmp = (CurrChar - Asc("0")) * 10 + (NextChar - Asc("0")) If (tmp = 0) Then EncodedMessage = EncodedMessage + Chr(192) Else If ((tmp > 0) And (tmp < 95)) Then EncodedMessage = EncodedMessage + Chr(tmp + 32) Else EncodedMessage = EncodedMessage + Chr(tmp + 98) EndIf EndIf CheckSum = CheckSum + Weight * tmp I = I + 2 Else return Code128Auto(Src) EndIf Else EncodedMessage = EncodedMessage + Chr(198) CheckSum = CheckSum + Weight * 100 Weight = Weight + 1 If (CurrChar = 32) Then EncodedMessage = EncodedMessage + Chr(192) Else If (CurrChar = 127) Then EncodedMessage = EncodedMessage + Chr(193) CheckSum = CheckSum + Weight * 95 Else If ((CurrChar < 127) And (CurrChar > 32)) Then EncodedMessage = EncodedMessage + Chr(CurrChar) CheckSum = CheckSum + Weight * (CurrChar - 32) Else return Code128Auto(Src) EndIf EndIf EndIf I = I + 1 EndIf Weight = Weight + 1 EndDo While * add CheckDigit CheckSum = Mod(CheckSum, 103) If (CheckSum = 0) Then EncodedMessage = EncodedMessage + Chr(192) Else If (CheckSum <= 94) Then EncodedMessage = EncodedMessage + Chr(CheckSum + 32) Else EncodedMessage = EncodedMessage + Chr(CheckSum + 98) EndIf EndIf * add stop character (204) EncodedMessage = EncodedMessage + Chr(204) return EncodedMessage EndFunc