Barcode.h 26 KB

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