[Com0com-cvs] com0com/setup utils.cpp,1.1,1.2 utils.h,1.1,1.2
The virtual serial port driver for Windows.
Brought to you by:
vfrolov
From: Vyacheslav F. <vf...@us...> - 2006-11-02 16:09:29
|
Update of /cvsroot/com0com/com0com/setup In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv30930 Modified Files: utils.cpp utils.h Log Message: Added StrToInt() and class BusyMask Index: utils.cpp =================================================================== RCS file: /cvsroot/com0com/com0com/setup/utils.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** utils.cpp 28 Jul 2006 12:16:43 -0000 1.1 --- utils.cpp 2 Nov 2006 16:09:13 -0000 1.2 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.2 2006/11/02 16:09:13 vfrolov + * Added StrToInt() and class BusyMask + * * Revision 1.1 2006/07/28 12:16:43 vfrolov * Initial revision *************** *** 57,58 **** --- 60,158 ---- } /////////////////////////////////////////////////////////////// + BOOL StrToInt(const char *pStr, int *pNum) + { + BOOL res = FALSE; + int num; + int sign = 1; + + switch (*pStr) { + case '-': + sign = -1; + case '+': + pStr++; + break; + } + + for (num = 0 ;; pStr++) { + switch (*pStr) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + num = num*10 + (*pStr - '0'); + res = TRUE; + continue; + case 0: + break; + default: + res = FALSE; + } + break; + } + + if (pNum) + *pNum = num*sign; + + return res; + } + /////////////////////////////////////////////////////////////// + BusyMask::~BusyMask() + { + if (pBusyMask) + LocalFree(pBusyMask); + } + + void BusyMask::AddNum(int num) + { + ULONG maskNum = num/(sizeof(*pBusyMask)*8); + + if (maskNum >= busyMaskLen) { + SIZE_T newBusyMaskLen = maskNum + 1; + PBYTE pNewBusyMask; + + if (!pBusyMask) + pNewBusyMask = (PBYTE)LocalAlloc(LPTR, newBusyMaskLen); + else + pNewBusyMask = (PBYTE)LocalReAlloc(pBusyMask, newBusyMaskLen, LMEM_ZEROINIT); + + if (pNewBusyMask) { + pBusyMask = pNewBusyMask; + busyMaskLen = newBusyMaskLen; + } else { + return; + } + } + + ULONG mask = 1 << (num%(sizeof(*pBusyMask)*8)); + + pBusyMask[maskNum] |= mask; + } + + BOOL BusyMask::IsFreeNum(int num) const + { + ULONG maskNum = num/(sizeof(*pBusyMask)*8); + + if (maskNum >= busyMaskLen) + return TRUE; + + ULONG mask = 1 << (num%(sizeof(*pBusyMask)*8)); + + return (pBusyMask[maskNum] & mask) == 0; + } + + int BusyMask::GetFirstFreeNum() const + { + int num; + + for (num = 0 ; !IsFreeNum(num) ; num++) + ; + + return num; + } + /////////////////////////////////////////////////////////////// Index: utils.h =================================================================== RCS file: /cvsroot/com0com/com0com/setup/utils.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** utils.h 28 Jul 2006 12:16:43 -0000 1.1 --- utils.h 2 Nov 2006 16:09:13 -0000 1.2 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.2 2006/11/02 16:09:13 vfrolov + * Added StrToInt() and class BusyMask + * * Revision 1.1 2006/07/28 12:16:43 vfrolov * Initial revision *************** *** 31,34 **** --- 34,51 ---- int VSNPRINTF(char *pBuf, int size, const char *pFmt, va_list va); int SNPRINTF(char *pBuf, int size, const char *pFmt, ...); + BOOL StrToInt(const char *pStr, int *pNum); + + class BusyMask { + public: + BusyMask() : pBusyMask(NULL), busyMaskLen(0) {} + ~BusyMask(); + + void AddNum(int num); + BOOL IsFreeNum(int num) const; + int GetFirstFreeNum() const; + private: + PBYTE pBusyMask; + SIZE_T busyMaskLen; + }; #endif /* _C0C_UTILS_H_ */ |