static MsgInfo *news_parse_xover(struct newsnntp_xover_resp_item *item) { MsgInfo *msginfo; /* set MsgInfo */ msginfo = procmsg_msginfo_new(); msginfo->msgnum = item->ovr_article; msginfo->size = item->ovr_size; msginfo->date = g_strdup(item->ovr_date); msginfo->date_t = procheader_date_parse(NULL, item->ovr_date, 0); msginfo->from = conv_unmime_header(item->ovr_author, NULL, TRUE); msginfo->fromname = procheader_get_fromname(msginfo->from); msginfo->subject = conv_unmime_header(item->ovr_subject, NULL, TRUE); remove_return(msginfo->from); remove_return(msginfo->fromname); remove_return(msginfo->subject); if (item->ovr_message_id) { gchar *tmp = g_strdup(item->ovr_message_id); extract_parenthesis(tmp, '<', '>'); remove_space(tmp); if (*tmp != '\0') msginfo->msgid = g_strdup(tmp); g_free(tmp); } /* FIXME: this is a quick fix; references' meaning was changed * into having the actual list of references in the References: header. * We need a GSList here, so msginfo_free() and msginfo_copy() can do * their things properly. */ if (item->ovr_references && *(item->ovr_references)) { gchar **ref_tokens = g_strsplit(item->ovr_references, " ", -1); guint i = 0; char *tmp; char *p; while (ref_tokens[i]) { gchar *cur_ref = ref_tokens[i]; msginfo->references = references_list_append(msginfo->references, cur_ref); i++; } g_strfreev(ref_tokens); tmp = g_strdup(item->ovr_references); eliminate_parenthesis(tmp, '(', ')'); if ((p = strrchr(tmp, '<')) != NULL) { extract_parenthesis(p, '<', '>'); remove_space(p); if (*p != '\0') msginfo->inreplyto = g_strdup(p); } g_free(tmp); } return msginfo; }
void edit_select_rep::raw_cut (path p1, path p2) { if (p2 == p1) return; path p = common (p1, p2); tree t = subtree (et, p); int n = N(p); int i1= p1[n]; int i2= p2[n]; if (is_document (t) || is_concat (t)) { path q1= copy (p); q1 << path (i1, end (t[i1])); path q2= copy (p); q2 << path (i2, start (t[i2])); raw_cut (q2, p2); if (i2>i1+1) remove (p * (i1+1), i2-i1-1); raw_cut (p1, q1); if (is_concat (t)) correct_concat (p); else remove_return (p * i1); return; } if (is_func (t, TFORMAT) || is_func (t, TABLE) || is_func (t, ROW)) { path fp= ::table_search_format (et, p); tree st= subtree (et, fp); int row1, col1, row2, col2; table_search_coordinates (st, tail (p1, N(fp)), row1, col1); table_search_coordinates (st, tail (p2, N(fp)), row2, col2); if (row1>row2) { int tmp= row1; row1= row2; row2= tmp; } if (col1>col2) { int tmp= col1; col1= col2; col2= tmp; } int i, j; for (i=row1; i<=row2; i++) for (j=col1; j<=col2; j++) { path cp= fp * ::table_search_cell (st, i, j); if (is_func (subtree (et, cp), CELL, 1)) cp= cp * 0; assign (cp, ""); } path cp= fp * ::table_search_cell (st, row1, col1); go_to (cp * path (0, 0)); if (is_func (st, TFORMAT)) table_del_format (fp, row1+1, col1+1, row2+1, col2+1, ""); return; } if (is_compound (t) && (!is_format (t))) { assign (p, ""); return; } if ((N(p1) != (N(p)+1)) || (N(p2) != (N(p)+1))) { cerr << "t = " << t << "\n"; cerr << "p = " << p << "\n"; cerr << "p1= " << p1 << "\n"; cerr << "p2= " << p2 << "\n"; FAILED ("invalid cut"); } if (is_atomic (t)) { int pos= last_item (p1); int nr = last_item (p2)-pos; if (nr>0) remove (p1, nr); } else { if ((last_item (p1) != 0) || (last_item (p2) != 1)) { cerr << "t = " << t << "\n"; cerr << "p = " << p << "\n"; cerr << "p1= " << p1 << "\n"; cerr << "p2= " << p2 << "\n"; FAILED ("invalid object cut"); } assign (p, ""); } }