/************************************************************************/ /** ANSI C/C++ Functions for Morovia Barcode Fontware V3.0 **/ /** **/ /** Visit http://www.morovia.com for more information about our Fontware.*/ /** **/ /** This source code is only intended as a supplement to the Morovia **/ /** barcode fontware packages. You may incorporate this source code **/ /** into your application ONLY when you possess a perpetual license to **/ /** Morovia Fontware. Using this source code with fonts from other **/ /** vendor is strictly prohibited. Unauthorized duplication, **/ /** modification, redistribution of this source is prohibited. **/ /** **/ /** If you have any questions regarding this source code, please **/ /** contact Morovia Support at support@morovia.com. **/ /** Last update: April 2005 **/ /*************************************************************************/ #include "MoroviaFontTools.h" /* ---------------------------------------------------- */ /* Implementation */ /* ---------------------------------------------------- */ int IsNumeric(char ch) { if (ch >= '0' && ch <= '9') return 1; return 0; } int strFind(const char* szCharSet, const char cChar) { int i = 0; while (szCharSet[i]) { if (szCharSet[i] == cChar) return i; i = i + 1; } return -1; } int strFind(const unsigned char* szCharSet, const char cChar) { int i = 0; while (szCharSet[i]) { if (szCharSet[i] == cChar) return i; i = i + 1; } return -1; } int strInsert(char* szBuf, const char cChar, int nPos) { int i = strlen(szBuf); if (i < MAX_LEN) { for (int j=i; j>=nPos; j--) szBuf[j+1] = szBuf[j]; szBuf[nPos] = cChar; return 1; } return -1; } int strAppend(char* szBuf, const char cChar) { int i = strlen(szBuf); if (i+1 MAX_LEN) nLen = MAX_LEN; for (i=0; i'; break; } return -1; } int UPC5SUPP(char* szInpara, char *pOutput) { int i=0, nCheckSum = 0; char szBuffer[MAX_LEN] = "\0"; char szParity[6] = "\0"; nCheckSum = 3*(szInpara[0]-'0') + 9*(szInpara[1]-'0')+3*(szInpara[2]-'0')+9*(szInpara[3]-'0')+3*(szInpara[4]-'0'); Parity5((nCheckSum % 10), szParity); strAppend(szBuffer, '{'); for (i=0; i<5; i++) { strAppend(szBuffer, LefthandEncoding(szInpara[i]-'0', szParity[i]-'0') ); if (i < 4) strAppend(szBuffer, '\\'); } strcpy(pOutput, szBuffer); return 1; } int UPC2SUPP(char* szInpara, char* pOutput) { int i=0; char szBuffer[MAX_LEN] = "\0"; int nNum = 0; int nParity1, nParity2; while (szInpara[i]) { nNum = 10 * nNum + szInpara[i] - '0'; i = i + 1; } nNum = nNum % 4; switch (nNum) { case 0: nParity1 = 1; nParity2 = 1; break; case 1: nParity1 = 1; nParity2 = 0; break; case 2: nParity1 = 0; nParity2 = 1; break; case 3: nParity1 = 0; nParity2 = 0; break; } strAppend(szBuffer, '{'); strAppend(szBuffer, LefthandEncoding(szInpara[0]-'0', nParity1) ); strAppend(szBuffer, '\\'); strAppend(szBuffer, LefthandEncoding(szInpara[1]-'0', nParity2)); strcpy(pOutput, szBuffer); return 1; } char* UPC25SUPP(const char* szInpara) { int i=0, nCheckSumC = 0, nCheckSumK = 0, nStrLen; char szBuffer[MAX_LEN] = "\0"; char szSwap[MAX_LEN] = "\0"; while (szInpara[i]) { if (szInpara[i]>='0' && szInpara[i] <= '9') strAppend(szBuffer, szInpara[i]); i = i + 1; } nStrLen = strlen(szBuffer); if (nStrLen == 0) szSwap[0] = '\0'; else if (nStrLen == 1) { strAppend(szBuffer, '0'); UPC2SUPP(szBuffer, szSwap); } else if (nStrLen == 2) UPC2SUPP(szBuffer, szSwap); else if (nStrLen == 3) { strcat(szBuffer, "00"); UPC5SUPP(szBuffer, szSwap); } else if (nStrLen == 4) { strcat(szBuffer, "0"); UPC5SUPP(szBuffer, szSwap); } else if (nStrLen == 5) UPC5SUPP(szBuffer, szSwap); else if (nStrLen>5) { szBuffer[5] = '\0'; UPC5SUPP(szBuffer, szSwap); } strcpy(szOutput, szSwap); return szOutput; } char* Code39(const char* szInpara) { int i, nPos; char szBuffer[MAX_LEN] = "\0"; char szSwap[MAX_LEN] = "\0"; char szCharSet[] = "0123456789.+-/ $%ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; i = 0; while (szInpara[i]) { nPos = strFind(szCharSet, szInpara[i]); if (szInpara[i] == ' ') strcat(szBuffer, "="); else if (nPos >= 0) strAppend(szBuffer, szInpara[i]); i = i + 1; } szBuffer[i] = '\0'; strcpy(szSwap, "*"); strcat(szSwap, szBuffer); strcat(szSwap, "*"); strcpy(szOutput, szSwap); return szOutput; } char* Code39Mod43(const char* szInpara) { int i = 0, nPos, nCheckSum = 0; char szBuffer[MAX_LEN] = "\0"; char szSwap[MAX_LEN] = "\0"; char szCharSet[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%"; char szMappingSet[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-.=$/+%"; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; while (szInpara[i]) { nPos = strFind(szCharSet, szInpara[i]); strAppend(szBuffer, szMappingSet[nPos]); nCheckSum = nCheckSum + nPos; i = i + 1; } nCheckSum = nCheckSum % 43; strAppend(szSwap, '*'); strcat(szSwap, szBuffer); strAppend(szSwap, szMappingSet[nCheckSum]); strAppend(szSwap, '*'); strcpy(szOutput, szSwap); return szOutput; } char* Code39Ascii(const char* szInpara) { int i=0, nPos; char szBuffer[MAX_LEN] = "\0"; char szSwap[MAX_LEN] = "\0"; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; char szCharSet[44] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. "; strAppend(szCharSet, (char)NULL_CHAR); char szMappingSet[44] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-.=";strAppend(szMappingSet, (char)NULL_CHAR); while (szInpara[i]) { nPos = strFind(szCharSet, szInpara[i]); if (nPos>=0) strAppend(szBuffer, szMappingSet[nPos]); else if (szInpara[i] == 0 ) strcat(szBuffer, "%U"); else if (szInpara[i] == ' ') //control characters strAppend(szBuffer, '='); else if (szInpara[i] == '/') strcat(szBuffer, "/O"); else if (szInpara[i] == ':') strcat(szBuffer, "/Z"); else if (szInpara[i] == 64 ) strcat(szBuffer, "%V"); else if (szInpara[i] == 96) strcat(szBuffer, "%W"); else if ( szInpara[i] >0 && szInpara[i] <= 26) { strAppend(szBuffer, '$'); strAppend(szBuffer, szInpara[i]+'A'-1); } else if (szInpara[i]>32 && szInpara[i]<=46) { strAppend(szBuffer, '/'); strAppend(szBuffer, (szInpara[i] % 32)+'A'-1); } else if (szInpara[i]>=97 && szInpara[i]<=122) { strAppend(szBuffer, '+'); strAppend(szBuffer, (szInpara[i]%32)+'A'-1); } else if (szInpara[i] >= 27 && szInpara[i] <= 31) { strAppend(szBuffer, '%'); strAppend(szBuffer, szInpara[i]-27+'A'); } else if (szInpara[i] >= 59 && szInpara[i] <= 63 ) { strAppend(szBuffer, '%'); strAppend(szBuffer, szInpara[i] - 59 + 'F'); } else if (szInpara[i] >= 91 && szInpara[i] <= 95 ) { strAppend(szBuffer, '%'); strAppend(szBuffer, szInpara[i] - 91 + 'K'); } else if (szInpara[i] >= 123 && szInpara[i] <= 127) { strAppend(szBuffer, '%'); strAppend(szBuffer, szInpara[i] - 123 + 'P'); } i = i + 1; } //replace NULL char i=0; while (szBuffer[i]) { if ((unsigned char)szBuffer[i] == NULL_CHAR) { szBuffer[i] = '%'; strInsert(szBuffer, 'U', i+1); } i++; } strAppend(szSwap, '['); strcat(szSwap, szBuffer); strAppend(szSwap, ']'); strcpy(szOutput, szSwap); return szOutput; } char* Code39Extended(const char* szInpara) { size_t i = 0; char ch; int len; char szSwap[MAX_LEN]; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; memset(szSwap, '0', MAX_LEN*sizeof(char)); strcpy(szSwap, szInpara); for(i=0; i 0 && ch <= 0x1F ) szSwap[i]=0xC0+ch; if(ch==' ') //space is mapped to equal sign szSwap[i]='='; if(ch=='*') szSwap[i]=(char)0xF4; if(ch=='=') szSwap[i]=(char)0xF0; if(ch=='[') szSwap[i]=(char)0xF1; if(ch==']') szSwap[i]=(char)0xF2; if(ch==0x7F) szSwap[i]=(char)0xE0; } szOutput[0]='['; strcpy(szOutput+1, szSwap); len = strlen(szOutput); szOutput[len]=']'; szOutput[len+1]='\0'; return szOutput; } char* Code93(const char* szInpara) { int i=0, nPos, nStrLen; char szBuffer[MAX_LEN] = "\0"; char szSwap[MAX_LEN] = "\0"; int nWeightC, nWeightK; int nCheckSumC, nCheckSumK; char cCheckDigitC, cCheckDigitK; char szCharSet[48] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%@#^&"; char szMappingSet[48] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-.=$/+%@#^&"; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; while (szInpara[i]) { nPos = strFind(szCharSet, szInpara[i]); if (nPos>=0) strAppend(szBuffer, szMappingSet[nPos]); else if ((unsigned char)szInpara[i] == NULL_CHAR ) strcat(szBuffer, "#U"); else if (szInpara[i] == ' ') //control characters strAppend(szBuffer, '='); else if (szInpara[i] == '/') strcat(szBuffer, "^O"); else if (szInpara[i] == ':') strcat(szBuffer, "^Z"); else if (szInpara[i] == 64 ) strcat(szBuffer, "#V"); else if (szInpara[i] == 96) strcat(szBuffer, "#W"); else if ( szInpara[i] >0 && szInpara[i] <= 26) { strAppend(szBuffer, '@'); strAppend(szBuffer, szInpara[i]+'A'-1); } else if (szInpara[i]>32 && szInpara[i]<=46) { strAppend(szBuffer, '^'); strAppend(szBuffer, (szInpara[i] % 32)+'A'-1); } else if (szInpara[i]>=97 && szInpara[i]<=122) { strAppend(szBuffer, '&'); strAppend(szBuffer, (szInpara[i]%32)+'A'-1); } else if (szInpara[i] >= 27 && szInpara[i] <= 31) { strAppend(szBuffer, '#'); strAppend(szBuffer, szInpara[i]-27+'A'); } else if (szInpara[i] >= 59 && szInpara[i] <= 63 ) { strAppend(szBuffer, '#'); strAppend(szBuffer, szInpara[i] - 59 + 'F'); } else if (szInpara[i] >= 91 && szInpara[i] <= 95 ) { strAppend(szBuffer, '#'); strAppend(szBuffer, szInpara[i] - 91 + 'K'); } else if (szInpara[i] >= 123 && szInpara[i] <= 127) { strAppend(szBuffer, '#'); strAppend(szBuffer, szInpara[i] - 123 + 'P'); } i = i + 1; } i = 0; nStrLen = strlen(szBuffer); nCheckSumC = 0; while (szBuffer[i]) { nWeightC = (i+1) % 20; //ADDED BY BEN if(nWeightC==0) nWeightC=20; nPos = strFind(szMappingSet, szBuffer[nStrLen-i-1]); nCheckSumC = nCheckSumC + nWeightC * nPos; i = i + 1; } nCheckSumC = nCheckSumC % 47; cCheckDigitC = szMappingSet[nCheckSumC]; strAppend(szBuffer, cCheckDigitC); i=0; nStrLen = strlen(szBuffer); nCheckSumK = 0; while (szBuffer[i]) { nWeightK = (i+1) % 15; //ADDED BY BEN if(nWeightK==0) nWeightK=15; nPos = strFind(szMappingSet, szBuffer[nStrLen-i-1]); nCheckSumK = nCheckSumK + nWeightK * nPos; i = i + 1; } nCheckSumK = nCheckSumK % 47; cCheckDigitK = szMappingSet[nCheckSumK]; strAppend(szBuffer, cCheckDigitK); strAppend(szSwap, '['); strcat(szSwap, szBuffer); strAppend(szSwap, ']'); strAppend(szSwap, '|'); strcpy(szOutput, szSwap); return szOutput; } char getUPCCheck(const char *pszInpara) { int nCheckSum = 0, nStrlen; nStrlen = strlen(pszInpara); for (int i=0; i= 0 && nDigit <= 9) return 192+nDigit; return -1; } char convertSetAText(char cChar) { int i; char szCode[] = "0123456789"; char szDecode[] = "0123456789"; i = strFind(szCode, cChar); if (i>=0) return szDecode[i]; return -1; } char convertSetANoText(char cChar) { int i; char szCode[] = "1234567890"; char szDecode[] = "!@#$%^&*()"; i = strFind(szCode, cChar); if (i>=0) return szDecode[i]; return -1; } char convertSetBText(char cChar) { int i; char szCode[] = "1234567890"; char szDecode[] = "qwertyuiop"; i = strFind(szCode, cChar); if (i>=0) return szDecode[i]; return -1; } char convertSetBNoText(char cChar) { int i; char szCode[] = "1234567890"; char szDecode[] = "QWERTYUIOP"; i = strFind(szCode, cChar); if (i>=0) return szDecode[i]; return -1; } char convertSetCText(char cChar) { int i; char szCode[] = "1234567890"; char szDecode[] = "asdfghjkl;"; i = strFind(szCode, cChar); if (i>=0) return szDecode[i]; return -1; } char convertSetCNoText(char cChar) { int i; char szCode[] = "1234567890"; char szDecode[] = "ASDFGHJKL:"; i = strFind(szCode, cChar); if (i>=0) return szDecode[i]; return -1; } char* EAN13(const char* szInpara) { int i, nStrlen, nCharPos; char szBuffer[MAX_LEN] = "\0"; char szSwap[MAX_LEN] = "\0", szTemp[MAX_LEN] = "\0", szSUPP[MAX_LEN] = "\0"; char szParity[7] = "\0"; char cCheckDigit; char *pszSupplement; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; nStrlen = strlen(szInpara); for (i=0; i='0' && szInpara[i]<='9' || szInpara[i] == '|') strAppend(szTemp, szInpara[i]); } nCharPos = strFind(szTemp, '|'); if (nCharPos >= 0) { pszSupplement = &szTemp[nCharPos+1]; strcpy(szSUPP, UPC25SUPP(pszSupplement)); szTemp[nCharPos] = '\0'; } nStrlen = strlen(szTemp); if (nStrlen>12) szTemp[12] = '\0'; else if (nStrlen<12) { while (nStrlen<12) { strAppend(szTemp, '0'); nStrlen++; } } switch (szTemp[0]) { case '0': strcpy(szParity, "AAAAAA"); break; case '1': strcpy(szParity, "AABABB"); break; case '2': strcpy(szParity, "AABBAB"); break; case '3': strcpy(szParity, "AABBBA"); break; case '4': strcpy(szParity, "ABAABB"); break; case '5': strcpy(szParity, "ABBAAB"); break; case '6': strcpy(szParity, "ABBBAA"); break; case '7': strcpy(szParity, "ABABAB"); break; case '8': strcpy(szParity, "ABABBA"); break; case '9': strcpy(szParity, "ABBABA"); break; } for (i=1; i<7;i++) { if (szParity[i-1]=='A') strAppend(szBuffer, convertSetAText(szTemp[i])); else if (szParity[i-1]=='B') strAppend(szBuffer, convertSetBText(szTemp[i])); } strAppend(szBuffer, '|'); for (i=7; i<12; i++) strAppend(szBuffer, convertSetCText(szTemp[i])); cCheckDigit = getUPCCheck(szTemp); strAppend(szSwap, textonly(szTemp[0])); strAppend(szSwap, '['); strcat(szSwap, szBuffer); strAppend(szSwap, convertSetCText(cCheckDigit)); strAppend(szSwap, ']'); if (szSUPP[0] != '\0') { strAppend(szSwap, ' '); strcat(szSwap, szSUPP); } strcpy(szOutput, szSwap); return szOutput; } char* EAN8(const char* szInpara) { int i, nStrlen, nCharPos; char szBuffer[MAX_LEN] = "\0"; char szSwap[MAX_LEN] = "\0", szTemp[MAX_LEN] = "\0", szSUPP[MAX_LEN] = "\0"; char szParity[7] = "\0"; char cCheckDigit; char *pszSupplement; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; nStrlen = strlen(szInpara); for (i=0; i='0' && szInpara[i]<='9' || szInpara[i] == '|') strAppend(szTemp, szInpara[i]); } nCharPos = strFind(szTemp, '|'); if (nCharPos >= 0) { pszSupplement = &szTemp[nCharPos+1]; strcpy(szSUPP, UPC25SUPP(pszSupplement)); szTemp[nCharPos] = '\0'; } nStrlen = strlen(szTemp); if (nStrlen>7) szTemp[7] = '\0'; else if (nStrlen<7) { while (nStrlen<7) { strAppend(szTemp, '0'); nStrlen++; } } for (i=0; i<4;i++) strAppend(szBuffer, convertSetAText(szTemp[i])); strAppend(szBuffer, '|'); for (i=4; i<7; i++) strAppend(szBuffer, convertSetCText(szTemp[i])); cCheckDigit = getUPCCheck(szTemp); strAppend(szSwap, '['); strcat(szSwap, szBuffer); strAppend(szSwap, convertSetCText(cCheckDigit)); strAppend(szSwap, ']'); if (szSUPP[0] != '\0') { strAppend(szSwap, ' '); strcat(szSwap, szSUPP); } strcpy(szOutput, szSwap); return szOutput; } char* UPC_A(const char* szInpara) { int i, nStrlen, nCharPos; char szBuffer[MAX_LEN] = "\0"; char szSwap[MAX_LEN] = "\0", szTemp[MAX_LEN] = "\0", szSUPP[MAX_LEN] = "\0"; char szParity[7] = "\0"; char cCheckDigit; char *pszSupplement; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; nStrlen = strlen(szInpara); for (i=0; i='0' && szInpara[i]<='9' || szInpara[i] == '|') strAppend(szTemp, szInpara[i]); } nCharPos = strFind(szTemp, '|'); if (nCharPos >= 0) { pszSupplement = &szTemp[nCharPos+1]; strcpy(szSUPP, UPC25SUPP(pszSupplement)); szTemp[nCharPos] = '\0'; } nStrlen = strlen(szTemp); if (nStrlen>11) szTemp[11] = '\0'; else if (nStrlen<11) { while (nStrlen<11) { strAppend(szTemp, '0'); nStrlen++; } } for (i=1; i<6;i++) strAppend(szBuffer, convertSetAText(szTemp[i])); strAppend(szBuffer, '|'); for (i=6; i<11; i++) strAppend(szBuffer, convertSetCText(szTemp[i])); cCheckDigit = getUPCCheck(szTemp); strAppend(szSwap, textonly(szTemp[0])); strAppend(szSwap, '['); strAppend(szSwap, convertSetANoText(szTemp[0])); strcat(szSwap, szBuffer); strAppend(szSwap, convertSetCNoText(cCheckDigit)); strAppend(szSwap, ']'); strAppend(szSwap, textonly(cCheckDigit)); if (szSUPP[0] != '\0') { strAppend(szSwap, ' '); strcat(szSwap, szSUPP); } strcpy(szOutput, szSwap); return szOutput; } int upce2upca(const char *szInpara, char *pOutput) { char szBuffer[MAX_LEN] = "\0"; if (szInpara[0] != '0' || strlen(szInpara) != 7) return 0; switch (szInpara[6]) { case '0': case '1': case '2': strAppend(szBuffer, szInpara[0]); strAppend(szBuffer, szInpara[1]); strAppend(szBuffer, szInpara[2]); strAppend(szBuffer, szInpara[6]); strcat(szBuffer, "0000"); strAppend(szBuffer, szInpara[3]); strAppend(szBuffer, szInpara[4]); strAppend(szBuffer, szInpara[5]); break; case '3': if (szInpara[3] == '0' || szInpara[3] == '1' || szInpara[3] == '2') return 0; strAppend(szBuffer, szInpara[0]); strAppend(szBuffer, szInpara[1]); strAppend(szBuffer, szInpara[2]); strAppend(szBuffer, szInpara[3]); strcat(szBuffer, "00000"); strAppend(szBuffer, szInpara[4]); strAppend(szBuffer, szInpara[5]); break; case '4': strAppend(szBuffer, szInpara[0]); strAppend(szBuffer, szInpara[1]); strAppend(szBuffer, szInpara[2]); strAppend(szBuffer, szInpara[3]); strAppend(szBuffer, szInpara[4]); strcat(szBuffer, "00000"); strAppend(szBuffer, szInpara[5]); break; case '5': case '6': case '7': case '8': case '9': strAppend(szBuffer, szInpara[0]); strAppend(szBuffer, szInpara[1]); strAppend(szBuffer, szInpara[2]); strAppend(szBuffer, szInpara[3]); strAppend(szBuffer, szInpara[4]); strAppend(szBuffer, szInpara[5]); strcat(szBuffer, "0000"); strAppend(szBuffer, szInpara[6]); break; } strcpy(pOutput, szBuffer); return 1; } char* UPC_E(const char* szInpara) { int i, nStrlen, nCharPos; char szBuffer[MAX_LEN] = "\0"; char szSwap[MAX_LEN] = "\0", szTemp[MAX_LEN] = "\0", szSUPP[MAX_LEN] = "\0"; char szParity[7] = "\0"; char cCheckDigit; char *pszSupplement; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; nStrlen = strlen(szInpara); for (i=0; i='0' && szInpara[i]<='9' || szInpara[i] == '|') strAppend(szTemp, szInpara[i]); } nCharPos = strFind(szTemp, '|'); if (nCharPos >= 0) { pszSupplement = &szTemp[nCharPos+1]; strcpy(szSUPP, UPC25SUPP(pszSupplement)); szTemp[nCharPos] = '\0'; } nStrlen = strlen(szTemp); if (nStrlen>6) szTemp[6] = '\0'; else if (nStrlen<6) { while (nStrlen<6) { strAppend(szTemp, '0'); nStrlen++; } } strInsert(szTemp, '0', 0); upce2upca(szTemp, szSwap); cCheckDigit = getUPCCheck(szSwap); switch (cCheckDigit) { case '0': strcpy(szParity, "BBBAAA"); break; case '1': strcpy(szParity, "BBABAA"); break; case '2': strcpy(szParity, "BBAABA"); break; case '3': strcpy(szParity, "BBAAAB"); break; case '4': strcpy(szParity, "BABBAA"); break; case '5': strcpy(szParity, "BAABBA"); break; case '6': strcpy(szParity, "BAAABB"); break; case '7': strcpy(szParity, "BABABA"); break; case '8': strcpy(szParity, "BABAAB"); break; case '9': strcpy(szParity, "BAABAB"); break; } for (i=1; i<7;i++) { if (szParity[i-1]=='A') strAppend(szBuffer, convertSetAText(szTemp[i])); else if (szParity[i-1]=='B') strAppend(szBuffer, convertSetBText(szTemp[i])); } szSwap[0] = '\0'; strAppend(szSwap, textonly('0')); strAppend(szSwap, '['); strcat(szSwap, szBuffer); strAppend(szSwap, '\''); strAppend(szSwap, textonly(cCheckDigit)); if (szSUPP[0] != '\0') { strAppend(szSwap, ' '); strcat(szSwap, szSUPP); } strcpy(szOutput, szSwap); return szOutput; } char* Codabar(const char* szInpara) { int i=0, nPos; char szBuffer[MAX_LEN] = "\0"; char szCharSet[] = "0123456789-$:/.+"; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; strAppend(szBuffer, 'A'); while (szInpara[i]) { nPos = strFind(szCharSet, szInpara[i]); if (nPos>=0) strAppend(szBuffer, szInpara[i]); i = i + 1; } strAppend(szBuffer, 'B'); strcpy(szOutput, szBuffer); return szOutput; } char* Code25(const char* szInpara) { int i=0, nPos; char szBuffer[MAX_LEN] = "\0"; char szCharSet[] = "0123456789"; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; strAppend(szBuffer, '['); while (szInpara[i]) { nPos = strFind(szCharSet, szInpara[i]); if (nPos>=0) strAppend(szBuffer, szInpara[i]); i = i + 1; } strAppend(szBuffer, ']'); strcpy(szOutput, szBuffer); return szOutput; } char* Code25Check(const char* szInpara) { int i=0, nCheckSum = 0, nStrLen; char szBuffer[MAX_LEN] = "\0"; char szSwap[MAX_LEN] = "\0"; char cCheckDigit; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; while (szInpara[i]) { if (szInpara[i]>='0' && szInpara[i]<='9') strAppend(szBuffer, szInpara[i]); i = i + 1; } i = 0; nStrLen = strlen(szBuffer); while (szBuffer[i]) { if (i % 2 == 0) nCheckSum = nCheckSum + 3 * (szBuffer[nStrLen-i-1]-'0'); else nCheckSum = nCheckSum + szBuffer[nStrLen-i-1] - '0'; i = i + 1; } nCheckSum = nCheckSum % 10; if (nCheckSum != 0) nCheckSum = 10 - nCheckSum; cCheckDigit = '0' + nCheckSum; strAppend(szSwap, '['); strcat(szSwap, szBuffer); strAppend(szSwap, cCheckDigit); strAppend(szSwap, ']'); strcpy(szOutput, szSwap); return szOutput; } char* Bookland(const char* szInpara) { int i=0, nPos, nStrlen, nCharPos; char szBuffer[MAX_LEN] = "\0"; char szSwap[MAX_LEN] = "\0"; char szLeft[MAX_LEN] = "\0"; char szRight[MAX_LEN] = "\0"; char szCharSet[] = "0123456789"; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; nStrlen = strlen(szInpara); nCharPos = strFind(szInpara, '|'); if (nCharPos>-1) { for (i=0; i=0) strAppend(szBuffer, szLeft[i]); i = i + 1; } nStrlen = strlen(szBuffer); if (nStrlen>10) szBuffer[10] = '\0'; else if (nStrlen<10) { while (nStrlen<10) { strAppend(szBuffer, '0'); nStrlen++; } } strcpy(szSwap, "978"); for (i=0; i <9; i++) strAppend(szSwap, szBuffer[i]); szBuffer[0] = '\0'; strcpy(szBuffer, EAN13(szSwap)); szSwap[0] = '\0'; if (nCharPos>-1) { strAppend(szSwap, ' '); strcat(szSwap, UPC25SUPP(szRight)); } strcpy(szOutput, szBuffer); strcat(szOutput, szSwap); return szOutput; } char* Code11(const char* szInpara) { int i=0, nPos, nCheckSumC = 0, nCheckSumK = 0, nStrLen; char szBuffer[MAX_LEN] = "\0"; char szSwap[MAX_LEN] = "\0"; char cCheckDigitC, cCheckDigitK; char szCharSet[] = "0123456789-"; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; while (szInpara[i]) { nPos = strFind(szCharSet, szInpara[i]); if (nPos>=0) strAppend(szBuffer, szInpara[i]); i = i + 1; } nStrLen = strlen(szBuffer); for (i=0; i=0) nCheckSumC = nCheckSumC + ((i+1) % 10)*nPos; } nCheckSumC = nCheckSumC % 11; cCheckDigitC = szCharSet[nCheckSumC]; strAppend(szBuffer, cCheckDigitC); nStrLen = strlen(szBuffer); if (nStrLen>11) { i = 0; while (szBuffer[i]) { nPos = strFind(szCharSet, szBuffer[nStrLen-i-1]); if (nPos>=0) nCheckSumK = nCheckSumK + ((i+1)%9)*nPos; i = i + 1; } nCheckSumK = nCheckSumK % 11; cCheckDigitK = szCharSet[nCheckSumK]; strAppend(szBuffer, cCheckDigitK); } strAppend(szSwap, '['); strcat(szSwap, szBuffer); strAppend(szSwap, ']'); strcpy(szOutput, szSwap); return szOutput; } char* MSIMod10(const char* szInpara) { int i=0, nCheckSum = 0, nStrLen; char szBuffer[MAX_LEN] = "\0"; char szSwap[MAX_LEN] = "\0"; char szNewNo[MAX_LEN] = "\0"; char cCheckDigit; int nChoice, nNewNo = 0; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; while (szInpara[i]) { if (szInpara[i]>='0' && szInpara[i]<='9') strAppend(szBuffer, szInpara[i]); i = i + 1; } i = 0; nStrLen = strlen(szBuffer); nChoice = nStrLen % 2; while (szBuffer[i]) { if (i % 2 == nChoice) nCheckSum = nCheckSum + szBuffer[i] - '0'; else strAppend(szNewNo, szBuffer[i]); i = i + 1; } i = 0; nStrLen = strlen(szNewNo); while (szNewNo[i]) { nNewNo = 10 * nNewNo + szNewNo[i] - '0'; i = i + 1; } nNewNo = 2 * nNewNo; szNewNo[0] = '\0'; while(nNewNo>0) { strInsert(szNewNo, (nNewNo % 10)+'0',0); nNewNo = nNewNo / 10; i = i + 1; } i=0; while (szNewNo[i]) { nCheckSum = nCheckSum + szNewNo[i] - '0'; i = i + 1; } nCheckSum = nCheckSum % 10; if (nCheckSum != 0) nCheckSum = 10 - nCheckSum; cCheckDigit = nCheckSum + '0'; strAppend(szBuffer, cCheckDigit); strAppend(szSwap, '['); strcat(szSwap, szBuffer); strAppend(szSwap, ']'); strcpy(szOutput, szSwap); return szOutput; } void code128aCharSet(char *pSet) { int i; for (i=32; i <=95; i++) strAppend(pSet, i); strAppend(pSet, (unsigned char)NULL_CHAR); for (i=1; i <32; i++) strAppend(pSet, i); for (i=193; i<200; i++) strAppend(pSet, (char)i); } void code128bCharSet(char *pSet) { int i; for (i=32; i <128; i++) strAppend(pSet, i); for (i=193; i<200; i++) strAppend(pSet, (char)i); } void code128cCharSet(char *pSet) { int i; for (i=0; i <10; i++) strAppend(pSet, i+'0'); for (i=192; i<200; i++) strAppend(pSet, (char)i); } void code128MappingSet(char *pSet) { int i; strAppend(pSet, (char)204); for (i=33; i <127; i++) strAppend(pSet, i); for (i=192; i<203; i++) strAppend(pSet, (char)i); } char* Code128A(const char* szInpara) { int i=0, nPos, nCheckSum = 0; char szBuffer[MAX_LEN] = "\0"; char szSwap[MAX_LEN] = "\0"; char szNewNo[MAX_LEN] = "\0"; char cCheckDigit; char szCharSet[MAX_LEN] = "\0", szMappingSet[MAX_LEN] = "\0"; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; code128aCharSet(szCharSet); code128MappingSet(szMappingSet); while (szInpara[i]) { nPos = strFind(szCharSet, szInpara[i]); if (nPos >= 0) strAppend(szBuffer, szInpara[i]); i = i + 1; } nCheckSum = 103; i = 0; while (szBuffer[i]) { nPos = strFind(szCharSet, szBuffer[i]); if (nPos>=0) { strAppend(szSwap, szMappingSet[nPos]); nCheckSum = nCheckSum + (i+1) * nPos; } i = i + 1; } nCheckSum = nCheckSum % 103; cCheckDigit = szMappingSet[nCheckSum]; szBuffer[0] = '\0'; strAppend(szBuffer, (char)200); strcat((char*)szBuffer, (char*)szSwap); strAppend(szBuffer, cCheckDigit); strAppend(szBuffer, (char)203); strAppend(szBuffer, (char)205); strcpy(szOutput, (char*)szBuffer); return szOutput; } char* Code128B(const char* szInpara) { int i=0, nPos, nCheckSum = 0; char szBuffer[MAX_LEN] = "\0"; char szSwap[MAX_LEN] = "\0"; char szNewNo[MAX_LEN] = "\0"; char cCheckDigit; char szCharSet[MAX_LEN] = "\0", szMappingSet[MAX_LEN] = "\0"; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; code128bCharSet(szCharSet); code128MappingSet(szMappingSet); while (szInpara[i]) { nPos = strFind(szCharSet, szInpara[i]); if (nPos >= 0) strAppend(szBuffer, szInpara[i]); i = i + 1; } nCheckSum = 104; i = 0; while (szBuffer[i]) { nPos = strFind(szCharSet, szBuffer[i]); if (nPos>=0) { strAppend(szSwap, szMappingSet[nPos]); nCheckSum = nCheckSum + (i+1) * nPos; } i = i + 1; } nCheckSum = nCheckSum % 103; cCheckDigit = szMappingSet[nCheckSum]; szBuffer[0] = '\0'; strAppend(szBuffer, (char)201); strcat((char*)szBuffer, (char*)szSwap); strAppend(szBuffer, cCheckDigit); strAppend(szBuffer, (char)203); strAppend(szBuffer, (char)205); strcpy(szOutput, (char*)szBuffer); return szOutput; } char* Code128C(const char* szInpara) { int i=0, nPos, nStrLen, nCheckSum = 0; char szBuffer[MAX_LEN] = "\0"; char szSwap[MAX_LEN] = "\0"; char szTemp[MAX_LEN] = "\0"; char cCheckDigit; char szCharSet[MAX_LEN] = "\0", szMappingSet[MAX_LEN] = "\0"; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; code128cCharSet(szCharSet); code128MappingSet(szMappingSet); while (szInpara[i]) { nPos = strFind(szCharSet, szInpara[i]); if (nPos >= 0) strAppend(szBuffer, szInpara[i]); i = i + 1; } nCheckSum = 105; nStrLen = strlen((char*)szBuffer); if (nStrLen % 2 == 1) strAppend(szBuffer, '0'); strcat((char*)szTemp, (char*)szBuffer); i = 0; while (i < nStrLen) { nPos = 10 * (szTemp[i] - '0') + szTemp[i+1] - '0'; if (nPos>=0) strAppend(szSwap, szMappingSet[nPos]); i = i + 2; } i = 0; while (szSwap[i]) { if (szSwap[i] == (char)204) ; else if (szSwap[i]>=33 && szSwap[i]<127) nCheckSum = nCheckSum + (i+1)*((unsigned char)szSwap[i]-32); else if ((unsigned char)szSwap[i] >= 192) nCheckSum = nCheckSum + (i+1)*((unsigned char)szSwap[i]-97); i = i + 1; } nCheckSum = nCheckSum % 103; cCheckDigit = szMappingSet[nCheckSum]; szBuffer[0] = '\0'; strAppend(szBuffer, (char)202); strcat((char*)szBuffer, (char*)szSwap); strAppend(szBuffer, cCheckDigit); strAppend(szBuffer, (char)203); strAppend(szBuffer, (char)205); strcpy(szOutput, (char*)szBuffer); return szOutput; } char* Code128Auto(const char* szInpara) { int i=0, nPos, nStrLen, nCheckSum = 0; char szBuffer[MAX_LEN] = "\0"; char szSwap[MAX_LEN] = "\0"; char szTemp[MAX_LEN] = "\0"; char cCheckDigit; char szCharASet[MAX_LEN] = "\0", szCharBSet[MAX_LEN] = "\0", szCharCSet[MAX_LEN] = "\0", szMappingSet[MAX_LEN] = "\0"; int nValue, nWeight; char *pCurCharSet; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; code128aCharSet(szCharASet); code128bCharSet(szCharBSet); code128cCharSet(szCharCSet); code128MappingSet(szMappingSet); nStrLen = strlen(szInpara); if (szInpara[0] <= 31) pCurCharSet = szCharASet; if (szInpara[0] >= 32 && szInpara[0] <= 126) pCurCharSet = szCharBSet; if (nStrLen > 4) { i = 0; while (i<4) { if (szInpara[0] < '0' || szInpara[0] > '9') break; i = i + 1; } if (i == 4) pCurCharSet = szCharCSet; } if (pCurCharSet == &szCharASet[0]) strAppend(szBuffer, (char)200); else if (pCurCharSet == &szCharBSet[0]) strAppend(szBuffer, (char)201); else if (pCurCharSet == &szCharCSet[0]) strAppend(szBuffer, (char)202); i = 0; while (szInpara[i]) { if (szInpara[i] == (char)199) strAppend(szBuffer, (char)199); else if ((i < nStrLen - 4) && IsNumeric(szInpara[i]) && IsNumeric(szInpara[i+1]) && IsNumeric(szInpara[i+2]) && IsNumeric(szInpara[i+3]) || ((pCurCharSet == szCharCSet) && (i < nStrLen-1) && (IsNumeric(szInpara[i])) && (IsNumeric(szInpara[i+1])) )) { if (pCurCharSet != szCharCSet) { strAppend(szBuffer, (char)196); pCurCharSet = szCharCSet; } nPos = 10 * (szInpara[i]-'0') + szInpara[i+1]-'0'; strAppend(szBuffer, szMappingSet[nPos]); i = i + 1; } else if (((i < nStrLen) && ((unsigned char)szInpara[i] < 31 || (unsigned char)szInpara[i] == NULL_CHAR)) || ((pCurCharSet == &szCharASet[0]) && (szInpara[i] > 32 && szInpara[i] < 96))) { if (pCurCharSet != szCharASet) { strAppend(szBuffer, (char)198); pCurCharSet = szCharASet; } nPos = strFind(pCurCharSet, szInpara[i]); if (nPos>=0) strAppend(szBuffer, szMappingSet[nPos]); } else if ( i < nStrLen && szInpara[i] > 31 && szInpara[i] < 127 ) { if (pCurCharSet != szCharBSet) { strAppend(szBuffer, (char)197); pCurCharSet = szCharBSet; } nPos = strFind(pCurCharSet, szInpara[i]); if (nPos>=0) strAppend(szBuffer, szMappingSet[nPos]); } i = i + 1; } i = 0; nValue = 0; while (szBuffer[i]) { if ((unsigned char)szBuffer[i] == 204) nValue = 0; else if (szBuffer[i] >= 33 && szBuffer[i] <= (char)126 ) nValue = szBuffer[i] - 32; else if ((unsigned char)szBuffer[i] >= 192) nValue = (unsigned char)szBuffer[i] - 97; if (i > 1) nWeight = i; else nWeight = 1; nCheckSum = nCheckSum + nValue * nWeight; i = i + 1; } nCheckSum = nCheckSum % 103; cCheckDigit = szMappingSet[nCheckSum]; strcat((char*)szSwap, (char*)szBuffer); strAppend(szSwap, cCheckDigit); strAppend(szSwap, (char)203); strAppend(szSwap, (char)205); strcpy(szOutput, (char*)szSwap); return szOutput; } char* UCC128(char* szInpara) { int i, nLen, checkSum, weight, charVal; char szMappingSet[MAX_LEN] = "\0", szUCC128[MAX_LEN] = "\0"; char szSpecial[MAX_LEN] = "\0", szTemp[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; code128MappingSet(szMappingSet); nLen = strlen(szInpara); for (i=0; i= 19) { for (i=0; i<19; i++) strAppend(szEAN128, szTemp[i]); } else if (nLen < 19) strcpy(szEAN128, "0000000000000000000"); strInsert(szEAN128, '9', 0); strInsert(szEAN128, '1', 1); nLen = strlen(szEAN128); if (nLen != 21) { szOutput[0] = '\0'; return szOutput; } for (i=0; i='0' && ch <= '9' ) temp_str[count++]=ch; } temp_str[count]='\0'; //append 0 to the end of string if ( strlen(temp_str) % 2 == 1) { temp_str[count++]='0'; temp_str[count]='\0'; } /////////////////////////////// strAppend(szITF25, (char)202); for(i=0; i=0 && value <= 93 ) strAppend(szITF25, '!' + value); else strAppend(szITF25, value-94+196); } strAppend(szITF25, (char)203); strcpy(szOutput, szITF25); return szOutput; } char* ITF25Check(const char* input) { char temp_str[MAX_LEN], szITF25[MAX_LEN] = "\0"; size_t i; int count; char ch; int value1, value2, value; int check_sum; char check_digit; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(input)); input = szSpecial; //filter no-numeric string count=0; for(i=0; i='0' && ch <= '9' ) temp_str[count++]=ch; } temp_str[count]='\0'; //append 0 to the end of string if ( strlen(temp_str) % 2 == 0) { temp_str[count++]='0'; temp_str[count]='\0'; } //calc the check sum check_sum=0; for(i=0; i=0 && value <= 93 ) strAppend(szITF25, '!' + value); else strAppend(szITF25, value-94+196); } strAppend(szITF25, (char)203); strcpy(szOutput, szITF25); return szOutput; } char* Postnet(const char* szInpara) { int i, nLen, nCheckSum=0; char szTemp[MAX_LEN] = "\0", szBuffer[MAX_LEN] = "\0"; char szSpecial[MAX_LEN] = "\0"; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; nLen = strlen(szInpara); //filter for (i=0; i=0 && nLen<5) { while (strlen(szBuffer)<5) strAppend(szBuffer, '0'); } else if (nLen>5 && nLen<9) { while (strlen(szBuffer)<9) strAppend(szBuffer, '0'); } else if (nLen>9 && nLen<13) { while (strlen(szBuffer)<13) strAppend(szBuffer, '0'); } else if (nLen>13) szBuffer[13] = '\0'; nLen = strlen(szBuffer); for (i=0; i= 0) { strAppend(szTemp, szInpara[i]); if (szInpara[i] < 65) nCharVal = szInpara[i] - 48; else nCharVal = szInpara[i] - 55; nTemp = nCharVal / 6; if (nTemp >= 5) nCheckSum = 0; else nCheckSum = nTemp + 1; ntu = ntu + nCheckSum; nTemp = nCharVal - nTemp * 6; if (nTemp >= 5) nCheckSum = 0; else nCheckSum = nTemp + 1; ntl = ntl + nCheckSum; } } ntu = ntu % 6; if (ntu == 0) ntu = 6; ntl = ntl % 6; if (ntl == 0) ntl = 6; nCheckSum = (ntu - 1) * 6 + ntl - 1; strInsert(szTemp, '[', 0); if (nCheckSum < 10) strAppend(szTemp, (char)nCheckSum+48); else strAppend(szTemp, (char)nCheckSum+55); strAppend(szTemp, ']'); strcpy(szOutput, szTemp); return szOutput; } char* Telepen(const char* szInpara) { int i=0, nCheckSum = 0; char szBuffer[MAX_LEN] = "\0"; char szSwap[MAX_LEN] = "\0"; char szSpecial[MAX_LEN] = "\0"; char cCheckDigit; strcpy(szSpecial, SpecialChar(szInpara)); szInpara = szSpecial; while (szInpara[i]) { if (szInpara[i]>=0 && szInpara[i]<=127) { strAppend(szBuffer, szInpara[i]); nCheckSum = nCheckSum + szInpara[i]; } i = i + 1; } cCheckDigit = char(127 - (nCheckSum % 127)); strAppend(szBuffer, cCheckDigit); i = 0; while (szBuffer[i]) { if (szBuffer[i] == ' ') strAppend(szSwap, '='); else if (szBuffer[i] == '=') strAppend(szSwap, char(NULL_CHAR)); else if (szBuffer[i] == '[') strAppend(szSwap, char(241)); else if (szBuffer[i] == ']') strAppend(szSwap, char(242)); else if (szBuffer[i] >=0 && szBuffer[i]<= 31) strAppend(szSwap, char(szBuffer[i]+192)); else if (szBuffer[i] == 127) strAppend(szSwap, char(224)); else strAppend(szSwap, szBuffer[i]); i = i + 1; } strInsert(szSwap, '[', 0); strAppend(szSwap, ']'); strcpy(szOutput, szSwap); return szOutput; } char* TelepenNumeric(const char* szInpara) { int i=0, nTemp, nStrLen, nCheckSum = 0; char szBuffer[MAX_LEN] = "\0"; char szSwap[MAX_LEN] = "\0"; char cCheckDigit; // filter numeric character while (szInpara[i]) { if (szInpara[i]>='0' && szInpara[i]<='9') strAppend(szBuffer, szInpara[i]); i = i + 1; } nStrLen = strlen(szBuffer); if (nStrLen % 2 == 1) strAppend(szBuffer, '0'); i = 0; while (szBuffer[i]) { nTemp = 10 * (szBuffer[i] - '0') + szBuffer[i+1] - '0' + 27; if (nTemp>=0) strAppend(szSwap, nTemp); i = i + 2; } i = 0; while (szSwap[i]) { nCheckSum = nCheckSum + szSwap[i]; i = i + 1; } cCheckDigit = 127 - (nCheckSum % 127); strAppend(szSwap, cCheckDigit); // set null string szBuffer[0] = '\0'; i = 0; while (szSwap[i]) { if (szSwap[i] == ' ') strAppend(szBuffer, '='); else if (szSwap[i] == '=') strAppend(szBuffer, char(NULL_CHAR)); else if (szSwap[i] == '[') strAppend(szBuffer, char(241)); else if (szSwap[i] == ']') strAppend(szBuffer, char(242)); else if (szSwap[i] >=0 && szSwap[i]<= 31) strAppend(szBuffer, char(szSwap[i]+192)); else if (szSwap[i] == 127) strAppend(szBuffer, char(224)); else strAppend(szBuffer, szSwap[i]); i = i + 1; } strInsert(szBuffer, '[', 0); strAppend(szBuffer, ']'); strcpy(szOutput, szBuffer); return szOutput; }