📄 ustdlib.c
字号:
usnprintf(char *pcBuf, unsigned long ulSize, const char *pcString, ...)
{
int iRet;
va_list vaArgP;
//
// Start the varargs processing.
//
va_start(vaArgP, pcString);
//
// Call vsnprintf to perform the conversion.
//
iRet = uvsnprintf(pcBuf, ulSize, pcString, vaArgP);
//
// End the varargs processing.
//
va_end(vaArgP);
//
// Return the conversion count.
//
return(iRet);
}
//*****************************************************************************
//
// This array contains the number of days in a year at the beginning of each
// month of the year, in a non-leap year.
//
//*****************************************************************************
static const short g_psDaysToMonth[12] =
{
0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
};
//*****************************************************************************
//
//! Converts from seconds to calendar date and time.
//!
//! \param ulTime is the number of seconds.
//! \param psTime is a pointer to the time structure that is filled in with the
//! broken down date and time.
//!
//! This function converts a number of seconds since midnight GMT on January 1,
//! 1970 (traditional Unix epoch) into the equivalent month, day, year, hours,
//! minutes, and seconds representation.
//!
//! \return None.
//
//*****************************************************************************
void
ulocaltime(unsigned long ulTime, tTime *psTime)
{
unsigned long ulTemp;
//
// Extract the number of seconds, converting time to the number of minutes.
//
ulTemp = ulTime / 60;
psTime->ucSec = ulTime - (ulTemp * 60);
ulTime = ulTemp;
//
// Extract the number of minutes, converting time to the number of hours.
//
ulTemp = ulTime / 60;
psTime->ucMin = ulTime - (ulTemp * 60);
ulTime = ulTemp;
//
// Extract the number of hours, converting time to the number of days.
//
ulTemp = ulTime / 24;
psTime->ucHour = ulTime - (ulTemp * 24);
ulTime = ulTemp;
//
// Compute the day of the week.
//
psTime->ucWday = (ulTime + 4) % 7;
//
// Compute the number of leap years that have occurred since 1968, the
// first leap year before 1970.
//
ulTime += 366 + 365;
ulTemp = ulTime / ((4 * 365) + 1);
if((ulTime - (ulTemp * ((4 * 365) + 1))) > (31 + 29))
{
ulTemp++;
}
//
// Extract the year.
//
psTime->usYear = ((ulTime - ulTemp) / 365) + 1968;
ulTime -= ((psTime->usYear - 1968) * 365) + ulTemp;
//
// Extract the month.
//
for(ulTemp = 0; ulTemp < 12; ulTemp++)
{
if(g_psDaysToMonth[ulTemp] > ulTime)
{
break;
}
}
psTime->ucMon = ulTemp - 1;
//
// Extract the day of the month.
//
psTime->ucMday = ulTime - g_psDaysToMonth[ulTemp - 1] + 1;
}
//*****************************************************************************
//
//! Converts a string into its numeric equivalent.
//!
//! \param pcStr is a pointer to the string containing the integer.
//! \param ppcStrRet is a pointer that will be set to the first character past
//! the integer in the string.
//! \param iBase is the radix to use for the conversion; can be zero to
//! auto-select the radix or between 2 and 16 to explicitly specify the radix.
//!
//! This function is very similar to the C library <tt>strtoul()</tt> function.
//! It scans a string for the first token (that is, non-white space) and
//! converts the value at that location in the string into an integer value.
//!
//! \return Returns the result of the conversion.
//
//*****************************************************************************
unsigned long
ustrtoul(const char *pcStr, const char **ppcStrRet, int iBase)
{
unsigned long ulRet, ulDigit, ulNeg, ulValid;
const char *pcPtr;
//
// Check the arguments.
//
ASSERT(pcStr);
ASSERT((iBase == 0) || ((iBase > 1) && (iBase <= 16)));
//
// Initially, the result is zero.
//
ulRet = 0;
ulNeg = 0;
ulValid = 0;
//
// Skip past any leading white space.
//
pcPtr = pcStr;
while((*pcPtr == ' ') || (*pcPtr == '\t'))
{
pcPtr++;
}
//
// Take a leading + or - from the value.
//
if(*pcPtr == '-')
{
ulNeg = 1;
pcPtr++;
}
else if(*pcPtr == '+')
{
pcPtr++;
}
//
// See if the radix was not specified, or is 16, and the value starts with
// "0x" or "0X" (to indicate a hex value).
//
if(((iBase == 0) || (iBase == 16)) && (*pcPtr == '0') &&
((pcPtr[1] == 'x') || (pcPtr[1] == 'X')))
{
//
// Skip the leading "0x".
//
pcPtr += 2;
//
// Set the radix to 16.
//
iBase = 16;
}
//
// See if the radix was not specified.
//
if(iBase == 0)
{
//
// See if the value starts with "0".
//
if(*pcPtr == '0')
{
//
// Values that start with "0" are assumed to be radix 8.
//
iBase = 8;
}
else
{
//
// Otherwise, the values are assumed to be radix 10.
//
iBase = 10;
}
}
//
// Loop while there are more valid digits to consume.
//
while(1)
{
//
// See if this character is a number.
//
if((*pcPtr >= '0') && (*pcPtr <= '9'))
{
//
// Convert the character to its integer equivalent.
//
ulDigit = *pcPtr++ - '0';
}
//
// Otherwise, see if this character is an upper case letter.
//
else if((*pcPtr >= 'A') && (*pcPtr <= 'Z'))
{
//
// Convert the character to its integer equivalent.
//
ulDigit = *pcPtr++ - 'A' + 10;
}
//
// Otherwise, see if this character is a lower case letter.
//
else if((*pcPtr >= 'a') && (*pcPtr <= 'z'))
{
//
// Convert the character to its integer equivalent.
//
ulDigit = *pcPtr++ - 'a' + 10;
}
//
// Otherwise, this is not a valid character.
//
else
{
//
// Stop converting this value.
//
break;
}
//
// See if this digit is valid for the chosen radix.
//
if(ulDigit >= iBase)
{
//
// Since this was not a valid digit, move the pointer back to the
// character that therefore should not have been consumed.
//
pcPtr--;
//
// Stop converting this value.
//
break;
}
//
// Add this digit to the converted value.
//
ulRet *= iBase;
ulRet += ulDigit;
//
// Since a digit has been added, this is now a valid result.
//
ulValid = 1;
}
//
// Set the return string pointer to the first character not consumed.
//
if(ppcStrRet)
{
*ppcStrRet = ulValid ? pcPtr : pcStr;
}
//
// Return the converted value.
//
return(ulNeg ? (0 - ulRet) : ulRet);
}
//*****************************************************************************
//
//! Finds a substring within a string.
//!
//! \param pcHaystack is a pointer to the string that will be searched.
//! \param pcNeedle is a pointer to the substring that is to be found within
//! \e pcHaystack.
//!
//! This function is very similar to the C library <tt>strstr()</tt> function.
//! It scans a string for the first instance of a given substring and returns
//! a pointer to that substring. If the substring cannot be found, a NULL
//! pointer is returned.
//!
//! \return Returns a pointer to the first occurrence of \e pcNeedle within
//! \e pcHaystack or NULL if no match is found.
//
//*****************************************************************************
char *
ustrstr(const char *pcHaystack, const char *pcNeedle)
{
unsigned long ulLength;
//
// Get the length of the string to be found.
//
ulLength = strlen(pcNeedle);
//
// Loop while we have not reached the end of the string.
//
while(*pcHaystack)
{
//
// Check to see if the substring appears at this position.
//
if(strncmp(pcNeedle, pcHaystack, ulLength) == 0)
{
//
// It does so return the pointer.
//
return((char *)pcHaystack);
}
//
// Move to the next position in the string being searched.
//
pcHaystack++;
}
//
// We reached the end of the string without finding the substring so
// return NULL.
//
return((char *)0);
}
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -