Barcode.h 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397
  1. #ifndef Barcode_h_djdfkjdjkfgjgjghdhdhdgdgfgfgfgeue
  2. #define Barcode_h_djdfkjdjkfgjgjghdhdhdgdgfgfgfgeue
  3. class Barcode39;
  4. class Barcode93;
  5. class BarcodeIof5;
  6. class Barcode128;
  7. const int ga2_Code128[2][207]=
  8. {
  9. {
  10. 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  11. 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  12. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  13. 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  14. 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  15. 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  16. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  17. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  18. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  19. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  20. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  21. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  22. -1, -1, -1, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
  23. },
  24. {
  25. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  26. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  27. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  28. 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  29. 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  30. 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  31. 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  32. 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, -1,
  33. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  34. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  35. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  36. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  37. -1, -1, -1, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
  38. },
  39. };
  40. class BarcodeBase
  41. {
  42. public:
  43. BarcodeBase()
  44. {
  45. Clear();
  46. i_Ratio=3;
  47. }
  48. void operator=(const BarcodeBase&bc)
  49. {
  50. i_LenBuf=bc.i_LenBuf;
  51. i_Ratio =bc.i_Ratio;
  52. memcpy(ia_Buf,bc.ia_Buf,sizeof(ia_Buf));
  53. }
  54. void Clear()
  55. {
  56. memset(ia_Buf,0,sizeof(ia_Buf));
  57. i_LenBuf=0;
  58. }
  59. int GetEncodeLength() const
  60. {
  61. BYTE*pb=(BYTE*)ia_Buf;
  62. int i,iLen=0;
  63. for(i=0;i<i_LenBuf;i++)
  64. {
  65. //wide is 3
  66. if(*pb&2) iLen+=(i_Ratio-1);
  67. pb++;
  68. }
  69. return iLen+i_LenBuf;
  70. }
  71. int GetBufferLength() const
  72. {
  73. return i_LenBuf;
  74. }
  75. const BYTE&GetAt(int i) const
  76. {
  77. return ia_Buf[i];
  78. }
  79. int GetRatio() const
  80. {
  81. return i_Ratio;
  82. }
  83. int SetRatio(int iRatio)
  84. {
  85. i_Ratio=iRatio;
  86. if(i_Ratio<=0)
  87. i_Ratio=1;
  88. return i_Ratio;
  89. }
  90. INT GetBarCodeWidth( IN CONST INT& nPenWidth )
  91. {
  92. INT nBarCodeWidth = 0;
  93. BYTE *pBarCode = ia_Buf;
  94. INT nBarCodeLen = i_LenBuf;
  95. BYTE bBar;
  96. int i , j;
  97. int nSubCodeLen;
  98. for ( i = 0; i < nBarCodeLen; i++)
  99. {
  100. bBar = *pBarCode & 0x01;
  101. nSubCodeLen = (*pBarCode & 0x02 ) ? i_Ratio : 1;
  102. for ( j = 0; j < nSubCodeLen; j++)
  103. {
  104. nBarCodeWidth+= nPenWidth;
  105. }
  106. pBarCode++;
  107. }
  108. return nBarCodeWidth;
  109. }
  110. /************************************************************************/
  111. /* 函数:[4/25/2016 IT];
  112. /* 描述:;
  113. /* 参数:;
  114. /* [IN] hDC:;
  115. /* [IN] iX:条码开始x坐标;
  116. /* [IN] iY0:条码开始y坐标;
  117. /* [IN] iY10:条码高度;
  118. /* [IN] iY11:条码高度;
  119. /* [IN] clrBar:条柱颜色;
  120. /* [IN] clrSpace:条柱(空白区)颜色;
  121. /* [IN] iPenW:笔宽;
  122. /* [OUT] :;
  123. /* [IN/OUT] :;
  124. /* 返回:void;
  125. /* 注意:;
  126. /* 示例:;
  127. /*
  128. /* 修改:;
  129. /* 日期:;
  130. /* 内容:;
  131. /************************************************************************/
  132. void DrawBarcode(HDC hDC,int iX,int iY0,int iY10,int iY11,const COLORREF clrBar,const COLORREF clrSpace,const int iPenW)
  133. {
  134. HPEN hPenBar =::CreatePen(PS_SOLID,iPenW,clrBar);
  135. HPEN hPenSpace =::CreatePen(PS_SOLID,iPenW,clrSpace);
  136. HPEN hPenOld=(HPEN)::SelectObject(hDC,hPenBar);
  137. BYTE*pb=ia_Buf;
  138. int i0,iNum0=i_LenBuf;
  139. BYTE bBar;
  140. int i1,iNum1;
  141. int iY;
  142. for(i0=0;i0<iNum0;i0++)
  143. {
  144. bBar =*pb&0x01;
  145. iNum1 =(*pb&0x02)?i_Ratio:1;
  146. iY =(*pb&0x04)?iY11:iY10;
  147. for(i1=0;i1<iNum1;i1++)
  148. {
  149. if(bBar) ::SelectObject(hDC,hPenBar);
  150. else ::SelectObject(hDC,hPenSpace);
  151. ::MoveToEx(hDC,iX,iY0,0);
  152. ::LineTo(hDC,iX,iY);
  153. iX+=iPenW;
  154. }
  155. pb++;
  156. }
  157. ::SelectObject(hDC,hPenOld);
  158. ::DeleteObject(hPenBar);
  159. ::DeleteObject(hPenSpace);
  160. }
  161. protected:
  162. BYTE ia_Buf[4096];
  163. int i_LenBuf;
  164. int i_Ratio;
  165. struct IntString
  166. {
  167. int ch;
  168. char*psz;
  169. };
  170. };
  171. class Barcode39:public BarcodeBase
  172. {
  173. //[n/a][n/a][n/a][n/a][n/a][n/a][w-n][b-s]
  174. public:
  175. Barcode39()
  176. {
  177. }
  178. ~Barcode39()
  179. {
  180. }
  181. BOOL Encode39(const char*pszCodeIn)
  182. {
  183. int iLen=strlen(pszCodeIn);
  184. char*pszCode=new char[iLen+3];
  185. sprintf(pszCode,"*%s*",pszCodeIn);
  186. strupr(pszCode);
  187. BYTE*pFst=ia_Buf;
  188. BYTE*p0=pFst,*p1;
  189. iLen+=2;
  190. int i;
  191. for(i=0;i<iLen;i++)
  192. {
  193. p1=P_GetNarrowWideBarSpace39(pszCode[i],p0);
  194. if(p1==0) return 0;
  195. p0=p1;
  196. }
  197. i_LenBuf=p1-pFst;
  198. delete []pszCode;
  199. return 1;
  200. }
  201. void Draw39(HDC hDC,int iX,int iY0,int iY1,const COLORREF clrBar,const COLORREF clrSpace,const int iPenW)
  202. {
  203. DrawBarcode(hDC,iX,iY0,iY1,iY1,clrBar,clrSpace,iPenW);
  204. }
  205. private:
  206. BYTE*P_GetNarrowWideBarSpace39(char ch,BYTE*pb)
  207. {
  208. IntString infs[]=
  209. {
  210. {'1', "wnnwnnnnwn"},
  211. {'2', "nnwwnnnnwn"},
  212. {'3', "wnwwnnnnnn"},
  213. {'4', "nnnwwnnnwn"},
  214. {'5', "wnnwwnnnnn"},
  215. {'6', "nnwwwnnnnn"},
  216. {'7', "nnnwnnwnwn"},
  217. {'8', "wnnwnnwnnn"},
  218. {'9', "nnwwnnwnnn"},
  219. {'0', "nnnwwnwnnn"},
  220. {'A', "wnnnnwnnwn"},
  221. {'B', "nnwnnwnnwn"},
  222. {'C', "wnwnnwnnnn"},
  223. {'D', "nnnnwwnnwn"},
  224. {'E', "wnnnwwnnnn"},
  225. {'F', "nnwnwwnnnn"},
  226. {'G', "nnnnnwwnwn"},
  227. {'H', "wnnnnwwnnn"},
  228. {'I', "nnwnnwwnnn"},
  229. {'J', "nnnnwwwnnn"},
  230. {'K', "wnnnnnnwwn"},
  231. {'L', "nnwnnnnwwn"},
  232. {'M', "wnwnnnnwnn"},
  233. {'N', "nnnnwnnwwn"},
  234. {'O', "wnnnwnnwnn"},
  235. {'P', "nnwnwnnwnn"},
  236. {'Q', "nnnnnnwwwn"},
  237. {'R', "wnnnnnwwnn"},
  238. {'S', "nnwnnnwwnn"},
  239. {'T', "nnnnwnwwnn"},
  240. {'U', "wwnnnnnnwn"},
  241. {'V', "nwwnnnnnwn"},
  242. {'W', "wwwnnnnnnn"},
  243. {'X', "nwnnwnnnwn"},
  244. {'Y', "wwnnwnnnnn"},
  245. {'Z', "nwwnwnnnnn"},
  246. {'-', "nwnnnnwnwn"},
  247. {'.', "wwnnnnwnnn"},
  248. {' ', "nwwnnnwnnn"},
  249. {'*', "nwnnwnwnnn"},
  250. {'$', "nwnwnwnnnn"},
  251. {'/', "nwnwnnnwnn"},
  252. {'+', "nwnnnwnwnn"},
  253. {'%', "nnnwnwnwnn"},
  254. };
  255. int i0,iNum0=sizeof(infs)/sizeof(infs[0]);
  256. int i1;
  257. for(i0=0;i0<iNum0;i0++)
  258. {
  259. IntString&inf=infs[i0];
  260. if(inf.ch==ch)
  261. {
  262. for(i1=0;i1<10;i1++)
  263. {
  264. if(inf.psz[i1]=='w') *pb+=2;
  265. if(i1%2==0) *pb+=1;
  266. pb++;
  267. }
  268. return pb;
  269. }
  270. }
  271. return 0;
  272. }
  273. };
  274. class BarcodeI2of5:public BarcodeBase
  275. {
  276. //[n/a][n/a][n/a][n/a][n/a][n/a][w-n][b-s]
  277. public:
  278. BarcodeI2of5()
  279. {
  280. }
  281. ~BarcodeI2of5()
  282. {
  283. }
  284. BOOL EncodeI2of5(const char*pszCode)
  285. {
  286. Clear();
  287. BYTE*pFst=ia_Buf;
  288. BYTE*pb=pFst;
  289. const int iNum=strlen(pszCode);
  290. int i;
  291. //"nnnn"
  292. for(i=0;i<4;i++)
  293. {
  294. if(i%2==0) *pb+=1;
  295. pb++;
  296. }
  297. int iV;
  298. for(i=0;i<iNum;i+=2)
  299. {
  300. iV=pszCode[i]-'0';
  301. iV=iV*10;
  302. iV+=pszCode[i+1]-'0';
  303. pb=P_GetNarrorWideBarSpaceI2of5(pb,iV);
  304. if(pb==0) return 0;
  305. }
  306. //"wnn"
  307. *pb+=3; pb++;
  308. *pb+=0; pb++;
  309. *pb+=1; pb++;
  310. i_LenBuf=pb-pFst;
  311. return 1;
  312. }
  313. void DrawI2of5(HDC hDC,int iX,int iY0,int iY1,const COLORREF clrBar,const COLORREF clrSpace,const int iPenW)
  314. {
  315. DrawBarcode(hDC,iX,iY0,iY1,iY1,clrBar,clrSpace,iPenW);
  316. }
  317. private:
  318. BYTE*P_GetNarrorWideBarSpaceI2of5(BYTE*pb,int ch)
  319. {
  320. if(ch<0) return 0;
  321. if(ch>99) return 0;
  322. IntString infs[]=
  323. {
  324. {0, "nnnnwwwwnn"},
  325. {1, "nwnnwnwnnw"},
  326. {2, "nnnwwnwnnw"},
  327. {3, "nwnwwnwnnn"},
  328. {4, "nnnnwwwnnw"},
  329. {5, "nwnnwwwnnn"},
  330. {6, "nnnwwwwnnn"},
  331. {7, "nnnnwnwwnw"},
  332. {8, "nwnnwnwwnn"},
  333. {9, "nnnwwnwwnn"},
  334. {10, "wnnnnwnwwn"},
  335. {11, "wwnnnnnnww"},
  336. {12, "wnnwnnnnww"},
  337. {13, "wwnwnnnnwn"},
  338. {14, "wnnnnwnnww"},
  339. {15, "wwnnnwnnwn"},
  340. {16, "wnnwnwnnwn"},
  341. {17, "wnnnnnnwww"},
  342. {18, "wwnnnnnwwn"},
  343. {19, "wnnwnnnwwn"},
  344. {20, "nnwnnwnwwn"},
  345. {21, "nwwnnnnnww"},
  346. {22, "nnwwnnnnww"},
  347. {23, "nwwwnnnnwn"},
  348. {24, "nnwnnwnnww"},
  349. {25, "nwwnnwnnwn"},
  350. {26, "nnwwnwnnwn"},
  351. {27, "nnwnnnnwww"},
  352. {28, "nwwnnnnwwn"},
  353. {29, "nnwwnnnwwn"},
  354. {30, "wnwnnwnwnn"},
  355. {31, "wwwnnnnnnw"},
  356. {32, "wnwwnnnnnw"},
  357. {33, "wwwwnnnnnn"},
  358. {34, "wnwnnwnnnw"},
  359. {35, "wwwnnwnnnn"},
  360. {36, "wnwwnwnnnn"},
  361. {37, "wnwnnnnwnw"},
  362. {38, "wwwnnnnwnn"},
  363. {39, "wnwwnnnwnn"},
  364. {40, "nnnnwwnwwn"},
  365. {41, "nwnnwnnnww"},
  366. {42, "nnnwwnnnww"},
  367. {43, "nwnwwnnnwn"},
  368. {44, "nnnnwwnnww"},
  369. {45, "nwnnwwnnwn"},
  370. {46, "nnnwwwnnwn"},
  371. {47, "nnnnwnnwww"},
  372. {48, "nwnnwnnwwn"},
  373. {49, "nnnwwnnwwn"},
  374. {50, "wnnnwwnwnn"},
  375. {51, "wwnnwnnnnw"},
  376. {52, "wnnwwnnnnw"},
  377. {53, "wwnwwnnnnn"},
  378. {54, "wnnnwwnnnw"},
  379. {55, "wwnnwwnnnn"},
  380. {56, "wnnwwwnnnn"},
  381. {57, "wnnnwnnwnw"},
  382. {58, "wwnnwnnwnn"},
  383. {59, "wnnwwnnwnn"},
  384. {60, "nnwnwwnwnn"},
  385. {61, "nwwnwnnnnw"},
  386. {62, "nnwwwnnnnw"},
  387. {63, "nwwwwnnnnn"},
  388. {64, "nnwnwwnnnw"},
  389. {65, "nwwnwwnnnn"},
  390. {66, "nnwwwwnnnn"},
  391. {67, "nnwnwnnwnw"},
  392. {68, "nwwnwnnwnn"},
  393. {69, "nnwwwnnwnn"},
  394. {70, "nnnnnwwwwn"},
  395. {71, "nwnnnnwnww"},
  396. {72, "nnnwnnwnww"},
  397. {73, "nwnwnnwnwn"},
  398. {74, "nnnnnwwnww"},
  399. {75, "nwnnnwwnwn"},
  400. {76, "nnnwnwwnwn"},
  401. {77, "nnnnnnwwww"},
  402. {78, "nwnnnnwwwn"},
  403. {79, "nnnwnnwwwn"},
  404. {80, "wnnnnwwwnn"},
  405. {81, "wwnnnnwnnw"},
  406. {82, "wnnwnnwnnw"},
  407. {83, "wwnwnnwnnn"},
  408. {84, "wnnnnwwnnw"},
  409. {85, "wwnnnwwnnn"},
  410. {86, "wnnwnwwnnn"},
  411. {87, "wnnnnnwwnw"},
  412. {88, "wwnnnnwwnn"},
  413. {89, "wnnwnnwwnn"},
  414. {90, "nnwnnwwwnn"},
  415. {91, "nwwnnnwnnw"},
  416. {92, "nnwwnnwnnw"},
  417. {93, "nwwwnnwnnn"},
  418. {94, "nnwnnwwnnw"},
  419. {95, "nwwnnwwnnn"},
  420. {96, "nnwwnwwnnn"},
  421. {97, "nnwnnnwwnw"},
  422. {98, "nwwnnnwwnn"},
  423. {99, "nnwwnnwwnn"},
  424. };
  425. IntString&inf=infs[ch];
  426. int i;
  427. for(i=0;i<10;i++)
  428. {
  429. if(inf.psz[i]=='w') *pb+=2;
  430. if(i%2==0) *pb+=1;
  431. pb++;
  432. }
  433. return pb;
  434. }
  435. };
  436. class Barcode93:public BarcodeBase
  437. {
  438. //[n/a][n/a][n/a][n/a][n/a][n/a][n/a][b-s]
  439. public:
  440. Barcode93()
  441. {
  442. }
  443. ~Barcode93()
  444. {
  445. }
  446. BOOL Encode93(const char* pszCode)
  447. {
  448. Clear();
  449. const int iNum=strlen(pszCode);
  450. BYTE*pFst=ia_Buf;
  451. BYTE*pb=pFst;
  452. pb=P_GetBarSpace93(pb,47);
  453. if(pb==0) return 0;
  454. BOOL b;
  455. int i,iFirst,iSecond;
  456. for(i=0;i<iNum;i++)
  457. {
  458. b=P_AscIItoCode93Sequence((int)pszCode[i],iFirst,iSecond);
  459. if(b==0) return 0;
  460. pb=P_GetBarSpace93(pb,iFirst);
  461. if(pb==0) return 0;
  462. if(iSecond!=-1)
  463. {
  464. pb=P_GetBarSpace93(pb,iSecond);
  465. if(pb==0) return 0;
  466. }
  467. }
  468. pb=P_GetCheckDigits(pb,pszCode);
  469. if(pb==0) return 0;
  470. pb=P_GetBarSpace93(pb,48);
  471. if(pb==0) return 0;
  472. i_LenBuf=pb-pFst;
  473. return 1;
  474. }
  475. void Draw93(HDC hDC,int iX,int iY0,int iY1,const COLORREF clrBar,const COLORREF clrSpace,const int iPenW)
  476. {
  477. DrawBarcode(hDC,iX,iY0,iY1,iY1,clrBar,clrSpace,iPenW);
  478. }
  479. private:
  480. BYTE*P_GetBarSpace93(BYTE*pb,int ch)
  481. {
  482. if(ch<0) return 0;
  483. if(ch>48) return 0;
  484. IntString infs[]=
  485. {
  486. {0, "bsssbsbss"},
  487. {1, "bsbssbsss"},
  488. {2, "bsbsssbss"},
  489. {3, "bsbssssbs"},
  490. {4, "bssbsbsss"},
  491. {5, "bssbssbss"},
  492. {6, "bssbsssbs"},
  493. {7, "bsbsbssss"},
  494. {8, "bsssbssbs"},
  495. {9, "bssssbsbs"},
  496. {10, "bbsbsbsss"},
  497. {11, "bbsbssbss"},
  498. {12, "bbsbsssbs"},
  499. {13, "bbssbsbss"},
  500. {14, "bbssbssbs"},
  501. {15, "bbsssbsbs"},
  502. {16, "bsbbsbsss"},
  503. {17, "bsbbssbss"},
  504. {18, "bsbbsssbs"},
  505. {19, "bssbbsbss"},
  506. {20, "bsssbbsbs"},
  507. {21, "bsbsbbsss"},
  508. {22, "bsbssbbss"},
  509. {23, "bsbsssbbs"},
  510. {24, "bssbsbbss"},
  511. {25, "bsssbsbbs"},
  512. {26, "bbsbbsbss"},
  513. {27, "bbsbbssbs"},
  514. {28, "bbsbsbbss"},
  515. {29, "bbsbssbbs"},
  516. {30, "bbssbsbbs"},
  517. {31, "bbssbbsbs"},
  518. {32, "bsbbsbbss"},
  519. {33, "bsbbssbbs"},
  520. {34, "bssbbsbbs"},
  521. {35, "bssbbbsbs"},
  522. {36, "bssbsbbbs"},
  523. {37, "bbbsbsbss"},
  524. {38, "bbbsbssbs"},
  525. {39, "bbbssbsbs"},
  526. {40, "bsbbsbbbs"},
  527. {41, "bsbbbsbbs"},
  528. {42, "bbsbsbbbs"},
  529. {43, "bssbssbbs"},
  530. {44, "bbbsbbsbs"},
  531. {45, "bbbsbsbbs"},
  532. {46, "bssbbssbs"},
  533. {47, "bsbsbbbbs"},
  534. {48, "bsbsbbbbsb"},
  535. };
  536. IntString&inf=infs[ch];
  537. int i;
  538. for(i=0;i<9;i++)
  539. {
  540. if(inf.psz[i]=='b') *pb+=1;
  541. pb++;
  542. }
  543. if(ch==48)
  544. {
  545. *pb+=1;
  546. pb++;
  547. }
  548. return pb;
  549. }
  550. private:
  551. BYTE*P_GetCheckDigits(BYTE*pb,const char*&pszCode)
  552. {
  553. int i,iSum,iWeight,iFirst,iSecond;
  554. // "C" check digit character
  555. iWeight=1;
  556. iSum=0;
  557. const int iNum=strlen(pszCode);
  558. for(i=iNum-1;i>-1;i--)
  559. {
  560. P_AscIItoCode93Sequence((int)pszCode[i],iFirst,iSecond);
  561. iSum+=(iWeight*iFirst);
  562. iWeight++;
  563. if(iWeight>20) iWeight=1;
  564. if(iSecond!=-1)
  565. {
  566. iSum+=(iWeight*iSecond);
  567. iWeight++;
  568. if(iWeight>20) iWeight=1;
  569. }
  570. }
  571. pb=P_GetBarSpace93(pb,iSum%47);
  572. if(pb==0) return 0;
  573. iWeight=2;
  574. iSum=iSum%47;
  575. for(i=iNum-1;i>-1;i--)
  576. {
  577. P_AscIItoCode93Sequence((int)pszCode[i],iFirst,iSecond);
  578. iSum +=(iWeight * iFirst);
  579. iWeight++;
  580. if(iWeight>15) iWeight=1;
  581. if(iSecond!=-1)
  582. {
  583. iSum +=(iWeight * iSecond);
  584. iWeight++;
  585. if(iWeight>15) iWeight=1;
  586. }
  587. }
  588. pb=P_GetBarSpace93(pb,iSum%47);
  589. if(pb==0) return 0;
  590. return pb;
  591. }
  592. BOOL P_AscIItoCode93Sequence(int iValue,int&iFirst,int&iSecond)
  593. {
  594. if(iValue<0) return 0;
  595. if(iValue>127) return 0;
  596. struct I3{int iV,iFirst,iSecond;};
  597. I3 i3s[]=
  598. {
  599. {0, 44, 30},
  600. {1, 43, 10},
  601. {2, 43, 11},
  602. {3, 43, 12},
  603. {4, 43, 13},
  604. {5, 43, 14},
  605. {6, 43, 15},
  606. {7, 43, 16},
  607. {8, 43, 17},
  608. {9, 43, 18},
  609. {10,43, 19},
  610. {11,43, 20},
  611. {12,43, 21},
  612. {13,43, 22},
  613. {14,43, 23},
  614. {15,43, 24},
  615. {16,43, 25},
  616. {17,43, 26},
  617. {18,43, 27},
  618. {19,43, 28},
  619. {20,43, 29},
  620. {21,43, 30},
  621. {22,43, 31},
  622. {23,43, 32},
  623. {24,43, 33},
  624. {25,43, 34},
  625. {26,43, 35},
  626. {27,44, 10},
  627. {28,44, 11},
  628. {29,44, 12},
  629. {30,44, 13},
  630. {31,44, 14},
  631. {32,38, -1},
  632. {33,45, 10},
  633. {34,45, 11},
  634. {35,45, 12},
  635. {36,39, -1},
  636. {37,42, -1},
  637. {38,45, 15},
  638. {39,45, 16},
  639. {40,45, 17},
  640. {41,45, 18},
  641. {42,45, 19},
  642. {43,41, -1},
  643. {44,45, 21},
  644. {45,36, -1},
  645. {46,37, -1},
  646. {47,40, -1},
  647. {48,0, -1},
  648. {49,1, -1},
  649. {50,2, -1},
  650. {51,3, -1},
  651. {52,4, -1},
  652. {53,5, -1},
  653. {54,6, -1},
  654. {55,7, -1},
  655. {56,8, -1},
  656. {57,9, -1},
  657. {58,45, 35},
  658. {59,44, 15},
  659. {60,44, 16},
  660. {61,44, 17},
  661. {62,44, 18},
  662. {63,44, 19},
  663. {64,44, 31},
  664. {65,10, -1},
  665. {66,11, -1},
  666. {67,12, -1},
  667. {68,13, -1},
  668. {69,14, -1},
  669. {70,15, -1},
  670. {71,16, -1},
  671. {72,17, -1},
  672. {73,18, -1},
  673. {74,19, -1},
  674. {75,20, -1},
  675. {76,21, -1},
  676. {77,22, -1},
  677. {78,23, -1},
  678. {79,24, -1},
  679. {80,25, -1},
  680. {81,26, -1},
  681. {82,27, -1},
  682. {83,28, -1},
  683. {84,29, -1},
  684. {85,30, -1},
  685. {86,31, -1},
  686. {87,32, -1},
  687. {88,33, -1},
  688. {89,34, -1},
  689. {90,35, -1},
  690. {91,44, 20},
  691. {92,44, 21},
  692. {93,44, 22},
  693. {94,44, 23},
  694. {95,44, 24},
  695. {96,44, 32},
  696. {97,46, 10},
  697. {98,46, 11},
  698. {99,46, 12},
  699. {100,46,13},
  700. {101,46,14},
  701. {102,46,15},
  702. {103,46,16},
  703. {104,46,17},
  704. {105,46,18},
  705. {106,46,19},
  706. {107,46,20},
  707. {108,46,21},
  708. {109,46,22},
  709. {110,46,23},
  710. {111,46,24},
  711. {112,46,25},
  712. {113,46,26},
  713. {114,46,27},
  714. {115,46,28},
  715. {116,46,29},
  716. {117,46,30},
  717. {118,46,31},
  718. {119,46,32},
  719. {120,46,33},
  720. {121,46,34},
  721. {122,46,35},
  722. {123,44,25},
  723. {124,44,26},
  724. {125,44,27},
  725. {126,44,28},
  726. {127,44,29},
  727. };
  728. I3&i3=i3s[iValue];
  729. iFirst =i3.iFirst;
  730. iSecond =i3.iSecond;
  731. return 1;
  732. }
  733. };
  734. class Barcode128:public BarcodeBase
  735. {
  736. public:
  737. Barcode128()
  738. {
  739. }
  740. ~Barcode128()
  741. {
  742. }
  743. BOOL Encode128A(const char* pszCode) {return P_Encode128((char*)pszCode,SUB::SETA);}
  744. BOOL Encode128B(const char* pszCode) {return P_Encode128((char*)pszCode,SUB::SETB);}
  745. BOOL Encode128C(const char* pszCode) {return P_Encode128((char*)pszCode,SUB::SETC);}
  746. void Draw128(HDC hDC,int iX,int iY0,int iY1,const COLORREF clrBar,const COLORREF clrSpace,const int iPenW)
  747. {
  748. DrawBarcode(hDC,iX,iY0,iY1,iY1,clrBar,clrSpace,iPenW);
  749. }
  750. private:
  751. struct SUB
  752. {
  753. enum
  754. {
  755. SETA=0,
  756. SETB=1,
  757. SETC=2,
  758. };
  759. };
  760. BOOL P_Encode128(char*pszCode,const int iSetIn)
  761. {
  762. Clear();
  763. BYTE*pFst=ia_Buf;
  764. BYTE*pb=pFst;
  765. if(iSetIn==SUB::SETA) pb=P_GetBarSpace128(pb,103);
  766. else
  767. if(iSetIn==SUB::SETB) pb=P_GetBarSpace128(pb,104);
  768. else pb=P_GetBarSpace128(pb,105);
  769. if(pb==0) return 0;
  770. const int iCheckDigit=GetCheckDigit(iSetIn,pszCode);
  771. const int iNum=strlen(pszCode);
  772. int iChar,iCharNext;
  773. int iPosition=0;
  774. int iSet=iSetIn;
  775. while(iPosition<iNum)
  776. {
  777. if(iSet==SUB::SETC)
  778. {
  779. if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==101)
  780. {
  781. pb=P_GetBarSpace128(pb,101);
  782. iPosition++;
  783. iSet=SUB::SETA;
  784. }
  785. else
  786. if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==100)
  787. {
  788. pb=P_GetBarSpace128(pb,100);
  789. iPosition++;
  790. iSet=SUB::SETB;
  791. }
  792. else if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==102)
  793. {
  794. pb=P_GetBarSpace128(pb,100);
  795. iPosition++;
  796. }
  797. else
  798. {
  799. char chT=pszCode[iPosition+2];
  800. pszCode[iPosition+2]=0;
  801. iChar=atoi(&pszCode[iPosition]);
  802. pszCode[iPosition+2]=chT;
  803. pb=P_GetBarSpace128(pb,iChar);
  804. if(pb==0) return 0;
  805. iPosition +=2;
  806. }
  807. }
  808. else
  809. {
  810. int iTemp2=pszCode[iPosition];
  811. if(iTemp2<-1) iTemp2=iTemp2&255;
  812. iChar=ga2_Code128[iSet][iTemp2];
  813. pb=P_GetBarSpace128(pb,iChar);
  814. if(pb==0) return 0;
  815. iPosition++;
  816. if(iSet==SUB::SETA)
  817. {
  818. if(iChar==100) iSet=SUB::SETB;
  819. else
  820. if(iChar==99) iSet=SUB::SETC;
  821. }
  822. else if(iSet==SUB::SETB)
  823. {
  824. if(iChar==101) iSet=SUB::SETA;
  825. else
  826. if(iChar==99) iSet=SUB::SETC;
  827. }
  828. else
  829. if(iChar==98)
  830. {
  831. if(iSet==SUB::SETA)
  832. iCharNext=ga2_Code128[SUB::SETB][pszCode[iPosition]];
  833. else
  834. iCharNext=ga2_Code128[SUB::SETA][pszCode[iPosition]];
  835. pb=P_GetBarSpace128(pb,iChar);
  836. if(pb==0) return 0;
  837. iPosition++;
  838. }
  839. }
  840. }
  841. pb=P_GetBarSpace128(pb,iCheckDigit);
  842. if(pb==0) return 0;
  843. pb=P_GetBarSpace128(pb,106);
  844. i_LenBuf=pb-pFst;
  845. return 1;
  846. }
  847. BYTE*P_GetBarSpace128(BYTE*pb,int iV)
  848. {
  849. if(iV<0) return 0;
  850. if(iV>106) return 0;
  851. IntString infs[]=
  852. {
  853. {0, "bbsbbssbbss"},
  854. {1, "bbssbbsbbss"},
  855. {2, "bbssbbssbbs"},
  856. {3, "bssbssbbsss"},
  857. {4, "bssbsssbbss"},
  858. {5, "bsssbssbbss"},
  859. {6, "bssbbssbsss"},
  860. {7, "bssbbsssbss"},
  861. {8, "bsssbbssbss"},
  862. {9, "bbssbssbsss"},
  863. {10, "bbssbsssbss"},
  864. {11, "bbsssbssbss"},
  865. {12, "bsbbssbbbss"},
  866. {13, "bssbbsbbbss"},
  867. {14, "bssbbssbbbs"},
  868. {15, "bsbbbssbbss"},
  869. {16, "bssbbbsbbss"},
  870. {17, "bssbbbssbbs"},
  871. {18, "bbssbbbssbs"},
  872. {19, "bbssbsbbbss"},
  873. {20, "bbssbssbbbs"},
  874. {21, "bbsbbbssbss"},
  875. {22, "bbssbbbsbss"},
  876. {23, "bbbsbbsbbbs"},
  877. {24, "bbbsbssbbss"},
  878. {25, "bbbssbsbbss"},
  879. {26, "bbbssbssbbs"},
  880. {27, "bbbsbbssbss"},
  881. {28, "bbbssbbsbss"},
  882. {29, "bbbssbbssbs"},
  883. {30, "bbsbbsbbsss"},
  884. {31, "bbsbbsssbbs"},
  885. {32, "bbsssbbsbbs"},
  886. {33, "bsbsssbbsss"},
  887. {34, "bsssbsbbsss"},
  888. {35, "bsssbsssbbs"},
  889. {36, "bsbbsssbsss"},
  890. {37, "bsssbbsbsss"},
  891. {38, "bsssbbsssbs"},
  892. {39, "bbsbsssbsss"},
  893. {40, "bbsssbsbsss"},
  894. {41, "bbsssbsssbs"},
  895. {42, "bsbbsbbbsss"},
  896. {43, "bsbbsssbbbs"},
  897. {44, "bsssbbsbbbs"},
  898. {45, "bsbbbsbbsss"},
  899. {46, "bsbbbsssbbs"},
  900. {47, "bsssbbbsbbs"},
  901. {48, "bbbsbbbsbbs"},
  902. {49, "bbsbsssbbbs"},
  903. {50, "bbsssbsbbbs"},
  904. {51, "bbsbbbsbsss"},
  905. {52, "bbsbbbsssbs"},
  906. {53, "bbsbbbsbbbs"},
  907. {54, "bbbsbsbbsss"},
  908. {55, "bbbsbsssbbs"},
  909. {56, "bbbsssbsbbs"},
  910. {57, "bbbsbbsbsss"},
  911. {58, "bbbsbbsssbs"},
  912. {59, "bbbsssbbsbs"},
  913. {60, "bbbsbbbbsbs"},
  914. {61, "bbssbssssbs"},
  915. {62, "bbbbsssbsbs"},
  916. {63, "bsbssbbssss"},
  917. {64, "bsbssssbbss"},
  918. {65, "bssbsbbssss"},
  919. {66, "bssbssssbbs"},
  920. {67, "bssssbsbbss"},
  921. {68, "bssssbssbbs"},
  922. {69, "bsbbssbssss"},
  923. {70, "bsbbssssbss"},
  924. {71, "bssbbsbssss"},
  925. {72, "bssbbssssbs"},
  926. {73, "bssssbbsbss"},
  927. {74, "bssssbbssbs"},
  928. {75, "bbssssbssbs"},
  929. {76, "bbssbsbssss"},
  930. {77, "bbbbsbbbsbs"},
  931. {78, "bbssssbsbss"},
  932. {79, "bsssbbbbsbs"},
  933. {80, "bsbssbbbbss"},
  934. {81, "bssbsbbbbss"},
  935. {82, "bssbssbbbbs"},
  936. {83, "bsbbbbssbss"},
  937. {84, "bssbbbbsbss"},
  938. {85, "bssbbbbssbs"},
  939. {86, "bbbbsbssbss"},
  940. {87, "bbbbssbsbss"},
  941. {88, "bbbbssbssbs"},
  942. {89, "bbsbbsbbbbs"},
  943. {90, "bbsbbbbsbbs"},
  944. {91, "bbbbsbbsbbs"},
  945. {92, "bsbsbbbbsss"},
  946. {93, "bsbsssbbbbs"},
  947. {94, "bsssbsbbbbs"},
  948. {95, "bsbbbbsbsss"},
  949. {96, "bsbbbbsssbs"},
  950. {97, "bbbbsbsbsss"},
  951. {98, "bbbbsbsssbs"},
  952. {99, "bsbbbsbbbbs"},
  953. {100, "bsbbbbsbbbs"},
  954. {101, "bbbsbsbbbbs"},
  955. {102, "bbbbsbsbbbs"},
  956. // {103, "bbsbsbbbbss"},
  957. {103, "bbsbssssbss"},
  958. {104, "bbsbssbssss"},
  959. {105, "bbsbssbbbss"},
  960. {106, "bbsssbbbsbsbb"},
  961. };
  962. int i;
  963. IntString&inf=infs[iV];
  964. for(i=0;i<11;i++)
  965. {
  966. if(inf.psz[i]=='b') *pb+=1;
  967. pb++;
  968. }
  969. if(iV==106)
  970. {
  971. *pb+=1; pb++;
  972. *pb+=1; pb++;
  973. }
  974. return pb;
  975. }
  976. private:
  977. int GetCheckDigit(const int iSet,char*pszCode)
  978. {
  979. int iSum=0,iCurSet=0,iChar128,iCharNext,iWeight,iPosition;
  980. iCurSet=iSet;
  981. if(iSet==SUB::SETA)
  982. {
  983. iSum=103;
  984. }
  985. else
  986. if(iSet==SUB::SETB)
  987. {
  988. iSum=104;
  989. }
  990. else
  991. if(iSet==SUB::SETC)
  992. {
  993. iSum=105;
  994. }
  995. iPosition=0;
  996. iWeight=1;
  997. const int iNum=strlen(pszCode);
  998. while(iPosition<iNum)
  999. {
  1000. if(iCurSet==SUB::SETC)
  1001. {
  1002. if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==101)
  1003. {
  1004. iChar128=101;
  1005. iSum+=(iWeight*iChar128);
  1006. iPosition++;
  1007. iWeight++;
  1008. iCurSet=SUB::SETA;
  1009. }
  1010. else if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==100)
  1011. {
  1012. iChar128=100;
  1013. iSum+=(iWeight*iChar128);
  1014. iPosition++;
  1015. iWeight++;
  1016. iCurSet=SUB::SETB;
  1017. }
  1018. else
  1019. if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==102)
  1020. {
  1021. iChar128=102;
  1022. iSum+=(iWeight*iChar128);
  1023. iPosition++;
  1024. iWeight++;
  1025. }
  1026. else
  1027. {
  1028. char chT=pszCode[iPosition+2];
  1029. pszCode[iPosition+2]=0;
  1030. iChar128=atol(&pszCode[iPosition]);
  1031. pszCode[iPosition+2]=chT;
  1032. iSum +=(iWeight*iChar128);
  1033. iPosition +=2;
  1034. iWeight++;
  1035. }
  1036. }
  1037. else
  1038. {
  1039. int iTemp2=pszCode[iPosition];
  1040. if(iTemp2<-1) iTemp2=iTemp2&255;
  1041. iChar128=ga2_Code128[iCurSet][iTemp2];
  1042. iSum+=(iWeight*iChar128);
  1043. iPosition++;
  1044. iWeight++;
  1045. if(iCurSet==SUB::SETA)
  1046. {
  1047. if(iChar128==100)
  1048. iCurSet=SUB::SETB;
  1049. else if(iChar128==99)
  1050. iCurSet=SUB::SETC;
  1051. }
  1052. else
  1053. if(iCurSet==SUB::SETB)
  1054. {
  1055. if(iChar128==101) iCurSet=SUB::SETA;
  1056. else if(iChar128==99) iCurSet=SUB::SETC;
  1057. }
  1058. else
  1059. if(iChar128==98)
  1060. {
  1061. if(iCurSet==SUB::SETA)
  1062. iCharNext=ga2_Code128[SUB::SETB][pszCode[iPosition]];
  1063. else
  1064. iCharNext=ga2_Code128[SUB::SETA][pszCode[iPosition]];
  1065. iSum+=(iWeight*iCharNext);
  1066. iPosition++;
  1067. iWeight++;
  1068. }
  1069. }
  1070. }
  1071. return iSum%103;
  1072. }
  1073. };
  1074. //=============================================
  1075. class BarcodeEan13:public BarcodeBase
  1076. {
  1077. public:
  1078. BarcodeEan13()
  1079. {
  1080. }
  1081. ~BarcodeEan13()
  1082. {
  1083. }
  1084. BOOL EncodeEan13(const char*pszCodeIn)
  1085. {
  1086. Clear();
  1087. //only allow 12 characters as input
  1088. char szCode[14];
  1089. const int iLen=strlen(pszCodeIn);
  1090. if(iLen>12)
  1091. {
  1092. strncpy(szCode,pszCodeIn,12);
  1093. }
  1094. else
  1095. {
  1096. strcpy(szCode,pszCodeIn);
  1097. while(strlen(szCode)<12) strcat(szCode,"0");
  1098. }
  1099. BYTE*pFst=ia_Buf;
  1100. BYTE*pb=pFst;
  1101. //"bsb"-long
  1102. *pb+=5; pb++;
  1103. *pb+=4; pb++;
  1104. *pb+=5; pb++;
  1105. BYTE iaCountryCode[6];
  1106. BOOL b=P_GetCountryCode(szCode[0],iaCountryCode);
  1107. if(b==0) return 0;
  1108. pb=P_GetLeftOddParity(pb,szCode[1]);
  1109. int i;
  1110. for(i=2;i<7;i++)
  1111. {
  1112. if(iaCountryCode[i-2]=='O')
  1113. {
  1114. pb=P_GetLeftOddParity(pb,szCode[i]);
  1115. }
  1116. else
  1117. if(iaCountryCode[i-2]=='E')
  1118. {
  1119. pb=P_GetLeftEvenParity(pb,szCode[i]);
  1120. }
  1121. }
  1122. //"sbsbs"-long
  1123. *pb+=4; pb++;
  1124. *pb+=5; pb++;
  1125. *pb+=4; pb++;
  1126. *pb+=5; pb++;
  1127. *pb+=4; pb++;
  1128. for(i=7;i<12;i++)
  1129. {
  1130. pb=P_GetRightPattern(pb,szCode[i]);
  1131. }
  1132. i=P_GetCheckSumDigit(szCode);
  1133. pb=P_GetRightPattern(pb,(char)i);
  1134. //"bsb"-long
  1135. *pb+=5; pb++;
  1136. *pb+=4; pb++;
  1137. *pb+=5; pb++;
  1138. i_LenBuf=pb-pFst;
  1139. return 1;
  1140. }
  1141. void DrawEan13(HDC hDC,int iX,int iY0,int iY10,int iY11,const COLORREF clrBar,const COLORREF clrSpace,const int iPenW)
  1142. {
  1143. DrawBarcode(hDC,iX,iY0,iY10,iY11,clrBar,clrSpace,iPenW);
  1144. }
  1145. private:
  1146. BOOL P_GetCountryCode(char ch,BYTE*pbCountryCode)
  1147. {
  1148. const int iV=ch-'0';
  1149. if(iV<0) return 0;
  1150. if(iV>9) return 0;
  1151. IntString infs[]=
  1152. {
  1153. {0, "OOOOO"},
  1154. {1, "OEOEE"},
  1155. {2, "OEEOE"},
  1156. {3, "OEEEO"},
  1157. {4, "EOOEE"},
  1158. {5, "EEOOE"},
  1159. {6, "EEEOO"},
  1160. {7, "EOEOE"},
  1161. {8, "EOEEO"},
  1162. {9, "EEOEO"},
  1163. };
  1164. memcpy(pbCountryCode,infs[iV].psz,5);
  1165. return 1;
  1166. }
  1167. BYTE*P_GetLeftOddParity(BYTE*pb,char ch)
  1168. {
  1169. const int iV=ch-'0';
  1170. if(iV<0) return 0;
  1171. if(iV>9) return 0;
  1172. IntString infs[]=
  1173. {
  1174. {0, "sssbbsb"},
  1175. {1, "ssbbssb"},
  1176. {2, "ssbssbb"},
  1177. {3, "sbbbbsb"},
  1178. {4, "sbsssbb"},
  1179. {5, "sbbsssb"},
  1180. {6, "sbsbbbb"},
  1181. {7, "sbbbsbb"},
  1182. {8, "sbbsbbb"},
  1183. {9, "sssbsbb"},
  1184. };
  1185. IntString&inf=infs[iV];
  1186. int i;
  1187. for(i=0;i<7;i++)
  1188. {
  1189. if(inf.psz[i]=='b') *pb+=1;
  1190. pb++;
  1191. }
  1192. return pb;
  1193. }
  1194. BYTE*P_GetLeftEvenParity(BYTE*pb,char ch)
  1195. {
  1196. const int iV=ch-'0';
  1197. if(iV<0) return 0;
  1198. if(iV>9) return 0;
  1199. IntString infs[]=
  1200. {
  1201. {0, "sbssbbb"},
  1202. {1, "sbbssbb"},
  1203. {2, "ssbbsbb"},
  1204. {3, "sbssssb"},
  1205. {4, "ssbbbsb"},
  1206. {5, "sbbbssb"},
  1207. {6, "ssssbsb"},
  1208. {7, "ssbsssb"},
  1209. {8, "sssbssb"},
  1210. {9, "ssbsbbb"},
  1211. };
  1212. char*psz=infs[iV].psz;
  1213. int i;
  1214. for(i=0;i<7;i++)
  1215. {
  1216. if(psz[i]=='b') *pb+=1;
  1217. pb++;
  1218. }
  1219. return pb;
  1220. }
  1221. BYTE*P_GetRightPattern(BYTE*pb,char ch)
  1222. {
  1223. const int iV=ch-'0';
  1224. if(iV<0) return 0;
  1225. if(iV>9) return 0;
  1226. IntString infs[]=
  1227. {
  1228. {0, "bbbssbs"},
  1229. {1, "bbssbbs"},
  1230. {2, "bbsbbss"},
  1231. {3, "bssssbs"},
  1232. {4, "bsbbbss"},
  1233. {5, "bssbbbs"},
  1234. {6, "bsbssss"},
  1235. {7, "bsssbss"},
  1236. {8, "bssbsss"},
  1237. {9, "bbbsbss"},
  1238. };
  1239. char*psz=infs[iV].psz;
  1240. int i;
  1241. for(i=0;i<7;i++)
  1242. {
  1243. if(psz[i]=='b') *pb+=1;
  1244. pb++;
  1245. }
  1246. return pb;
  1247. }
  1248. char P_GetCheckSumDigit(const char*pszCode)
  1249. {
  1250. const int iLen=strlen(pszCode);
  1251. int i,iSum=0,iItem;
  1252. for(i=iLen;i >=1;i--)
  1253. {
  1254. iItem=i%2?(pszCode[i-1]-'0')*1:(pszCode[i-1]-'0')*3;
  1255. iSum+=iItem;
  1256. }
  1257. iSum%=10;
  1258. return '0'+(10-iSum)%10;
  1259. }
  1260. };
  1261. #endif