📄 datetransfer.c
字号:
newDateRecordP->alarm->advance = 99;
}
}
}
#pragma mark ----------------------------
/************************************************************
*
* FUNCTION: GetToken
*
* DESCRIPTION: Extracts first available token from given
* string. Tokens are assumed to be separated by "white
* space", as used by the IsSpace() function.
*
* PARAMETERS:
* startP - str ptr from which to extract
* tokenP - str ptr where to store found token
*
* RETURNS: str ptr of where to start next token, or null if
* end of string is reached.
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* frigino 12/3/97 Stolen from rest of code & modified
*
*************************************************************/
static char* GetToken(char* startP, char* tokenP)
{
char c;
// Skip leading "blank space"
while (TxtCharIsSpace(*startP))
startP += TxtNextCharSize(startP, 0);
// DOLATER kwk - figure out if we need to worry about
// anything other than 7-bit ascii in this routine.
// Get first char
c = *startP;
// While char is not terminator, nor is it "blank space"
while (c != '\0' && !TxtCharIsSpace(c))
{
// Copy char to token
*tokenP++ = c;
// Advance to next char
c = *(++startP);
}
// Terminate token
*tokenP = '\0';
// Skip trailing "blank space"
if (c != '\0')
while (TxtCharIsSpace(*startP))
++startP;
// Return next token ptr
return ((*startP == '\0') ? NULL : startP);
}
/************************************************************
*
* FUNCTION: MatchDateTimeToken
*
* DESCRIPTION: Extract date and time from the given string,
* converting from GMT to local time if necessary.
*
* PARAMETERS:
* tokenP - string ptr from which to extract
* dateP - ptr where to store date (optional)
* timeP - ptr where to store time (optional)
*
* RETURNS: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* frigino 12/3/97 Stolen from rest of code & modified
* peter 3/29/00 Add support for universal time format, converting
* to local time based on current time zone settings.
*
*************************************************************/
static void MatchDateTimeToken(
const char* tokenP,
DateType* dateP,
TimeType* timeP)
{
char identifier[identifierLengthMax];
int nv;
DateType date;
TimeType time;
DateTimeType dateTime;
// Use identifier[] as a temp buffer to copy parts of the vCal DateTime
// so we can convert them to correct form. This date portion
// is 4 chars (date) + 2 chars (month) + 2 chars (day) = 8 chars long.
// Optional Z suffix for universal time yields total of 9 chars long.
// Get the date whether desired by caller or not. It must precede the time.
// Read the Year.
StrNCopy(identifier, tokenP, 4);
identifier[4] = nullChr;
nv = StrAToI(identifier);
// Validate the number and use it.
if (nv < firstYear || lastYear < nv)
nv = firstYear;
date.year = nv - firstYear;
tokenP += StrLen(identifier) * sizeof(char);
// Read the Month.
StrNCopy(identifier, tokenP, 2);
identifier[2] = nullChr;
nv = StrAToI(identifier);
// Validate the number and use it.
if (nv < 1 || 12 < nv)
nv = 1;
date.month = nv;
tokenP += StrLen(identifier) * sizeof(char);
// Read the Day.
StrNCopy(identifier, tokenP, 2);
identifier[2] = nullChr;
nv = StrAToI(identifier);
// Validate the number and use it.
if (nv < 1 || 31 < nv)
nv = 1;
date.day = nv;
tokenP += StrLen(identifier) * sizeof(char);
// Get the time whether desired by caller or not.
// Check to see if there is a time value, if so read it in,
// if not assume that the event has no time.
if (StrNCaselessCompare(tokenP, "T", StrLen("T")) != 0)
{
TimeToInt(time) = apptNoTime;
}
else
{
// Move over the time/date separator
tokenP = tokenP + sizeOf7BitChar('T');
// Read in the Hours
StrNCopy(identifier, tokenP, 2);
identifier[2] = nullChr;
nv = StrAToI(identifier);
// Validate the number and use it.
if (nv < 0 || 24 <= nv)
nv = 0;
time.hours = nv;
tokenP += StrLen(identifier) * sizeof(char);
// Read in Minutes
StrNCopy(identifier, tokenP, 2);
identifier[2] = nullChr;
nv = StrAToI(identifier);
// Validate the number and use it.
if (nv < 0 || 59 < nv)
nv = 1;
time.minutes = nv;
tokenP += StrLen(identifier) * sizeof(char);
// Skip the Seconds
tokenP += 2 * sizeof(char);
// Read the universal time indicator if present
if (StrNCaselessCompare(tokenP, "Z", StrLen("Z")) == 0)
{
// Convert the time as parsed from GMT to local time.
dateTime.year = date.year + firstYear;
dateTime.month = date.month;
dateTime.day = date.day;
dateTime.hour = time.hours;
dateTime.minute = time.minutes;
dateTime.second = 0;
TimSecondsToDateTime(TimUTCToTimeZone(TimDateTimeToSeconds(&dateTime),
PrefGetPreference(prefTimeZone),
PrefGetPreference(prefDaylightSavingAdjustment)),
&dateTime);
date.year = dateTime.year - firstYear;
date.month = dateTime.month;
date.day = dateTime.day;
time.hours = dateTime.hour;
time.minutes = dateTime.minute;
}
}
// Give the date and/or time to the caller.
if (dateP != NULL)
MemMove(dateP, &date, sizeof(date));
if (timeP != NULL)
MemMove(timeP, &time, sizeof(time));
}
/************************************************************
*
* FUNCTION: GenerateDateTimeToken
*
* DESCRIPTION: Print a date and time into a given string in
* the vCalendar 1.0 format.
*
* PARAMETERS:
* outputString - string ptr to write the output
* dateP - ptr to date to print (required)
* timeP - ptr to time to print (optional)
*
* RETURNS: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* peter 3/30/00 Initial Revision.
*
*************************************************************/
static void GenerateDateTimeToken(
char* outputString,
DateType* dateP,
TimeType* timeP)
{
#if GENERATE_UNIVERSAL_TIME_VCALENDARS
DateTimeType dateTime;
dateTime.year = dateP->year + firstYear;
dateTime.month = dateP->month;
dateTime.day = dateP->day;
if (timeP == NULL)
{
dateTime.hour = 0;
dateTime.minute = 0;
}
else
{
dateTime.hour = timeP->hours;
dateTime.minute = timeP->minutes;
}
dateTime.second = 0;
TimSecondsToDateTime(TimTimeZoneToGMT(TimDateTimeToSeconds(&dateTime),
PrefGetPreference(prefTimeZone),
PrefGetPreference(prefDaylightSavingAdjustment)),
&dateTime);
StrPrintF(outputString, "%d%02d%02dT%02d%02d00Z", dateTime.year, dateTime.month,
dateTime.day, dateTime.hour, dateTime.minute);
#else
if (timeP == NULL)
{
TraceOutput(TL(appErrorClass, "GenerateDateTimeToken: (if) %d%02d%02dT000000", firstYear + dateP->year, dateP->month, dateP->day));
StrPrintF(outputString, "%d%02d%02dT000000",
firstYear + dateP->year, dateP->month, dateP->day);
}
else
{
TraceOutput(TL(appErrorClass, "GenerateDateTimeToken: (else) %d%02d%02dT%02d%02d00", firstYear + dateP->year, dateP->month, dateP->day, timeP->hours, timeP->minutes));
StrPrintF(outputString, "%d%02d%02dT%02d%02d00",
firstYear + dateP->year, dateP->month, dateP->day,
timeP->hours, timeP->minutes);
}
#endif
}
/************************************************************
*
* FUNCTION: GenerateDateTimeTokenForSeconds
*
* DESCRIPTION: Print a date and time into a given string in
* the vCalendar 1.0 format.
*
* PARAMETERS:
* outputString - string ptr to write the output
* seconds - second count to print
*
* RETURNS: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* peter 3/30/00 Initial Revision.
*
*************************************************************/
static void GenerateDateTimeTokenForSeconds(
char* outputString,
UInt32 seconds)
{
DateTimeType dateTime;
#if GENERATE_UNIVERSAL_TIME_VCALENDARS
TimSecondsToDateTime(TimTimeZoneToGMT(seconds,
PrefGetPreference(prefTimeZone),
PrefGetPreference(prefDaylightSavingAdjustment)),
&dateTime);
StrPrintF(outputString, "%d%02d%02dT%02d%02d00Z", dateTime.year, dateTime.month,
dateTime.day, dateTime.hour, dateTime.minute);
#else
TimSecondsToDateTime(seconds, &dateTime);
StrPrintF(outputString, "%d%02d%02dT%02d%02d00", dateTime.year, dateTime.month,
dateTime.day, dateTime.hour, dateTime.minute);
#endif
}
/************************************************************
*
* FUNCTION: MatchWeekDayToken
*
* DESCRIPTION:
* Matches the given string to a week day value.
*
* === THE TOKEN STRING MUST BE CONVERTED TO LOWERCASE
* === BEFORE IT IS SENT TO THIS FUNCTION
*
* PARAMETERS:
* tokenP - string ptr from which to extract weekday
*
* RETURNS: the week day value (sunday -> saturday) or 255
* if token didnt match.
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* frigino 12/3/97 Original
*
*************************************************************/
static UInt8 MatchWeekDayToken(const char* tokenP)
{
// Token must already be converted to lower-case string
// Get 2-char token
UInt16 weekDay = *((UInt16*)tokenP);
// Find it
switch (weekDay)
{
case 'su':
return sunday;
break;
case 'mo':
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -