ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
vecStr.h
Go to the documentation of this file.
1
20
21#ifndef ABC__misc__vec__vecStr_h
22#define ABC__misc__vec__vecStr_h
23
24
28
29#include <stdio.h>
30
32
33
37
41
42typedef struct Vec_Str_t_ Vec_Str_t;
43struct Vec_Str_t_
44{
45 int nCap;
46 int nSize;
47 char * pArray;
48};
49
53
54#define Vec_StrForEachEntry( vVec, Entry, i ) \
55 for ( i = 0; (i < Vec_StrSize(vVec)) && (((Entry) = Vec_StrEntry(vVec, i)), 1); i++ )
56
60
72static inline Vec_Str_t * Vec_StrAlloc( int nCap )
73{
74 Vec_Str_t * p;
75 p = ABC_ALLOC( Vec_Str_t, 1 );
76 if ( nCap > 0 && nCap < 16 )
77 nCap = 16;
78 p->nSize = 0;
79 p->nCap = nCap;
80 p->pArray = p->nCap? ABC_ALLOC( char, p->nCap ) : NULL;
81 return p;
82}
83static inline Vec_Str_t * Vec_StrAllocExact( int nCap )
84{
85 Vec_Str_t * p;
86 assert( nCap >= 0 );
87 p = ABC_ALLOC( Vec_Str_t, 1 );
88 p->nSize = 0;
89 p->nCap = nCap;
90 p->pArray = p->nCap? ABC_ALLOC( char, p->nCap ) : NULL;
91 return p;
92}
93
105static inline Vec_Str_t * Vec_StrStart( int nSize )
106{
107 Vec_Str_t * p;
108 p = Vec_StrAlloc( nSize );
109 p->nSize = nSize;
110 memset( p->pArray, 0, sizeof(char) * (size_t)nSize );
111 return p;
112}
113
125static inline Vec_Str_t * Vec_StrAllocArray( char * pArray, int nSize )
126{
127 Vec_Str_t * p;
128 p = ABC_ALLOC( Vec_Str_t, 1 );
129 p->nSize = nSize;
130 p->nCap = nSize;
131 p->pArray = pArray;
132 return p;
133}
134
146static inline Vec_Str_t * Vec_StrAllocArrayCopy( char * pArray, int nSize )
147{
148 Vec_Str_t * p;
149 p = ABC_ALLOC( Vec_Str_t, 1 );
150 p->nSize = nSize;
151 p->nCap = nSize;
152 p->pArray = ABC_ALLOC( char, nSize );
153 memcpy( p->pArray, pArray, sizeof(char) * (size_t)nSize );
154 return p;
155}
156
168static inline Vec_Str_t * Vec_StrDup( Vec_Str_t * pVec )
169{
170 Vec_Str_t * p;
171 p = ABC_ALLOC( Vec_Str_t, 1 );
172 p->nSize = pVec->nSize;
173 p->nCap = pVec->nCap;
174 p->pArray = p->nCap? ABC_ALLOC( char, p->nCap ) : NULL;
175 memcpy( p->pArray, pVec->pArray, sizeof(char) * (size_t)pVec->nSize );
176 return p;
177}
178
190static inline Vec_Str_t * Vec_StrDupArray( Vec_Str_t * pVec )
191{
192 Vec_Str_t * p;
193 p = ABC_ALLOC( Vec_Str_t, 1 );
194 p->nSize = pVec->nSize;
195 p->nCap = pVec->nCap;
196 p->pArray = pVec->pArray;
197 pVec->nSize = 0;
198 pVec->nCap = 0;
199 pVec->pArray = NULL;
200 return p;
201}
202
214static inline void Vec_StrZero( Vec_Str_t * p )
215{
216 p->pArray = NULL;
217 p->nSize = 0;
218 p->nCap = 0;
219}
220static inline void Vec_StrErase( Vec_Str_t * p )
221{
222 ABC_FREE( p->pArray );
223 p->nSize = 0;
224 p->nCap = 0;
225}
226static inline void Vec_StrFree( Vec_Str_t * p )
227{
228 ABC_FREE( p->pArray );
229 ABC_FREE( p );
230}
231
243static inline void Vec_StrFreeP( Vec_Str_t ** p )
244{
245 if ( *p == NULL )
246 return;
247 ABC_FREE( (*p)->pArray );
248 ABC_FREE( (*p) );
249}
250
262static inline char * Vec_StrReleaseArray( Vec_Str_t * p )
263{
264 char * pArray = p->pArray;
265 p->nCap = 0;
266 p->nSize = 0;
267 p->pArray = NULL;
268 return pArray;
269}
270
282static inline char * Vec_StrArray( Vec_Str_t * p )
283{
284 return p->pArray;
285}
286static inline char * Vec_StrLimit( Vec_Str_t * p )
287{
288 return p->pArray + p->nSize;
289}
290
302static inline int Vec_StrSize( Vec_Str_t * p )
303{
304 return p->nSize;
305}
306static inline void Vec_StrSetSize( Vec_Str_t * p, int nSize )
307{
308 p->nSize = nSize;
309}
310
322static inline int Vec_StrCap( Vec_Str_t * p )
323{
324 return p->nCap;
325}
326
338static inline double Vec_StrMemory( Vec_Str_t * p )
339{
340 return !p ? 0.0 : 1.0 * sizeof(char) * (size_t)p->nCap + sizeof(Vec_Str_t);
341}
342
354static inline char Vec_StrEntry( Vec_Str_t * p, int i )
355{
356 assert( i >= 0 && i < p->nSize );
357 return p->pArray[i];
358}
359
371static inline char * Vec_StrEntryP( Vec_Str_t * p, int i )
372{
373 assert( i >= 0 && i < p->nSize );
374 return p->pArray + i;
375}
376
388static inline void Vec_StrWriteEntry( Vec_Str_t * p, int i, char Entry )
389{
390 assert( i >= 0 && i < p->nSize );
391 p->pArray[i] = Entry;
392}
393
405static inline char Vec_StrEntryLast( Vec_Str_t * p )
406{
407 assert( p->nSize > 0 );
408 return p->pArray[p->nSize-1];
409}
410
422static inline void Vec_StrGrow( Vec_Str_t * p, int nCapMin )
423{
424 if ( p->nCap >= nCapMin )
425 return;
426 assert( p->nCap < ABC_INT_MAX );
427 p->pArray = ABC_REALLOC( char, p->pArray, nCapMin );
428 p->nCap = nCapMin;
429}
430
442static inline void Vec_StrFill( Vec_Str_t * p, int nSize, char Fill )
443{
444 int i;
445 Vec_StrGrow( p, nSize );
446 p->nSize = nSize;
447 for ( i = 0; i < p->nSize; i++ )
448 p->pArray[i] = Fill;
449}
450
462static inline void Vec_StrFillExtra( Vec_Str_t * p, int nSize, char Fill )
463{
464 int i;
465 if ( nSize <= p->nSize )
466 return;
467 if ( nSize > 2 * p->nCap )
468 Vec_StrGrow( p, nSize );
469 else if ( nSize > p->nCap )
470 Vec_StrGrow( p, p->nCap < ABC_INT_MAX/2 ? 2 * p->nCap : ABC_INT_MAX );
471 for ( i = p->nSize; i < nSize; i++ )
472 p->pArray[i] = Fill;
473 p->nSize = nSize;
474}
475
487static inline char Vec_StrGetEntry( Vec_Str_t * p, int i )
488{
489 Vec_StrFillExtra( p, i + 1, 0 );
490 return Vec_StrEntry( p, i );
491}
492
504static inline void Vec_StrSetEntry( Vec_Str_t * p, int i, char Entry )
505{
506 Vec_StrFillExtra( p, i + 1, 0 );
507 Vec_StrWriteEntry( p, i, Entry );
508}
509
521static inline void Vec_StrShrink( Vec_Str_t * p, int nSizeNew )
522{
523 assert( p->nSize >= nSizeNew );
524 p->nSize = nSizeNew;
525}
526
538static inline void Vec_StrClear( Vec_Str_t * p )
539{
540 p->nSize = 0;
541}
542
554static inline void Vec_StrPush( Vec_Str_t * p, char Entry )
555{
556 if ( p->nSize == p->nCap )
557 {
558 if ( p->nCap < 16 )
559 Vec_StrGrow( p, 16 );
560 else
561 Vec_StrGrow( p, p->nCap < ABC_INT_MAX/2 ? 2 * p->nCap : ABC_INT_MAX );
562 }
563 p->pArray[p->nSize++] = Entry;
564}
565static inline void Vec_StrPushTwo( Vec_Str_t * p, char Entry1, char Entry2 )
566{
567 Vec_StrPush( p, Entry1 );
568 Vec_StrPush( p, Entry2 );
569}
570static inline void Vec_StrPushBuffer( Vec_Str_t * p, char * pBuffer, int nSize )
571{
572 if ( p->nSize + nSize > p->nCap )
573 Vec_StrGrow( p, 2 * (p->nSize + nSize) );
574 memcpy( p->pArray + p->nSize, pBuffer, (size_t)nSize );
575 p->nSize += nSize;
576}
577
589static inline char Vec_StrPop( Vec_Str_t * p )
590{
591 assert( p->nSize > 0 );
592 return p->pArray[--p->nSize];
593}
594
606static inline void Vec_StrIntPrint( Vec_Str_t * p )
607{
608 int i;
609 printf( "Vector has %d entries: {", Vec_StrSize(p) );
610 for ( i = 0; i < Vec_StrSize(p); i++ )
611 printf( " %d", (int)Vec_StrEntry(p, i) );
612 printf( " }\n" );
613}
614
626static inline void Vec_StrPrintNum( Vec_Str_t * p, int Num )
627{
628 int i;
629 char Digits[16];
630 if ( Num == 0 )
631 {
632 Vec_StrPush( p, '0' );
633 return;
634 }
635 if ( Num < 0 )
636 {
637 Vec_StrPush( p, '-' );
638 Num = -Num;
639 }
640 for ( i = 0; Num; Num /= 10, i++ )
641 Digits[i] = Num % 10;
642 for ( i--; i >= 0; i-- )
643 Vec_StrPush( p, (char)('0' + Digits[i]) );
644}
645static inline void Vec_StrPrintNumStar( Vec_Str_t * p, int Num, int nDigits )
646{
647 int i;
648 char Digits[16] = {0};
649 if ( Num == 0 )
650 {
651 for ( i = 0; i < nDigits; i++ )
652 Vec_StrPush( p, '0' );
653 return;
654 }
655 if ( Num < 0 )
656 {
657 Vec_StrPush( p, '-' );
658 Num = -Num;
659 nDigits--;
660 }
661 for ( i = 0; Num; Num /= 10, i++ )
662 Digits[i] = Num % 10;
663 for ( i = Abc_MaxInt(i, nDigits)-1; i >= 0; i-- )
664 Vec_StrPush( p, (char)('0' + Digits[i]) );
665}
666
678static inline void Vec_StrPrintStr( Vec_Str_t * p, const char * pStr )
679{
680 int i, Length = (int)strlen(pStr);
681 for ( i = 0; i < Length; i++ )
682 Vec_StrPush( p, pStr[i] );
683}
684
685
697#ifdef WIN32
698#define vsnprintf _vsnprintf
699#endif
700
701static inline char * Vec_StrPrintF( Vec_Str_t * p, const char * format, ... )
702{
703 int nAdded, nSize = 1000;
704 va_list args; va_start( args, format );
705 Vec_StrGrow( p, Vec_StrSize(p) + nSize );
706 nAdded = vsnprintf( Vec_StrLimit(p), nSize, format, args );
707 if ( nAdded > nSize )
708 {
709 Vec_StrGrow( p, Vec_StrSize(p) + nAdded + nSize );
710 nSize = vsnprintf( Vec_StrLimit(p), nAdded, format, args );
711 assert( nSize == nAdded );
712 }
713 p->nSize += nAdded;
714 va_end( args );
715 return Vec_StrLimit(p) - nAdded;
716}
717
729static inline void Vec_StrAppend( Vec_Str_t * p, const char * pString )
730{
731 Vec_StrPrintStr( p, pString );
732}
733static inline void Vec_StrCopy( Vec_Str_t * p, const char * pString )
734{
735 Vec_StrClear( p );
736 Vec_StrAppend( p, pString );
737 Vec_StrPush( p, '\0' );
738}
739
751static inline void Vec_StrReverseOrder( Vec_Str_t * p )
752{
753 int i, Temp;
754 for ( i = 0; i < p->nSize/2; i++ )
755 {
756 Temp = p->pArray[i];
757 p->pArray[i] = p->pArray[p->nSize-1-i];
758 p->pArray[p->nSize-1-i] = Temp;
759 }
760}
761
773static inline int Vec_StrSum( Vec_Str_t * p )
774{
775 int i, Counter = 0;
776 for ( i = 0; i < p->nSize; i++ )
777 Counter += (int)p->pArray[i];
778 return Counter;
779}
780
792static inline int Vec_StrCountEntry( Vec_Str_t * p, char Entry )
793{
794 int i, Counter = 0;
795 for ( i = 0; i < p->nSize; i++ )
796 Counter += (p->pArray[i] == Entry);
797 return Counter;
798}
799static inline int Vec_StrCountLarger( Vec_Str_t * p, char Entry )
800{
801 int i, Counter = 0;
802 for ( i = 0; i < p->nSize; i++ )
803 Counter += (p->pArray[i] > Entry);
804 return Counter;
805}
806static inline int Vec_StrCountSmaller( Vec_Str_t * p, char Entry )
807{
808 int i, Counter = 0;
809 for ( i = 0; i < p->nSize; i++ )
810 Counter += (p->pArray[i] < Entry);
811 return Counter;
812}
813
825static inline int Vec_StrCountEntryLit( Vec_Str_t * p, char Entry )
826{
827 int i, Counter = 0;
828 for ( i = 0; i < p->nSize; i++ )
829 Counter += (Abc_Lit2Var((int)p->pArray[i]) == Entry);
830 return Counter;
831}
832static inline int Vec_StrCountLargerLit( Vec_Str_t * p, char Entry )
833{
834 int i, Counter = 0;
835 for ( i = 0; i < p->nSize; i++ )
836 Counter += (Abc_Lit2Var((int)p->pArray[i]) > Entry);
837 return Counter;
838}
839static inline int Vec_StrCountSmallerLit( Vec_Str_t * p, char Entry )
840{
841 int i, Counter = 0;
842 for ( i = 0; i < p->nSize; i++ )
843 Counter += (Abc_Lit2Var((int)p->pArray[i]) < Entry);
844 return Counter;
845}
846
858static inline int Vec_StrEqual( Vec_Str_t * p1, Vec_Str_t * p2 )
859{
860 int i;
861 if ( p1->nSize != p2->nSize )
862 return 0;
863 for ( i = 0; i < p1->nSize; i++ )
864 if ( p1->pArray[i] != p2->pArray[i] )
865 return 0;
866 return 1;
867}
868
880static int Vec_StrSortCompare1( char * pp1, char * pp2 )
881{
882 // for some reason commenting out lines (as shown) led to crashing of the release version
883 if ( *pp1 < *pp2 )
884 return -1;
885 if ( *pp1 > *pp2 ) //
886 return 1;
887 return 0; //
888}
889
901static int Vec_StrSortCompare2( char * pp1, char * pp2 )
902{
903 // for some reason commenting out lines (as shown) led to crashing of the release version
904 if ( *pp1 > *pp2 )
905 return -1;
906 if ( *pp1 < *pp2 ) //
907 return 1;
908 return 0; //
909}
910
922static inline void Vec_StrSort( Vec_Str_t * p, int fReverse )
923{
924 if ( fReverse )
925 qsort( (void *)p->pArray, (size_t)p->nSize, sizeof(char),
926 (int (*)(const void *, const void *)) Vec_StrSortCompare2 );
927 else
928 qsort( (void *)p->pArray, (size_t)p->nSize, sizeof(char),
929 (int (*)(const void *, const void *)) Vec_StrSortCompare1 );
930}
931
943static inline int Vec_StrCompareVec( Vec_Str_t * p1, Vec_Str_t * p2 )
944{
945 if ( p1 == NULL || p2 == NULL )
946 return (p1 != NULL) - (p2 != NULL);
947 if ( Vec_StrSize(p1) != Vec_StrSize(p2) )
948 return Vec_StrSize(p1) - Vec_StrSize(p2);
949 return memcmp( Vec_StrArray(p1), Vec_StrArray(p2), (size_t)Vec_StrSize(p1) );
950}
951
952
964static inline void Vec_StrPutI_ne( Vec_Str_t * vOut, int Val )
965{
966 int i;
967// for ( i = 0; i < 4; i++ )
968 for ( i = 3; i >= 0; i-- )
969 Vec_StrPush( vOut, (char)(Val >> (8*i)) );
970}
971static inline int Vec_StrGetI_ne( Vec_Str_t * vOut, int * pPos )
972{
973 int i;
974 int Val = 0;
975// for ( i = 0; i < 4; i++ )
976 for ( i = 3; i >= 0; i-- )
977 Val |= ((int)(unsigned char)Vec_StrEntry(vOut, (*pPos)++) << (8*i));
978 return Val;
979}
980
981static inline void Vec_StrPutI( Vec_Str_t * vOut, int Val )
982{
983 for ( ; Val >= 0x80; Val >>= 7 )
984 Vec_StrPush( vOut, (unsigned char)(Val | 0x80) );
985 Vec_StrPush( vOut, (unsigned char)Val );
986}
987static inline int Vec_StrGetI( Vec_Str_t * vOut, int * pPos )
988{
989 unsigned char ch;
990 int i = 0, Val = 0;
991 while ( (ch = Vec_StrEntry(vOut, (*pPos)++)) & 0x80 )
992 Val |= ((ch & 0x7f) << (7 * i++));
993 return Val | (ch << (7 * i));
994}
995
996static inline void Vec_StrPutW( Vec_Str_t * vOut, word Val )
997{
998 int i;
999 for ( i = 0; i < 8; i++ )
1000 Vec_StrPush( vOut, (char)(Val >> (8*i)) );
1001}
1002static inline word Vec_StrGetW( Vec_Str_t * vOut, int * pPos )
1003{
1004 int i;
1005 word Val = 0;
1006 for ( i = 0; i < 8; i++ )
1007 Val |= ((word)(unsigned char)Vec_StrEntry(vOut, (*pPos)++) << (8*i));
1008 return Val;
1009}
1010
1011static inline void Vec_StrPutF( Vec_Str_t * vOut, float Val )
1012{
1013 union { float num; unsigned char data[4]; } tmp;
1014 tmp.num = Val;
1015 Vec_StrPush( vOut, tmp.data[0] );
1016 Vec_StrPush( vOut, tmp.data[1] );
1017 Vec_StrPush( vOut, tmp.data[2] );
1018 Vec_StrPush( vOut, tmp.data[3] );
1019}
1020static inline float Vec_StrGetF( Vec_Str_t * vOut, int * pPos )
1021{
1022 union { float num; unsigned char data[4]; } tmp;
1023 tmp.data[0] = Vec_StrEntry( vOut, (*pPos)++ );
1024 tmp.data[1] = Vec_StrEntry( vOut, (*pPos)++ );
1025 tmp.data[2] = Vec_StrEntry( vOut, (*pPos)++ );
1026 tmp.data[3] = Vec_StrEntry( vOut, (*pPos)++ );
1027 return tmp.num;
1028}
1029
1030static inline void Vec_StrPutD( Vec_Str_t * vOut, double Val )
1031{
1032 union { double num; unsigned char data[8]; } tmp;
1033 int i, Lim = sizeof(double);
1034 tmp.num = Val;
1035 for ( i = 0; i < Lim; i++ )
1036 Vec_StrPush( vOut, tmp.data[i] );
1037}
1038static inline double Vec_StrGetD( Vec_Str_t * vOut, int * pPos )
1039{
1040 union { double num; unsigned char data[8]; } tmp;
1041 int i, Lim = sizeof(double);
1042 for ( i = 0; i < Lim; i++ )
1043 tmp.data[i] = Vec_StrEntry( vOut, (*pPos)++ );
1044 return tmp.num;
1045}
1046
1047static inline void Vec_StrPutS( Vec_Str_t * vOut, char * pStr )
1048{
1049 while ( *pStr )
1050 Vec_StrPush( vOut, *pStr++ );
1051 Vec_StrPush( vOut, (char)0 );
1052}
1053static inline char * Vec_StrGetS( Vec_Str_t * vOut, int * pPos )
1054{
1055 char * pStr = Vec_StrEntryP( vOut, *pPos );
1056 while ( Vec_StrEntry(vOut, (*pPos)++) );
1057 return Abc_UtilStrsav(pStr);
1058}
1059
1060static inline void Vec_StrPutC( Vec_Str_t * vOut, char c )
1061{
1062 Vec_StrPush( vOut, c );
1063}
1064static inline char Vec_StrGetC( Vec_Str_t * vOut, int * pPos )
1065{
1066 return Vec_StrEntry(vOut, (*pPos)++);
1067}
1068
1069
1070
1072
1073#endif
1074
1078
#define ABC_INT_MAX
Definition abc_global.h:251
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_REALLOC(type, obj, num)
Definition abc_global.h:268
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
struct Vec_Str_t_ Vec_Str_t
Definition bblif.c:46
Cube * p
Definition exorList.c:222
unsigned __int64 word
DECLARATIONS ///.
Definition kitPerm.c:36
int nCap
Definition bblif.c:49
int nSize
Definition bblif.c:50
char * pArray
Definition bblif.c:51
#define assert(ex)
Definition util_old.h:213
char * memcpy()
char * memset()
int strlen()
int memcmp()