Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-libxively-6eca970 by
xi_helpers.c
00001 // Copyright (c) 2003-2013, LogMeIn, Inc. All rights reserved. 00002 // This is part of Xively C library, it is under the BSD 3-Clause license. 00003 00004 // This file also containes code from MINIX C library, which is under MINIX license 00005 // Copyright (c) 1987, 1997, 2006, Vrije Universiteit, Amsterdam, The Netherlands 00006 00007 /** 00008 * \file xi_helpers.c 00009 * \author Olgierd Humenczuk 00010 * \brief General helpers used by the library [see xi_helpers.h] 00011 */ 00012 00013 #include <string.h> 00014 #include <assert.h> 00015 00016 #include "xi_helpers.h" 00017 #include "xi_allocator.h" 00018 00019 char* xi_str_dup ( const char* s ) 00020 { 00021 // PRECONDITIONS 00022 assert( s != 0 ); 00023 00024 size_t len = strlen( s ); 00025 char * ret = xi_alloc( len + 1 ); 00026 if( ret == 0 ) { return 0; } 00027 memcpy( ret, s, len + 1 ); 00028 return ret; 00029 } 00030 00031 int xi_str_copy_untiln( char* dst, size_t dst_size, const char* src, char delim ) 00032 { 00033 // PRECONDITIONS 00034 assert( dst != 0 ); 00035 assert( dst_size > 1 ); 00036 assert( src != 0 ); 00037 00038 size_t counter = 0; 00039 size_t real_size = dst_size - 1; 00040 00041 while( *src != delim && counter < real_size && *src != '\0' ) 00042 { 00043 *dst++ = *src++; 00044 counter++; 00045 } 00046 00047 *dst = '\0'; 00048 return counter; 00049 } 00050 00051 // used by the xi_mktime 00052 #define YEAR0 1900 /* the first year */ 00053 #define EPOCH_YR 1970 /* EPOCH = Jan 1 1970 00:00:00 */ 00054 #define SECS_DAY (24L * 60L * 60L) 00055 #define LEAPYEAR(year) (!((year) % 4) && (((year) % 100) || !((year) % 400))) 00056 #define YEARSIZE(year) (LEAPYEAR(year) ? 366 : 365) 00057 #define FIRSTSUNDAY(timp) (((timp)->tm_yday - (timp)->tm_wday + 420) % 7) 00058 #define FIRSTDAYOF(timp) (((timp)->tm_wday - (timp)->tm_yday + 420) % 7) 00059 #define TIME_MAX ULONG_MAX 00060 #define ABB_LEN 3 00061 00062 // used by the xi_mktime 00063 static const int _ytab[2][12] = { 00064 { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, 00065 { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } }; 00066 00067 time_t xi_mktime(register struct tm *timep) 00068 { 00069 register long day, year; 00070 register int tm_year; 00071 int yday, month; 00072 register signed long seconds; 00073 int overflow; 00074 00075 timep->tm_min += timep->tm_sec / 60; 00076 timep->tm_sec %= 60; 00077 if (timep->tm_sec < 0) { 00078 timep->tm_sec += 60; 00079 timep->tm_min--; 00080 } 00081 timep->tm_hour += timep->tm_min / 60; 00082 timep->tm_min = timep->tm_min % 60; 00083 if (timep->tm_min < 0) { 00084 timep->tm_min += 60; 00085 timep->tm_hour--; 00086 } 00087 day = timep->tm_hour / 24; 00088 timep->tm_hour= timep->tm_hour % 24; 00089 if (timep->tm_hour < 0) { 00090 timep->tm_hour += 24; 00091 day--; 00092 } 00093 timep->tm_year += timep->tm_mon / 12; 00094 timep->tm_mon %= 12; 00095 if (timep->tm_mon < 0) { 00096 timep->tm_mon += 12; 00097 timep->tm_year--; 00098 } 00099 day += (timep->tm_mday - 1); 00100 while (day < 0) { 00101 if(--timep->tm_mon < 0) { 00102 timep->tm_year--; 00103 timep->tm_mon = 11; 00104 } 00105 day += _ytab[LEAPYEAR(YEAR0 + timep->tm_year)][timep->tm_mon]; 00106 } 00107 while (day >= _ytab[LEAPYEAR(YEAR0 + timep->tm_year)][timep->tm_mon]) { 00108 day -= _ytab[LEAPYEAR(YEAR0 + timep->tm_year)][timep->tm_mon]; 00109 if (++(timep->tm_mon) == 12) { 00110 timep->tm_mon = 0; 00111 timep->tm_year++; 00112 } 00113 } 00114 timep->tm_mday = day + 1; 00115 year = EPOCH_YR; 00116 if (timep->tm_year < year - YEAR0) return (time_t)-1; 00117 seconds = 0; 00118 day = 0; 00119 overflow = 0; 00120 00121 /* 00122 * Assume that when day becomes negative, there will certainly be overflow on seconds. 00123 * The check for overflow needs not to be done for leapyears divisible by 400. 00124 * The code only works when year (1970) is not a leapyear. 00125 */ 00126 #if EPOCH_YR != 1970 00127 #error EPOCH_YR != 1970 00128 #endif 00129 00130 tm_year = timep->tm_year + YEAR0; 00131 00132 if (LONG_MAX / 365 < tm_year - year) overflow++; 00133 day = (tm_year - year) * 365; 00134 if (LONG_MAX - day < (tm_year - year) / 4 + 1) overflow++; 00135 day += (tm_year - year) / 4 00136 + ((tm_year % 4) && tm_year % 4 < year % 4); 00137 day -= (tm_year - year) / 100 00138 + ((tm_year % 100) && tm_year % 100 < year % 100); 00139 day += (tm_year - year) / 400 00140 + ((tm_year % 400) && tm_year % 400 < year % 400); 00141 00142 yday = month = 0; 00143 while (month < timep->tm_mon) { 00144 yday += _ytab[LEAPYEAR(tm_year)][month]; 00145 month++; 00146 } 00147 yday += (timep->tm_mday - 1); 00148 if (day + yday < 0) overflow++; 00149 day += yday; 00150 00151 timep->tm_yday = yday; 00152 timep->tm_wday = (day + 4) % 7; 00153 00154 seconds = ( ( timep->tm_hour * 60L ) + timep->tm_min ) * 60L + timep->tm_sec; 00155 00156 if ( ( TIME_MAX - seconds ) / SECS_DAY < ( unsigned long ) day ) overflow++; 00157 seconds += day * SECS_DAY; 00158 00159 if ( overflow ) return ( time_t ) - 1; 00160 00161 if ( ( time_t ) seconds != seconds) return ( time_t ) - 1; 00162 return ( time_t ) seconds; 00163 } 00164 00165 struct tm* xi_gmtime( time_t* t ) 00166 { 00167 return gmtime( t ); 00168 } 00169 00170 char* xi_replace_with( 00171 char p, char r 00172 , char* buffer 00173 , size_t max_chars ) 00174 { 00175 char* c = buffer; 00176 00177 while( *c != '\0' && max_chars-- ) 00178 { 00179 if( *c == p ) { *c = r; } 00180 c++; 00181 } 00182 00183 return c; 00184 }
Generated on Wed Jul 13 2022 02:16:22 by
 1.7.2
 1.7.2 
    