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