1 /**
2 * libdmtx - Data Matrix Encoding/Decoding Library
3 * Copyright 2010 Mike Laughton. All rights reserved.
4 * Copyright 2012-2016 Vadim A. Misbakh-Soloviov. All rights reserved.
5 *
6 * See LICENSE file in the main project directory for full
7 * terms of use and distribution.
8 *
9 * Contact:
10 * Vadim A. Misbakh-Soloviov <dmtx@mva.name>
11 * Mike Laughton <mike@dragonflylogic.com>
12 *
13 * \file file.c
14 */
15
16 /**
17 *
18 *
19 */
20 extern DmtxByteList
dmtxByteListBuild(DmtxByte * storage,int capacity)21 dmtxByteListBuild(DmtxByte *storage, int capacity)
22 {
23 DmtxByteList list;
24
25 list.b = storage;
26 list.capacity = capacity;
27 list.length = 0;
28
29 return list;
30 }
31
32 /**
33 *
34 *
35 */
36 extern void
dmtxByteListInit(DmtxByteList * list,int length,DmtxByte value,DmtxPassFail * passFail)37 dmtxByteListInit(DmtxByteList *list, int length, DmtxByte value, DmtxPassFail *passFail)
38 {
39 if(length > list->capacity)
40 {
41 *passFail = DmtxFail;
42 }
43 else
44 {
45 list->length = length;
46 memset(list->b, value, sizeof(DmtxByte) * list->capacity);
47 *passFail = DmtxPass;
48 }
49 }
50
51 /**
52 *
53 *
54 */
55 extern void
dmtxByteListClear(DmtxByteList * list)56 dmtxByteListClear(DmtxByteList *list)
57 {
58 memset(list->b, 0x00, sizeof(DmtxByte) * list->capacity);
59 list->length = 0;
60 }
61
62 /**
63 *
64 *
65 */
66 extern DmtxBoolean
dmtxByteListHasCapacity(DmtxByteList * list)67 dmtxByteListHasCapacity(DmtxByteList *list)
68 {
69 return (list->length < list->capacity) ? DmtxTrue : DmtxFalse;
70 }
71
72 /**
73 *
74 *
75 */
76 extern void
dmtxByteListCopy(DmtxByteList * dst,const DmtxByteList * src,DmtxPassFail * passFail)77 dmtxByteListCopy(DmtxByteList *dst, const DmtxByteList *src, DmtxPassFail *passFail)
78 {
79 int length;
80
81 if(dst->capacity < src->length)
82 {
83 *passFail = DmtxFail; /* dst must be large enough to hold src data */
84 }
85 else
86 {
87 /* Copy as many bytes as dst can hold or src can provide (smaller of two) */
88 length = (dst->capacity < src->capacity) ? dst->capacity : src->capacity;
89
90 dst->length = src->length;
91 memcpy(dst->b, src->b, sizeof(unsigned char) * length);
92 *passFail = DmtxPass;
93 }
94 }
95
96 /**
97 *
98 *
99 */
100 extern void
dmtxByteListPush(DmtxByteList * list,DmtxByte value,DmtxPassFail * passFail)101 dmtxByteListPush(DmtxByteList *list, DmtxByte value, DmtxPassFail *passFail)
102 {
103 if(list->length >= list->capacity)
104 {
105 *passFail = DmtxFail;
106 }
107 else
108 {
109 list->b[list->length++] = value;
110 *passFail = DmtxPass;
111 }
112 }
113
114 /**
115 *
116 *
117 */
118 extern DmtxByte
dmtxByteListPop(DmtxByteList * list,DmtxPassFail * passFail)119 dmtxByteListPop(DmtxByteList *list, DmtxPassFail *passFail)
120 {
121 *passFail = (list->length > 0) ? DmtxPass : DmtxFail;
122
123 return list->b[--(list->length)];
124 }
125
126 /**
127 *
128 *
129 */
130 extern void
dmtxByteListPrint(DmtxByteList * list,char * prefix)131 dmtxByteListPrint(DmtxByteList *list, char *prefix)
132 {
133 int i;
134
135 if(prefix != NULL)
136 fprintf(stdout, "%s", prefix);
137
138 for(i = 0; i < list->length; i++)
139 fprintf(stdout, " %d", list->b[i]);
140
141 fputc('\n', stdout);
142 }
143