Barcode.h 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374
  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. void Draw128(HDC hDC,int iX,int iY0,int iY1,const COLORREF clrBar,const COLORREF clrSpace,const int iPenW)
  727. {
  728. DrawBarcode(hDC,iX,iY0,iY1,iY1,clrBar,clrSpace,iPenW);
  729. }
  730. private:
  731. struct SUB
  732. {
  733. enum
  734. {
  735. SETA=0,
  736. SETB=1,
  737. SETC=2,
  738. };
  739. };
  740. BOOL P_Encode128(char*pszCode,const int iSetIn)
  741. {
  742. Clear();
  743. BYTE*pFst=ia_Buf;
  744. BYTE*pb=pFst;
  745. if(iSetIn==SUB::SETA) pb=P_GetBarSpace128(pb,103);
  746. else
  747. if(iSetIn==SUB::SETB) pb=P_GetBarSpace128(pb,104);
  748. else pb=P_GetBarSpace128(pb,105);
  749. if(pb==0) return 0;
  750. const int iCheckDigit=GetCheckDigit(iSetIn,pszCode);
  751. const int iNum=strlen(pszCode);
  752. int iChar,iCharNext;
  753. int iPosition=0;
  754. int iSet=iSetIn;
  755. while(iPosition<iNum)
  756. {
  757. if(iSet==SUB::SETC)
  758. {
  759. if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==101)
  760. {
  761. pb=P_GetBarSpace128(pb,101);
  762. iPosition++;
  763. iSet=SUB::SETA;
  764. }
  765. else
  766. if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==100)
  767. {
  768. pb=P_GetBarSpace128(pb,100);
  769. iPosition++;
  770. iSet=SUB::SETB;
  771. }
  772. else if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==102)
  773. {
  774. pb=P_GetBarSpace128(pb,100);
  775. iPosition++;
  776. }
  777. else
  778. {
  779. char chT=pszCode[iPosition+2];
  780. pszCode[iPosition+2]=0;
  781. iChar=atoi(&pszCode[iPosition]);
  782. pszCode[iPosition+2]=chT;
  783. pb=P_GetBarSpace128(pb,iChar);
  784. if(pb==0) return 0;
  785. iPosition +=2;
  786. }
  787. }
  788. else
  789. {
  790. int iTemp2=pszCode[iPosition];
  791. if(iTemp2<-1) iTemp2=iTemp2&255;
  792. iChar=ga2_Code128[iSet][iTemp2];
  793. pb=P_GetBarSpace128(pb,iChar);
  794. if(pb==0) return 0;
  795. iPosition++;
  796. if(iSet==SUB::SETA)
  797. {
  798. if(iChar==100) iSet=SUB::SETB;
  799. else
  800. if(iChar==99) iSet=SUB::SETC;
  801. }
  802. else if(iSet==SUB::SETB)
  803. {
  804. if(iChar==101) iSet=SUB::SETA;
  805. else
  806. if(iChar==99) iSet=SUB::SETC;
  807. }
  808. else
  809. if(iChar==98)
  810. {
  811. if(iSet==SUB::SETA)
  812. iCharNext=ga2_Code128[SUB::SETB][pszCode[iPosition]];
  813. else
  814. iCharNext=ga2_Code128[SUB::SETA][pszCode[iPosition]];
  815. pb=P_GetBarSpace128(pb,iChar);
  816. if(pb==0) return 0;
  817. iPosition++;
  818. }
  819. }
  820. }
  821. pb=P_GetBarSpace128(pb,iCheckDigit);
  822. if(pb==0) return 0;
  823. pb=P_GetBarSpace128(pb,106);
  824. i_LenBuf=pb-pFst;
  825. return 1;
  826. }
  827. BYTE*P_GetBarSpace128(BYTE*pb,int iV)
  828. {
  829. if(iV<0) return 0;
  830. if(iV>106) return 0;
  831. IntString infs[]=
  832. {
  833. {0, "bbsbbssbbss"},
  834. {1, "bbssbbsbbss"},
  835. {2, "bbssbbssbbs"},
  836. {3, "bssbssbbsss"},
  837. {4, "bssbsssbbss"},
  838. {5, "bsssbssbbss"},
  839. {6, "bssbbssbsss"},
  840. {7, "bssbbsssbss"},
  841. {8, "bsssbbssbss"},
  842. {9, "bbssbssbsss"},
  843. {10, "bbssbsssbss"},
  844. {11, "bbsssbssbss"},
  845. {12, "bsbbssbbbss"},
  846. {13, "bssbbsbbbss"},
  847. {14, "bssbbssbbbs"},
  848. {15, "bsbbbssbbss"},
  849. {16, "bssbbbsbbss"},
  850. {17, "bssbbbssbbs"},
  851. {18, "bbssbbbssbs"},
  852. {19, "bbssbsbbbss"},
  853. {20, "bbssbssbbbs"},
  854. {21, "bbsbbbssbss"},
  855. {22, "bbssbbbsbss"},
  856. {23, "bbbsbbsbbbs"},
  857. {24, "bbbsbssbbss"},
  858. {25, "bbbssbsbbss"},
  859. {26, "bbbssbssbbs"},
  860. {27, "bbbsbbssbss"},
  861. {28, "bbbssbbsbss"},
  862. {29, "bbbssbbssbs"},
  863. {30, "bbsbbsbbsss"},
  864. {31, "bbsbbsssbbs"},
  865. {32, "bbsssbbsbbs"},
  866. {33, "bsbsssbbsss"},
  867. {34, "bsssbsbbsss"},
  868. {35, "bsssbsssbbs"},
  869. {36, "bsbbsssbsss"},
  870. {37, "bsssbbsbsss"},
  871. {38, "bsssbbsssbs"},
  872. {39, "bbsbsssbsss"},
  873. {40, "bbsssbsbsss"},
  874. {41, "bbsssbsssbs"},
  875. {42, "bsbbsbbbsss"},
  876. {43, "bsbbsssbbbs"},
  877. {44, "bsssbbsbbbs"},
  878. {45, "bsbbbsbbsss"},
  879. {46, "bsbbbsssbbs"},
  880. {47, "bsssbbbsbbs"},
  881. {48, "bbbsbbbsbbs"},
  882. {49, "bbsbsssbbbs"},
  883. {50, "bbsssbsbbbs"},
  884. {51, "bbsbbbsbsss"},
  885. {52, "bbsbbbsssbs"},
  886. {53, "bbsbbbsbbbs"},
  887. {54, "bbbsbsbbsss"},
  888. {55, "bbbsbsssbbs"},
  889. {56, "bbbsssbsbbs"},
  890. {57, "bbbsbbsbsss"},
  891. {58, "bbbsbbsssbs"},
  892. {59, "bbbsssbbsbs"},
  893. {60, "bbbsbbbbsbs"},
  894. {61, "bbssbssssbs"},
  895. {62, "bbbbsssbsbs"},
  896. {63, "bsbssbbssss"},
  897. {64, "bsbssssbbss"},
  898. {65, "bssbsbbssss"},
  899. {66, "bssbssssbbs"},
  900. {67, "bssssbsbbss"},
  901. {68, "bssssbssbbs"},
  902. {69, "bsbbssbssss"},
  903. {70, "bsbbssssbss"},
  904. {71, "bssbbsbssss"},
  905. {72, "bssbbssssbs"},
  906. {73, "bssssbbsbss"},
  907. {74, "bssssbbssbs"},
  908. {75, "bbssssbssbs"},
  909. {76, "bbssbsbssss"},
  910. {77, "bbbbsbbbsbs"},
  911. {78, "bbssssbsbss"},
  912. {79, "bsssbbbbsbs"},
  913. {80, "bsbssbbbbss"},
  914. {81, "bssbsbbbbss"},
  915. {82, "bssbssbbbbs"},
  916. {83, "bsbbbbssbss"},
  917. {84, "bssbbbbsbss"},
  918. {85, "bssbbbbssbs"},
  919. {86, "bbbbsbssbss"},
  920. {87, "bbbbssbsbss"},
  921. {88, "bbbbssbssbs"},
  922. {89, "bbsbbsbbbbs"},
  923. {90, "bbsbbbbsbbs"},
  924. {91, "bbbbsbbsbbs"},
  925. {92, "bsbsbbbbsss"},
  926. {93, "bsbsssbbbbs"},
  927. {94, "bsssbsbbbbs"},
  928. {95, "bsbbbbsbsss"},
  929. {96, "bsbbbbsssbs"},
  930. {97, "bbbbsbsbsss"},
  931. {98, "bbbbsbsssbs"},
  932. {99, "bsbbbsbbbbs"},
  933. {100, "bsbbbbsbbbs"},
  934. {101, "bbbsbsbbbbs"},
  935. {102, "bbbbsbsbbbs"},
  936. // {103, "bbsbsbbbbss"},
  937. {103, "bbsbssssbss"},
  938. {104, "bbsbssbssss"},
  939. {105, "bbsbssbbbss"},
  940. {106, "bbsssbbbsbsbb"},
  941. };
  942. int i;
  943. IntString&inf=infs[iV];
  944. for(i=0;i<11;i++)
  945. {
  946. if(inf.psz[i]=='b') *pb+=1;
  947. pb++;
  948. }
  949. if(iV==106)
  950. {
  951. *pb+=1; pb++;
  952. *pb+=1; pb++;
  953. }
  954. return pb;
  955. }
  956. private:
  957. int GetCheckDigit(const int iSet,char*pszCode)
  958. {
  959. int iSum=0,iCurSet=0,iChar128,iCharNext,iWeight,iPosition;
  960. iCurSet=iSet;
  961. if(iSet==SUB::SETA)
  962. {
  963. iSum=103;
  964. }
  965. else
  966. if(iSet==SUB::SETB)
  967. {
  968. iSum=104;
  969. }
  970. else
  971. if(iSet==SUB::SETC)
  972. {
  973. iSum=105;
  974. }
  975. iPosition=0;
  976. iWeight=1;
  977. const int iNum=strlen(pszCode);
  978. while(iPosition<iNum)
  979. {
  980. if(iCurSet==SUB::SETC)
  981. {
  982. if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==101)
  983. {
  984. iChar128=101;
  985. iSum+=(iWeight*iChar128);
  986. iPosition++;
  987. iWeight++;
  988. iCurSet=SUB::SETA;
  989. }
  990. else if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==100)
  991. {
  992. iChar128=100;
  993. iSum+=(iWeight*iChar128);
  994. iPosition++;
  995. iWeight++;
  996. iCurSet=SUB::SETB;
  997. }
  998. else
  999. if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==102)
  1000. {
  1001. iChar128=102;
  1002. iSum+=(iWeight*iChar128);
  1003. iPosition++;
  1004. iWeight++;
  1005. }
  1006. else
  1007. {
  1008. char chT=pszCode[iPosition+2];
  1009. pszCode[iPosition+2]=0;
  1010. iChar128=atol(&pszCode[iPosition]);
  1011. pszCode[iPosition+2]=chT;
  1012. iSum +=(iWeight*iChar128);
  1013. iPosition +=2;
  1014. iWeight++;
  1015. }
  1016. }
  1017. else
  1018. {
  1019. int iTemp2=pszCode[iPosition];
  1020. if(iTemp2<-1) iTemp2=iTemp2&255;
  1021. iChar128=ga2_Code128[iCurSet][iTemp2];
  1022. iSum+=(iWeight*iChar128);
  1023. iPosition++;
  1024. iWeight++;
  1025. if(iCurSet==SUB::SETA)
  1026. {
  1027. if(iChar128==100)
  1028. iCurSet=SUB::SETB;
  1029. else if(iChar128==99)
  1030. iCurSet=SUB::SETC;
  1031. }
  1032. else
  1033. if(iCurSet==SUB::SETB)
  1034. {
  1035. if(iChar128==101) iCurSet=SUB::SETA;
  1036. else if(iChar128==99) iCurSet=SUB::SETC;
  1037. }
  1038. else
  1039. if(iChar128==98)
  1040. {
  1041. if(iCurSet==SUB::SETA)
  1042. iCharNext=ga2_Code128[SUB::SETB][pszCode[iPosition]];
  1043. else
  1044. iCharNext=ga2_Code128[SUB::SETA][pszCode[iPosition]];
  1045. iSum+=(iWeight*iCharNext);
  1046. iPosition++;
  1047. iWeight++;
  1048. }
  1049. }
  1050. }
  1051. return iSum%103;
  1052. }
  1053. };
  1054. //=============================================
  1055. class BarcodeEan13:public BarcodeBase
  1056. {
  1057. public:
  1058. BarcodeEan13()
  1059. {
  1060. }
  1061. ~BarcodeEan13()
  1062. {
  1063. }
  1064. BOOL EncodeEan13(const char*pszCodeIn)
  1065. {
  1066. Clear();
  1067. //only allow 12 characters as input
  1068. char szCode[14];
  1069. const int iLen=strlen(pszCodeIn);
  1070. if(iLen>12)
  1071. {
  1072. strncpy(szCode,pszCodeIn,12);
  1073. }
  1074. else
  1075. {
  1076. strcpy(szCode,pszCodeIn);
  1077. while(strlen(szCode)<12) strcat(szCode,"0");
  1078. }
  1079. BYTE*pFst=ia_Buf;
  1080. BYTE*pb=pFst;
  1081. //"bsb"-long
  1082. *pb+=5; pb++;
  1083. *pb+=4; pb++;
  1084. *pb+=5; pb++;
  1085. BYTE iaCountryCode[6];
  1086. BOOL b=P_GetCountryCode(szCode[0],iaCountryCode);
  1087. if(b==0) return 0;
  1088. pb=P_GetLeftOddParity(pb,szCode[1]);
  1089. int i;
  1090. for(i=2;i<7;i++)
  1091. {
  1092. if(iaCountryCode[i-2]=='O')
  1093. {
  1094. pb=P_GetLeftOddParity(pb,szCode[i]);
  1095. }
  1096. else
  1097. if(iaCountryCode[i-2]=='E')
  1098. {
  1099. pb=P_GetLeftEvenParity(pb,szCode[i]);
  1100. }
  1101. }
  1102. //"sbsbs"-long
  1103. *pb+=4; pb++;
  1104. *pb+=5; pb++;
  1105. *pb+=4; pb++;
  1106. *pb+=5; pb++;
  1107. *pb+=4; pb++;
  1108. for(i=7;i<12;i++)
  1109. {
  1110. pb=P_GetRightPattern(pb,szCode[i]);
  1111. }
  1112. i=P_GetCheckSumDigit(szCode);
  1113. pb=P_GetRightPattern(pb,(char)i);
  1114. //"bsb"-long
  1115. *pb+=5; pb++;
  1116. *pb+=4; pb++;
  1117. *pb+=5; pb++;
  1118. i_LenBuf=pb-pFst;
  1119. return 1;
  1120. }
  1121. void DrawEan13(HDC hDC,int iX,int iY0,int iY10,int iY11,const COLORREF clrBar,const COLORREF clrSpace,const int iPenW)
  1122. {
  1123. DrawBarcode(hDC,iX,iY0,iY10,iY11,clrBar,clrSpace,iPenW);
  1124. }
  1125. private:
  1126. BOOL P_GetCountryCode(char ch,BYTE*pbCountryCode)
  1127. {
  1128. const int iV=ch-'0';
  1129. if(iV<0) return 0;
  1130. if(iV>9) return 0;
  1131. IntString infs[]=
  1132. {
  1133. {0, "OOOOO"},
  1134. {1, "OEOEE"},
  1135. {2, "OEEOE"},
  1136. {3, "OEEEO"},
  1137. {4, "EOOEE"},
  1138. {5, "EEOOE"},
  1139. {6, "EEEOO"},
  1140. {7, "EOEOE"},
  1141. {8, "EOEEO"},
  1142. {9, "EEOEO"},
  1143. };
  1144. memcpy(pbCountryCode,infs[iV].psz,5);
  1145. return 1;
  1146. }
  1147. BYTE*P_GetLeftOddParity(BYTE*pb,char ch)
  1148. {
  1149. const int iV=ch-'0';
  1150. if(iV<0) return 0;
  1151. if(iV>9) return 0;
  1152. IntString infs[]=
  1153. {
  1154. {0, "sssbbsb"},
  1155. {1, "ssbbssb"},
  1156. {2, "ssbssbb"},
  1157. {3, "sbbbbsb"},
  1158. {4, "sbsssbb"},
  1159. {5, "sbbsssb"},
  1160. {6, "sbsbbbb"},
  1161. {7, "sbbbsbb"},
  1162. {8, "sbbsbbb"},
  1163. {9, "sssbsbb"},
  1164. };
  1165. IntString&inf=infs[iV];
  1166. int i;
  1167. for(i=0;i<7;i++)
  1168. {
  1169. if(inf.psz[i]=='b') *pb+=1;
  1170. pb++;
  1171. }
  1172. return pb;
  1173. }
  1174. BYTE*P_GetLeftEvenParity(BYTE*pb,char ch)
  1175. {
  1176. const int iV=ch-'0';
  1177. if(iV<0) return 0;
  1178. if(iV>9) return 0;
  1179. IntString infs[]=
  1180. {
  1181. {0, "sbssbbb"},
  1182. {1, "sbbssbb"},
  1183. {2, "ssbbsbb"},
  1184. {3, "sbssssb"},
  1185. {4, "ssbbbsb"},
  1186. {5, "sbbbssb"},
  1187. {6, "ssssbsb"},
  1188. {7, "ssbsssb"},
  1189. {8, "sssbssb"},
  1190. {9, "ssbsbbb"},
  1191. };
  1192. char*psz=infs[iV].psz;
  1193. int i;
  1194. for(i=0;i<7;i++)
  1195. {
  1196. if(psz[i]=='b') *pb+=1;
  1197. pb++;
  1198. }
  1199. return pb;
  1200. }
  1201. BYTE*P_GetRightPattern(BYTE*pb,char ch)
  1202. {
  1203. const int iV=ch-'0';
  1204. if(iV<0) return 0;
  1205. if(iV>9) return 0;
  1206. IntString infs[]=
  1207. {
  1208. {0, "bbbssbs"},
  1209. {1, "bbssbbs"},
  1210. {2, "bbsbbss"},
  1211. {3, "bssssbs"},
  1212. {4, "bsbbbss"},
  1213. {5, "bssbbbs"},
  1214. {6, "bsbssss"},
  1215. {7, "bsssbss"},
  1216. {8, "bssbsss"},
  1217. {9, "bbbsbss"},
  1218. };
  1219. char*psz=infs[iV].psz;
  1220. int i;
  1221. for(i=0;i<7;i++)
  1222. {
  1223. if(psz[i]=='b') *pb+=1;
  1224. pb++;
  1225. }
  1226. return pb;
  1227. }
  1228. char P_GetCheckSumDigit(const char*pszCode)
  1229. {
  1230. const int iLen=strlen(pszCode);
  1231. int i,iSum=0,iItem;
  1232. for(i=iLen;i >=1;i--)
  1233. {
  1234. iItem=i%2?(pszCode[i-1]-'0')*1:(pszCode[i-1]-'0')*3;
  1235. iSum+=iItem;
  1236. }
  1237. iSum%=10;
  1238. return '0'+(10-iSum)%10;
  1239. }
  1240. };
  1241. #endif