int main (int argc, char **argv) { int i; test_init (argc, argv, NULL); debug_printf (1, "Good dates:\n"); for (i = 0; i < G_N_ELEMENTS (good_dates); i++) check_good (good_dates[i].format, good_dates[i].date); debug_printf (1, "\nOK dates:\n"); for (i = 0; i < G_N_ELEMENTS (ok_dates); i++) check_ok (ok_dates[i], make_date (ok_dates[i])); check_ok (TIME_T_STRING, soup_date_new_from_time_t (TIME_T)); debug_printf (1, "\nBad dates:\n"); for (i = 0; i < G_N_ELEMENTS (bad_dates); i++) check_bad (bad_dates[i], make_date (bad_dates[i])); debug_printf (1, "\nConversions:\n"); for (i = 0; i < G_N_ELEMENTS (conversions); i++) check_conversion (&conversions[i] ); test_cleanup (); return errors != 0; }
static void check_good (SoupDateFormat format, const char *strdate) { SoupDate *date; char *strdate2; date = make_date (strdate); if (date) strdate2 = soup_date_to_string (date, format); if (!check_ok (strdate, date)) return; if (strcmp (strdate, strdate2) != 0) { debug_printf (1, " restringification failed: '%s' -> '%s'\n", strdate, strdate2); errors++; } g_free (strdate2); }
static SwItem * make_item (SwVimeoItemView *item_view, SwService *service, RestXmlNode *video_n) { SwItem *item; item = sw_item_new (); sw_item_set_service (item, service); sw_item_put (item, "id", rest_xml_node_find (video_n, "url")->content); sw_item_put (item, "url", rest_xml_node_find (video_n, "url")->content); sw_item_put (item, "title", rest_xml_node_find (video_n, "title")->content); sw_item_put (item, "author", rest_xml_node_find (video_n, "user_name")->content); sw_item_take (item, "date", make_date (rest_xml_node_find (video_n, "upload_date")->content)); sw_item_request_image_fetch (item, FALSE, "thumbnail", rest_xml_node_find (video_n, "thumbnail_medium")->content); sw_item_request_image_fetch (item, FALSE, "authoricon", rest_xml_node_find (video_n, "user_portrait_medium")->content); return item; }
Result Date::parse_string( Date::date_t* date, const Ustring& str_date ) { char c_cur; unsigned int num[ 4 ] = { 0, 0, 0, 0 }; // fourth int is for trailing spaces int i( 0 ); for( unsigned j = 0; j < str_date.size(); j++ ) { c_cur = str_date[ j ]; switch( c_cur ) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if( i > 2 ) return INVALID; num[ i ] *= 10; num[ i ] += ( c_cur - '0' ); break; case ' ': if( num[ i ] > 0 ) i++; break; case '.': case '-': case '/': if( num[ i ] == 0 || i == 2 ) return INVALID; else i++; break; default: return INVALID; } } if( num[ 2 ] ) // temporal { unsigned int year( 0 ); unsigned int month( 0 ); unsigned int day( 0 ); if( num[ 0 ] > 31 && num[ 1 ] <= 12 && num[ 2 ] <= 31 ) // YMD { year = num[ 0 ]; month = num[ 1 ]; day = num[ 2 ]; } else { if( num[ 0 ] <= 12 && num[ 1 ] <= 12 ) // both DMY and MDY possible { if( s_date_format_order[ 0 ] == 'M' ) { month = num[ 0 ]; day = num[ 1 ]; } else { day = num[ 0 ]; month = num[ 1 ]; } } else if( num[ 0 ] <= 31 && num[ 1 ] <= 12 ) // DMY { month = num[ 1 ]; day = num[ 0 ]; } else if( num[ 0 ] <= 12 && num[ 1 ] <= 31 ) // MDY { month = num[ 1 ]; day = num[ 0 ]; } else return INVALID; year = num[ 2 ]; if( year < 100 ) year += ( year < 30 ? 2000 : 1900 ); } if( year < YEAR_MIN || year > YEAR_MAX ) return OUT_OF_RANGE; Date date_tmp( year, month, day ); if( ! date_tmp.is_valid() ) // checks days in month return INVALID; if( date ) // pass NULL when just used for checking *date = date_tmp.m_date; } else if( num[ 1 ] ) // ordinal { if( num[ 0 ] > CHAPTER_MAX || num[ 1 ] > ORDER_MAX ) return OUT_OF_RANGE; if( date ) // pass NULL when just used for checking *date = make_date( num[ 0 ], num[ 1 ] ); } else return INVALID; return OK; }
static void check_conversion (const struct conversion *conv) { SoupDate *date; char *str; debug_printf (2, "%s\n", conv->source); date = make_date (conv->source); if (!date) { debug_printf (1, " date parsing failed for '%s'.\n", conv->source); errors++; return; } str = soup_date_to_string (date, SOUP_DATE_HTTP); if (!str || strcmp (str, conv->http) != 0) { debug_printf (1, " conversion of '%s' to HTTP failed:\n" " wanted: %s\n got: %s\n", conv->source, conv->http, str ? str : "(null)"); errors++; } g_free (str); str = soup_date_to_string (date, SOUP_DATE_COOKIE); if (!str || strcmp (str, conv->cookie) != 0) { debug_printf (1, " conversion of '%s' to COOKIE failed:\n" " wanted: %s\n got: %s\n", conv->source, conv->cookie, str ? str : "(null)"); errors++; } g_free (str); str = soup_date_to_string (date, SOUP_DATE_RFC2822); if (!str || strcmp (str, conv->rfc2822) != 0) { debug_printf (1, " conversion of '%s' to RFC2822 failed:\n" " wanted: %s\n got: %s\n", conv->source, conv->rfc2822, str ? str : "(null)"); errors++; } g_free (str); str = soup_date_to_string (date, SOUP_DATE_ISO8601_COMPACT); if (!str || strcmp (str, conv->compact) != 0) { debug_printf (1, " conversion of '%s' to COMPACT failed:\n" " wanted: %s\n got: %s\n", conv->source, conv->compact, str ? str : "(null)"); errors++; } g_free (str); str = soup_date_to_string (date, SOUP_DATE_ISO8601_FULL); if (!str || strcmp (str, conv->full) != 0) { debug_printf (1, " conversion of '%s' to FULL failed:\n" " wanted: %s\n got: %s\n", conv->source, conv->full, str ? str : "(null)"); errors++; } g_free (str); str = soup_date_to_string (date, SOUP_DATE_ISO8601_XMLRPC); if (!str || strcmp (str, conv->xmlrpc) != 0) { debug_printf (1, " conversion of '%s' to XMLRPC failed:\n" " wanted: %s\n got: %s\n", conv->source, conv->xmlrpc, str ? str : "(null)"); errors++; } g_free (str); soup_date_free (date); }
static MojitoItem * make_item (MojitoServiceTwitter *twitter, RestXmlNode *node) { MojitoServiceTwitterPrivate *priv = twitter->priv; MojitoItem *item; RestXmlNode *u_node, *n; const char *post_id, *user_id, *user_name, *date, *content; char *url; GMatchInfo *match_info; u_node = rest_xml_node_find (node, "user"); user_id = rest_xml_node_find (u_node, "id")->content; /* For friend only feeds, ignore our own tweets */ if (priv->type == FRIENDS && user_id && g_str_equal (user_id, priv->user_id)) { return NULL; } item = mojito_item_new (); mojito_item_set_service (item, (MojitoService *)twitter); post_id = rest_xml_node_find (node, "id")->content; mojito_item_put (item, "authorid", user_id); url = g_strdup_printf ("http://twitter.com/%s/statuses/%s", user_id, post_id); mojito_item_put (item, "id", url); mojito_item_take (item, "url", url); user_name = rest_xml_node_find (node, "name")->content; mojito_item_put (item, "author", user_name); content = rest_xml_node_find (node, "text")->content; if (g_regex_match (priv->twitpic_re, content, 0, &match_info)) { char *twitpic_id, *new_content; /* Construct the thumbnail URL and download the image */ twitpic_id = g_match_info_fetch (match_info, 1); url = g_strconcat ("http://twitpic.com/show/thumb/", twitpic_id, NULL); mojito_item_request_image_fetch (item, FALSE, "thumbnail", url); g_free (url); /* Remove the URL from the tweet and use that as the title */ new_content = g_regex_replace (priv->twitpic_re, content, -1, 0, "", 0, NULL); cleanup_twitpic (new_content); mojito_item_take (item, "title", new_content); /* Update the URL to point at twitpic */ url = g_strconcat ("http://twitpic.com/", twitpic_id, NULL); mojito_item_take (item, "url", url); g_free (twitpic_id); } mojito_item_put (item, "content", content); g_match_info_free (match_info); date = rest_xml_node_find (node, "created_at")->content; mojito_item_take (item, "date", make_date (date)); n = rest_xml_node_find (u_node, "location"); if (n && n->content) mojito_item_put (item, "location", n->content); n = rest_xml_node_find (u_node, "profile_image_url"); if (n && n->content) mojito_item_request_image_fetch (item, FALSE, "authoricon", n->content); return item; }