1 /**CFile****************************************************************
2 
3   FileName    [extra.h]
4 
5   SystemName  [ABC: Logic synthesis and verification system.]
6 
7   PackageName [extra]
8 
9   Synopsis    [Various reusable software utilities.]
10 
11   Description [This library contains a number of operators and
12   traversal routines developed to extend the functionality of
13   CUDD v.2.3.x, by Fabio Somenzi (http://vlsi.colorado.edu/~fabio/)
14   To compile your code with the library, #include "extra.h"
15   in your source files and link your project to CUDD and this
16   library. Use the library at your own risk and with caution.
17   Note that debugging of some operators still continues.]
18 
19   Author      [Alan Mishchenko]
20 
21   Affiliation [UC Berkeley]
22 
23   Date        [Ver. 1.0. Started - June 20, 2005.]
24 
25   Revision    [$Id: extra.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
26 
27 ***********************************************************************/
28 
29 #ifndef ABC__misc__extra__extra_h
30 #define ABC__misc__extra__extra_h
31 
32 
33 #ifdef _WIN32
34 #define inline __inline // compatible with MS VS 6.0
35 #endif
36 
37 /*---------------------------------------------------------------------------*/
38 /* Nested includes                                                           */
39 /*---------------------------------------------------------------------------*/
40 
41 #include <stdio.h>
42 #include <stdlib.h>
43 #include <string.h>
44 #include <assert.h>
45 
46 #include "misc/st/st.h"
47 
48 ABC_NAMESPACE_HEADER_START
49 
50 
51 /*---------------------------------------------------------------------------*/
52 /* Constant declarations                                                     */
53 /*---------------------------------------------------------------------------*/
54 
55 /*---------------------------------------------------------------------------*/
56 /* Stucture declarations                                                     */
57 /*---------------------------------------------------------------------------*/
58 
59 /*---------------------------------------------------------------------------*/
60 /* Type declarations                                                         */
61 /*---------------------------------------------------------------------------*/
62 
63 /*---------------------------------------------------------------------------*/
64 /* Variable declarations                                                     */
65 /*---------------------------------------------------------------------------*/
66 
67 /*---------------------------------------------------------------------------*/
68 /* Macro declarations                                                        */
69 /*---------------------------------------------------------------------------*/
70 
71 typedef unsigned char      uint8;
72 typedef unsigned short     uint16;
73 typedef unsigned int       uint32;
74 
75 /*===========================================================================*/
76 /*     Various Utilities                                                     */
77 /*===========================================================================*/
78 
79 /*=== extraUtilBitMatrix.c ================================================================*/
80 
81 typedef struct Extra_BitMat_t_ Extra_BitMat_t;
82 extern Extra_BitMat_t * Extra_BitMatrixStart( int nSize );
83 extern void         Extra_BitMatrixClean( Extra_BitMat_t * p );
84 extern void         Extra_BitMatrixStop( Extra_BitMat_t * p );
85 extern void         Extra_BitMatrixPrint( Extra_BitMat_t * p );
86 extern int          Extra_BitMatrixReadSize( Extra_BitMat_t * p );
87 extern void         Extra_BitMatrixInsert1( Extra_BitMat_t * p, int i, int k );
88 extern int          Extra_BitMatrixLookup1( Extra_BitMat_t * p, int i, int k );
89 extern void         Extra_BitMatrixDelete1( Extra_BitMat_t * p, int i, int k );
90 extern void         Extra_BitMatrixInsert2( Extra_BitMat_t * p, int i, int k );
91 extern int          Extra_BitMatrixLookup2( Extra_BitMat_t * p, int i, int k );
92 extern void         Extra_BitMatrixDelete2( Extra_BitMat_t * p, int i, int k );
93 extern void         Extra_BitMatrixOr( Extra_BitMat_t * p, int i, unsigned * pInfo );
94 extern void         Extra_BitMatrixOrTwo( Extra_BitMat_t * p, int i, int j );
95 extern int          Extra_BitMatrixCountOnesUpper( Extra_BitMat_t * p );
96 extern int          Extra_BitMatrixIsDisjoint( Extra_BitMat_t * p1, Extra_BitMat_t * p2 );
97 extern int          Extra_BitMatrixIsClique( Extra_BitMat_t * p );
98 
99 /*=== extraUtilFile.c ========================================================*/
100 
101 extern char *       Extra_FileGetSimilarName( char * pFileNameWrong, char * pS1, char * pS2, char * pS3, char * pS4, char * pS5 );
102 extern char *       Extra_FileNameExtension( char * FileName );
103 extern char *       Extra_FileNameAppend( char * pBase, char * pSuffix );
104 extern char *       Extra_FileNameGeneric( char * FileName );
105 extern char *       Extra_FileNameGenericAppend( char * pBase, char * pSuffix );
106 extern void         Extra_FileNameCorrectPath( char * FileName );
107 extern char *       Extra_FileNameWithoutPath( char * FileName );
108 extern char *       Extra_FilePathWithoutName( char * FileName );
109 extern char *       Extra_FileDesignName( char * pFileName );
110 extern int          Extra_FileCheck( char * pFileName );
111 extern int          Extra_FileSize( char * pFileName );
112 extern char *       Extra_FileRead( FILE * pFile );
113 extern char *       Extra_FileRead2( FILE * pFile, FILE * pFile2 );
114 extern char *       Extra_FileReadContents( char * pFileName );
115 extern char *       Extra_FileReadContents2( char * pFileName, char * pFileName2 );
116 extern int          Extra_FileIsType( char * pFileName, char * pS1, char * pS2, char * pS3 );
117 extern char *       Extra_TimeStamp();
118 extern char *       Extra_StringAppend( char * pStrGiven, char * pStrAdd );
119 extern void         Extra_StringClean( char * pStrGiven, char * pCharKeep );
120 extern unsigned     Extra_ReadBinary( char * Buffer );
121 extern void         Extra_PrintBinary( FILE * pFile, unsigned Sign[], int nBits );
122 extern void         Extra_PrintBinary2( FILE * pFile, unsigned Sign[], int nBits );
123 extern int          Extra_ReadHex( unsigned Sign[], char * pString, int nDigits );
124 extern int          Extra_ReadHexadecimal( unsigned Sign[], char * pString, int nVars );
125 extern void         Extra_PrintHexadecimal( FILE * pFile, unsigned Sign[], int nVars );
126 extern void         Extra_PrintHexadecimalString( char * pString, unsigned Sign[], int nVars );
127 extern void         Extra_PrintHex( FILE * pFile, unsigned * pTruth, int nVars );
128 extern void         Extra_PrintHex2( FILE * pFile, unsigned * pTruth, int nVars );
129 extern void         Extra_PrintHexReverse( FILE * pFile, unsigned * pTruth, int nVars );
130 extern void         Extra_PrintSymbols( FILE * pFile, char Char, int nTimes, int fPrintNewLine );
131 
132 /*=== extraUtilReader.c ========================================================*/
133 
134 typedef struct Extra_FileReader_t_ Extra_FileReader_t;
135 extern Extra_FileReader_t * Extra_FileReaderAlloc( char * pFileName,
136     char * pCharsComment, char * pCharsStop, char * pCharsClean );
137 extern void         Extra_FileReaderFree( Extra_FileReader_t * p );
138 extern char *       Extra_FileReaderGetFileName( Extra_FileReader_t * p );
139 extern int          Extra_FileReaderGetFileSize( Extra_FileReader_t * p );
140 extern int          Extra_FileReaderGetCurPosition( Extra_FileReader_t * p );
141 extern void *       Extra_FileReaderGetTokens( Extra_FileReader_t * p );
142 extern int          Extra_FileReaderGetLineNumber( Extra_FileReader_t * p, int iToken );
143 
144 /*=== extraUtilMemory.c ========================================================*/
145 
146 typedef struct Extra_MmFixed_t_    Extra_MmFixed_t;
147 typedef struct Extra_MmFlex_t_     Extra_MmFlex_t;
148 typedef struct Extra_MmStep_t_     Extra_MmStep_t;
149 
150 // fixed-size-block memory manager
151 extern Extra_MmFixed_t *  Extra_MmFixedStart( int nEntrySize );
152 extern void        Extra_MmFixedStop( Extra_MmFixed_t * p );
153 extern char *      Extra_MmFixedEntryFetch( Extra_MmFixed_t * p );
154 extern void        Extra_MmFixedEntryRecycle( Extra_MmFixed_t * p, char * pEntry );
155 extern void        Extra_MmFixedRestart( Extra_MmFixed_t * p );
156 extern int         Extra_MmFixedReadMemUsage( Extra_MmFixed_t * p );
157 extern int         Extra_MmFixedReadMaxEntriesUsed( Extra_MmFixed_t * p );
158 // flexible-size-block memory manager
159 extern Extra_MmFlex_t * Extra_MmFlexStart();
160 extern void        Extra_MmFlexStop( Extra_MmFlex_t * p );
161 extern void        Extra_MmFlexPrint( Extra_MmFlex_t * p );
162 extern char *      Extra_MmFlexEntryFetch( Extra_MmFlex_t * p, int nBytes );
163 extern int         Extra_MmFlexReadMemUsage( Extra_MmFlex_t * p );
164 // hierarchical memory manager
165 extern Extra_MmStep_t * Extra_MmStepStart( int nSteps );
166 extern void        Extra_MmStepStop( Extra_MmStep_t * p );
167 extern char *      Extra_MmStepEntryFetch( Extra_MmStep_t * p, int nBytes );
168 extern void        Extra_MmStepEntryRecycle( Extra_MmStep_t * p, char * pEntry, int nBytes );
169 extern int         Extra_MmStepReadMemUsage( Extra_MmStep_t * p );
170 
171 /*=== extraUtilMisc.c ========================================================*/
172 
173 /* finds the smallest integer larger or equal than the logarithm */
174 extern int         Extra_Base2LogDouble( double Num );
175 /* returns the power of two as a double */
176 extern double      Extra_Power2( int Num );
177 extern int         Extra_Power3( int Num );
178 /* the number of combinations of k elements out of n */
179 extern int         Extra_NumCombinations( int k, int n  );
180 extern int *       Extra_DeriveRadixCode( int Number, int Radix, int nDigits );
181 /* counts the number of 1s in the bitstring */
182 extern int         Extra_CountOnes( unsigned char * pBytes, int nBytes );
183 /* the factorial of number */
184 extern int         Extra_Factorial( int n );
185 /* the permutation of the given number of elements */
186 extern char **     Extra_Permutations( int n );
187 /* permutation and complementation of a truth table */
188 unsigned           Extra_TruthPermute( unsigned Truth, char * pPerms, int nVars, int fReverse );
189 unsigned           Extra_TruthPolarize( unsigned uTruth, int Polarity, int nVars );
190 /* canonical forms of a truth table */
191 extern unsigned    Extra_TruthCanonN( unsigned uTruth, int nVars );
192 extern unsigned    Extra_TruthCanonNN( unsigned uTruth, int nVars );
193 extern unsigned    Extra_TruthCanonP( unsigned uTruth, int nVars );
194 extern unsigned    Extra_TruthCanonNP( unsigned uTruth, int nVars );
195 extern unsigned    Extra_TruthCanonNPN( unsigned uTruth, int nVars );
196 /* canonical forms of 4-variable functions */
197 extern void        Extra_Truth4VarNPN( unsigned short ** puCanons, char ** puPhases, char ** puPerms, unsigned char ** puMap );
198 extern void        Extra_Truth4VarN( unsigned short ** puCanons, char *** puPhases, char ** ppCounters, int nPhasesMax );
199 /* permutation mapping */
200 extern unsigned short Extra_TruthPerm4One( unsigned uTruth, int Phase );
201 extern unsigned    Extra_TruthPerm5One( unsigned uTruth, int Phase );
202 extern void        Extra_TruthPerm6One( unsigned * uTruth, int Phase, unsigned * uTruthRes );
203 extern void        Extra_TruthExpand( int nVars, int nWords, unsigned * puTruth, unsigned uPhase, unsigned * puTruthR );
204 /* precomputing tables for permutation mapping */
205 extern void **     Extra_ArrayAlloc( int nCols, int nRows, int Size );
206 extern unsigned short ** Extra_TruthPerm43();
207 extern unsigned ** Extra_TruthPerm53();
208 extern unsigned ** Extra_TruthPerm54();
209 /* bubble sort for small number of entries */
210 extern void        Extra_BubbleSort( int Order[], int Costs[], int nSize, int fIncreasing );
211 /* complementation/permutation generation */
212 extern int *       Extra_GreyCodeSchedule( int n );
213 extern int *       Extra_PermSchedule( int n );
214 extern word        Extra_Truth6MinimumExact( word t, int * pComp, int * pPerm );
215 extern word        Extra_Truth6MinimumHeuristic( word t );
216 
217 /*=== extraUtilCanon.c ========================================================*/
218 
219 /* fast computation of N-canoninical form up to 6 inputs */
220 extern int         Extra_TruthCanonFastN( int nVarsMax, int nVarsReal, unsigned * pt, unsigned ** pptRes, char ** ppfRes );
221 
222 /*=== extraUtilDsd.c ========================================================*/
223 
224 typedef struct Sdm_Man_t_ Sdm_Man_t;
225 extern int         Sdm_ManCanRead();
226 extern Sdm_Man_t * Sdm_ManRead();
227 extern void        Sdm_ManQuit();
228 extern int         Sdm_ManComputeFunc( Sdm_Man_t * p, int iDsdLit0, int iDsdLit1, int * pCut, int uMask, int fXor );
229 extern void        Sdm_ManPrintDsdStats( Sdm_Man_t * p, int fVerbose );
230 extern int         Sdm_ManReadDsdVarNum( Sdm_Man_t * p, int iDsd );
231 extern int         Sdm_ManReadDsdAndNum( Sdm_Man_t * p, int iDsd );
232 extern int         Sdm_ManReadDsdClauseNum( Sdm_Man_t * p, int iDsd );
233 extern word        Sdm_ManReadDsdTruth( Sdm_Man_t * p, int iDsd );
234 extern char *      Sdm_ManReadDsdStr( Sdm_Man_t * p, int iDsd );
235 extern void        Sdm_ManReadCnfCosts( Sdm_Man_t * p, int * pCosts, int nCosts );
236 
237 /*=== extraUtilProgress.c ================================================================*/
238 
239 typedef struct ProgressBarStruct ProgressBar;
240 
241 extern ProgressBar * Extra_ProgressBarStart( FILE * pFile, int nItemsTotal );
242 extern void        Extra_ProgressBarStop( ProgressBar * p );
243 extern void        Extra_ProgressBarUpdate_int( ProgressBar * p, int nItemsCur, char * pString );
244 
Extra_ProgressBarUpdate(ProgressBar * p,int nItemsCur,char * pString)245 static inline void Extra_ProgressBarUpdate( ProgressBar * p, int nItemsCur, char * pString )
246 {  if ( p && nItemsCur < *((int*)p) ) return; Extra_ProgressBarUpdate_int(p, nItemsCur, pString); }
247 
248 /*=== extraUtilTruth.c ================================================================*/
249 
Extra_BitWordNum(int nBits)250 static inline int   Extra_BitWordNum( int nBits )    { return nBits/(8*sizeof(unsigned)) + ((nBits%(8*sizeof(unsigned))) > 0);  }
Extra_TruthWordNum(int nVars)251 static inline int   Extra_TruthWordNum( int nVars )  { return nVars <= 5 ? 1 : (1 << (nVars - 5)); }
252 
Extra_TruthSetBit(unsigned * p,int Bit)253 static inline void  Extra_TruthSetBit( unsigned * p, int Bit )   { p[Bit>>5] |= (unsigned)(1<<(Bit & 31));               }
Extra_TruthXorBit(unsigned * p,int Bit)254 static inline void  Extra_TruthXorBit( unsigned * p, int Bit )   { p[Bit>>5] ^= (unsigned)(1<<(Bit & 31));               }
Extra_TruthHasBit(unsigned * p,int Bit)255 static inline int   Extra_TruthHasBit( unsigned * p, int Bit )   { return (p[Bit>>5] & (unsigned)(1<<(Bit & 31))) > 0;   }
256 
Extra_WordCountOnes(unsigned uWord)257 static inline int Extra_WordCountOnes( unsigned uWord )
258 {
259     uWord = (uWord & 0x55555555) + ((uWord>>1) & 0x55555555);
260     uWord = (uWord & 0x33333333) + ((uWord>>2) & 0x33333333);
261     uWord = (uWord & 0x0F0F0F0F) + ((uWord>>4) & 0x0F0F0F0F);
262     uWord = (uWord & 0x00FF00FF) + ((uWord>>8) & 0x00FF00FF);
263     return  (uWord & 0x0000FFFF) + (uWord>>16);
264 }
Extra_TruthCountOnes(unsigned * pIn,int nVars)265 static inline int Extra_TruthCountOnes( unsigned * pIn, int nVars )
266 {
267     int w, Counter = 0;
268     for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
269         Counter += Extra_WordCountOnes(pIn[w]);
270     return Counter;
271 }
Extra_TruthIsEqual(unsigned * pIn0,unsigned * pIn1,int nVars)272 static inline int Extra_TruthIsEqual( unsigned * pIn0, unsigned * pIn1, int nVars )
273 {
274     int w;
275     for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
276         if ( pIn0[w] != pIn1[w] )
277             return 0;
278     return 1;
279 }
Extra_TruthIsConst0(unsigned * pIn,int nVars)280 static inline int Extra_TruthIsConst0( unsigned * pIn, int nVars )
281 {
282     int w;
283     for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
284         if ( pIn[w] )
285             return 0;
286     return 1;
287 }
Extra_TruthIsConst1(unsigned * pIn,int nVars)288 static inline int Extra_TruthIsConst1( unsigned * pIn, int nVars )
289 {
290     int w;
291     for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
292         if ( pIn[w] != ~(unsigned)0 )
293             return 0;
294     return 1;
295 }
Extra_TruthIsImply(unsigned * pIn1,unsigned * pIn2,int nVars)296 static inline int Extra_TruthIsImply( unsigned * pIn1, unsigned * pIn2, int nVars )
297 {
298     int w;
299     for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
300         if ( pIn1[w] & ~pIn2[w] )
301             return 0;
302     return 1;
303 }
Extra_TruthCopy(unsigned * pOut,unsigned * pIn,int nVars)304 static inline void Extra_TruthCopy( unsigned * pOut, unsigned * pIn, int nVars )
305 {
306     int w;
307     for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
308         pOut[w] = pIn[w];
309 }
Extra_TruthClear(unsigned * pOut,int nVars)310 static inline void Extra_TruthClear( unsigned * pOut, int nVars )
311 {
312     int w;
313     for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
314         pOut[w] = 0;
315 }
Extra_TruthFill(unsigned * pOut,int nVars)316 static inline void Extra_TruthFill( unsigned * pOut, int nVars )
317 {
318     int w;
319     for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
320         pOut[w] = ~(unsigned)0;
321 }
Extra_TruthNot(unsigned * pOut,unsigned * pIn,int nVars)322 static inline void Extra_TruthNot( unsigned * pOut, unsigned * pIn, int nVars )
323 {
324     int w;
325     for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
326         pOut[w] = ~pIn[w];
327 }
Extra_TruthAnd(unsigned * pOut,unsigned * pIn0,unsigned * pIn1,int nVars)328 static inline void Extra_TruthAnd( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars )
329 {
330     int w;
331     for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
332         pOut[w] = pIn0[w] & pIn1[w];
333 }
Extra_TruthOr(unsigned * pOut,unsigned * pIn0,unsigned * pIn1,int nVars)334 static inline void Extra_TruthOr( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars )
335 {
336     int w;
337     for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
338         pOut[w] = pIn0[w] | pIn1[w];
339 }
Extra_TruthSharp(unsigned * pOut,unsigned * pIn0,unsigned * pIn1,int nVars)340 static inline void Extra_TruthSharp( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars )
341 {
342     int w;
343     for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
344         pOut[w] = pIn0[w] & ~pIn1[w];
345 }
Extra_TruthNand(unsigned * pOut,unsigned * pIn0,unsigned * pIn1,int nVars)346 static inline void Extra_TruthNand( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars )
347 {
348     int w;
349     for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
350         pOut[w] = ~(pIn0[w] & pIn1[w]);
351 }
Extra_TruthAndPhase(unsigned * pOut,unsigned * pIn0,unsigned * pIn1,int nVars,int fCompl0,int fCompl1)352 static inline void Extra_TruthAndPhase( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars, int fCompl0, int fCompl1 )
353 {
354     int w;
355     if ( fCompl0 && fCompl1 )
356     {
357         for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
358             pOut[w] = ~(pIn0[w] | pIn1[w]);
359     }
360     else if ( fCompl0 && !fCompl1 )
361     {
362         for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
363             pOut[w] = ~pIn0[w] & pIn1[w];
364     }
365     else if ( !fCompl0 && fCompl1 )
366     {
367         for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
368             pOut[w] = pIn0[w] & ~pIn1[w];
369     }
370     else // if ( !fCompl0 && !fCompl1 )
371     {
372         for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
373             pOut[w] = pIn0[w] & pIn1[w];
374     }
375 }
376 
377 extern unsigned ** Extra_TruthElementary( int nVars );
378 extern void        Extra_TruthSwapAdjacentVars( unsigned * pOut, unsigned * pIn, int nVars, int Start );
379 extern void        Extra_TruthStretch( unsigned * pOut, unsigned * pIn, int nVars, int nVarsAll, unsigned Phase );
380 extern void        Extra_TruthShrink( unsigned * pOut, unsigned * pIn, int nVars, int nVarsAll, unsigned Phase );
381 extern int         Extra_TruthVarInSupport( unsigned * pTruth, int nVars, int iVar );
382 extern int         Extra_TruthSupportSize( unsigned * pTruth, int nVars );
383 extern int         Extra_TruthSupport( unsigned * pTruth, int nVars );
384 extern void        Extra_TruthCofactor0( unsigned * pTruth, int nVars, int iVar );
385 extern void        Extra_TruthCofactor1( unsigned * pTruth, int nVars, int iVar );
386 extern void        Extra_TruthExist( unsigned * pTruth, int nVars, int iVar );
387 extern void        Extra_TruthForall( unsigned * pTruth, int nVars, int iVar );
388 extern void        Extra_TruthMux( unsigned * pOut, unsigned * pCof0, unsigned * pCof1, int nVars, int iVar );
389 extern void        Extra_TruthChangePhase( unsigned * pTruth, int nVars, int iVar );
390 extern int         Extra_TruthMinCofSuppOverlap( unsigned * pTruth, int nVars, int * pVarMin );
391 extern void        Extra_TruthCountOnesInCofs( unsigned * pTruth, int nVars, short * pStore );
392 extern unsigned    Extra_TruthHash( unsigned * pIn, int nWords );
393 extern unsigned    Extra_TruthSemiCanonicize( unsigned * pInOut, unsigned * pAux, int nVars, char * pCanonPerm, short * pStore );
394 
395 /*=== extraUtilUtil.c ================================================================*/
396 
397 extern abctime       Extra_CpuTime();
398 extern double        Extra_CpuTimeDouble();
399 extern int           Extra_GetSoftDataLimit();
400 extern ABC_DLL void  Extra_UtilGetoptReset();
401 extern int           Extra_UtilGetopt( int argc, char *argv[], const char *optstring );
402 extern char *        Extra_UtilPrintTime( long t );
403 extern char *        Extra_UtilStrsav( const char *s );
404 extern char *        Extra_UtilTildeExpand( char *fname );
405 extern char *        Extra_UtilFileSearch( char *file, char *path, char *mode );
406 extern void          (*Extra_UtilMMoutOfMemory)( long size );
407 
408 extern const char *  globalUtilOptarg;
409 extern int           globalUtilOptind;
410 
411 /**AutomaticEnd***************************************************************/
412 
413 
414 
415 ABC_NAMESPACE_HEADER_END
416 
417 
418 
419 #endif /* __EXTRA_H__ */
420