void log_message(char *message, ...) { /* Init variable argument list */ va_list la; va_start(la, message); /* Convert message to bstring for better manage */ bstring b_message = bfromcstr(message); int index = 0; bstring b_percent = bfromcstr("%"); if (syslog_flag || (verbose_flag && (NULL == format))){ /* Find each special char and replace with the correct arg */ while ( (index = binstr(b_message, index, b_percent)) != BSTR_ERR){ /* Find the type of value */ char type = b_message->data[++index]; if (type == 's'){ /* Get the next char* arg and replace it */ char *arg_char = va_arg (la, char *); bstring b_arg_char = bfromcstr(arg_char); breplace(b_message, index - 1, 2, b_arg_char, ' '); bdestroy(b_arg_char); }else if (type == 'd'){ /* Get the next int arg, cast in cstr, and replace it*/ int arg_int = va_arg (la, int); /* TODO: find the correct length of maxint */ char *str_int = (char *) malloc (15); sprintf(str_int, "%d", arg_int); bstring b_str_int = bfromcstr(str_int); breplace(b_message, index - 1, 2, b_str_int, ' '); bdestroy(b_str_int); }
CDString* CD_CharAtSet (CDString* self, size_t index, CDString* set) { assert(self); cd_MakeStringInternal(self); size_t offset = CD_UTF8_offset((const char*) self->raw->data, index); if (breplace(self->raw, offset, cd_UTF8_nextCharLength(self->raw->data[offset]), set->raw, '\0') == BSTR_OK) { cd_UpdateLength(self); } else { self = NULL; } return self; }
void createLine(int side, bstring base, bstring content, lineData lineMap, int * highlightMask) { if (lineMap.type == INFO) { content = bfromcstr(""); lineMap.lineNo = 0; } int position = 0; int needToCloseLastHighlightBeforeEscapingHTML = FALSE; if (highlightMask != NULL) { int lastState = MASK_SAME; int advanceBy; int i; int contentLen = content->slen; // Copy this because it will change as we work. for (i = 0; i < contentLen; i++) { advanceBy = 1; // Normally advance by one char. // Escape HTML as we go. if (content->data[position] == '&') { breplace(content, position, 1, bfromcstr("&"), ' '); advanceBy += 4; } else if (content->data[position] == '<') { breplace(content, position, 1, bfromcstr("<"), ' '); advanceBy += 3; } else if (content->data[position] == '>') { breplace(content, position, 1, bfromcstr(">"), ' '); advanceBy += 3; } if (highlightMask[i] != lastState) { if (highlightMask[i] == MASK_DIFFERENT) { binsert(content, position, bfromcstr("<em>"), ' '); advanceBy += 4; } else { binsert(content, position, bfromcstr("</em>"), ' '); advanceBy += 5; } } position += advanceBy; lastState = highlightMask[i]; } } // Escape HTML. // TODO: This can't possibly be good enough. bfindreplace(content, bfromcstr("&"), bfromcstr("&"), position); bfindreplace(content, bfromcstr("<"), bfromcstr("<"), position); bfindreplace(content, bfromcstr(">"), bfromcstr(">"), position); // Put something in blank lines. if (content->slen == 0) bcatcstr(content, " "); if (needToCloseLastHighlightBeforeEscapingHTML) { bcatcstr(content, "</em>"); } // TODO: there's a lot of string manipulation going on here. It might be // good for performance to call ballocmin and boost the base string size by // a big chunk. if (lineMap.lineNo >= 0 && lineMap.type != INFO) { char * lineNo = lineNumberString(lineMap.lineNo); bcatcstr(base, "<td class='line_number "); bcatcstr(base, typeString(lineMap.type)); bcatcstr(base, " "); bcatcstr(base, (side == LEFT) ? "left" : "right"); bcatcstr(base, "' width='*'>"); bcatcstr(base, lineNo); bcatcstr(base, "</td>\n"); bcatcstr(base, "<td class='line "); free(lineNo); } else { bcatcstr(base, "<td colspan='2' class='line "); } bstring whitespace; bcatcstr(base, typeString(lineMap.type)); bcatcstr(base, " "); bcatcstr(base, (side == LEFT) ? "left" : "right"); bcatcstr(base, "' width='49%'>"); bconcat(base, whitespace = getWhitespace(lineMap.leadingSpaces)); bconcat(base, content); bcatcstr(base, "</td>\n"); bdestroy(whitespace); }
/* * pico - the main routine for Pine's composer. * */ int pico(PICO *pm) { UCS c; register int f; register int n; char bname[NBUFN]; /* buffer name of file to read */ extern struct on_display ods; int checkpointcnt = 0, input = 0; int ret; char chkptfile[NLINE]; #ifdef _WINDOWS int cursor_shown; #endif Pmaster = pm; gmode = MDWRAP; gmode |= pm->pine_flags; /* high 4 bits rsv'd for pine */ alt_speller = pm->alt_spell; pico_all_done = 0; km_popped = 0; if(!vtinit()) /* Init Displays. */ return(COMP_CANCEL); strncpy(bname, "main", sizeof(bname)); /* default buffer name */ bname[sizeof(bname)-1] = '\0'; edinit(bname); /* Buffers, windows. */ if(InitMailHeader(pm)) /* init mail header structure */ gmode &= ~(P_BODY | P_HEADEND); /* flip off special header stuff */ /* setup to process commands */ lastflag = 0; /* Fake last flags. */ curbp->b_mode |= gmode; /* and set default modes*/ if(Pmaster->pine_anchor) pico_anchor = utf8_to_ucs4_cpystr(Pmaster->pine_anchor); else pico_anchor = NULL; if(Pmaster->quote_str) glo_quote_str = utf8_to_ucs4_cpystr(Pmaster->quote_str); else glo_quote_str = NULL; if(Pmaster->wordseps) glo_wordseps = ucs4_cpystr(Pmaster->wordseps); else glo_wordseps = NULL; bindtokey(DEL, (gmode & P_DELRUBS) ? forwdel : backdel); if(pm->msgtext) breplace(pm->msgtext); #ifdef _WINDOWS cursor_shown = mswin_showcaret(1); /* turn on for main window */ mswin_allowpaste(MSWIN_PASTE_FULL); mswin_setscrollcallback (pico_scroll_callback); #endif /* prepare for checkpointing */ chkptfile[0] = '\0'; chkptinit((*Pmaster->ckptdir)(chkptfile, sizeof(chkptfile)), sizeof(chkptfile)); if(gmode & P_CHKPTNOW) writeout(chkptfile, TRUE); pico_all_done = setjmp(finstate); /* jump out of HUP handler ? */ if(gmode & MDALTNOW){ while(!pico_all_done){ if(((gmode & P_BODY) || !Pmaster->headents) && alt_editor(0, 1) < 0) break; /* if problem, drop into pico */ if(Pmaster->headents){ update(); /* paint screen, n' start editing... */ HeaderEditor((gmode & (P_HEADEND | P_BODY)) ? 2 : 0, 0); gmode |= P_BODY; /* make sure we enter alt ed next */ } else pico_all_done = COMP_EXIT; } } else if(!pico_all_done){ if(gmode & P_BODY){ /* begin editing the header? */ ArrangeHeader(); /* line up pointers */ /* * Move to the offset pine asked us to move to. * Perhaps we should be checking to see if this is * a reasonable number before moving. */ if(Pmaster && Pmaster->edit_offset) forwchar(FALSE, Pmaster->edit_offset); } else{ update(); /* paint screen, */ HeaderEditor((gmode & P_HEADEND) ? 2 : 0, 0); } } while(1){ if(pico_all_done){ #ifdef _WINDOWS if(!cursor_shown) mswin_showcaret(0); mswin_allowpaste(MSWIN_PASTE_DISABLE); mswin_setscrollcallback (NULL); #endif ret = anycb() ? BUF_CHANGED : 0; switch(pico_all_done){ /* prepare for/handle final events */ case COMP_EXIT : /* already confirmed */ packheader(); if(Pmaster && (Pmaster->strip_ws_before_send || Pmaster->allow_flowed_text)) cleanwhitespace(); ret |= COMP_EXIT; break; case COMP_CANCEL : /* also already confirmed */ packheader(); ret = COMP_CANCEL; break; case COMP_GOTHUP: /* * pack up and let caller know that we've received a SIGHUP */ if(ComposerEditing) /* expand addr if needed */ call_builder(&headents[ods.cur_e], NULL, NULL); packheader(); ret |= COMP_GOTHUP; break; case COMP_SUSPEND : default: /* safest if internal error */ /* * If we're in the headers mark the current header line * with start_here bit so caller knows where to reset. * Also set the edit_offset, which is either the offset * into this header line or the offset into the body. * Packheader will adjust edit_offset for multi-line * headers. */ if(ComposerEditing){ /* in the headers */ headents[ods.cur_e].start_here = 1; Pmaster->edit_offset = ods.p_ind; } else{ register LINE *clp; register long offset; for(clp = lforw(curbp->b_linep), offset = 0L; clp != curwp->w_dotp; clp = lforw(clp)) offset += (llength(clp) + 1); Pmaster->edit_offset = offset + curwp->w_doto; } packheader(); ret |= COMP_SUSPEND; break; } if(pico_anchor) fs_give((void **) &pico_anchor); if(glo_quote_str) fs_give((void **) &glo_quote_str); if(glo_wordseps) fs_give((void **) &glo_wordseps); vttidy(); /* clean up tty modes */ zotdisplay(); /* blast display buffers */ zotedit(); our_unlink(chkptfile); Pmaster = NULL; /* blat global */ return(ret); } if(km_popped){ km_popped--; if(km_popped == 0) /* cause bottom three lines to be repainted */ curwp->w_flag |= WFHARD; } if(km_popped){ /* temporarily change to cause menu to be painted */ term.t_mrow = 2; curwp->w_ntrows -= 2; curwp->w_flag |= WFMODE; movecursor(term.t_nrow-2, 0); /* clear status line, too */ peeol(); } update(); /* Fix up the screen */ if(km_popped){ term.t_mrow = 0; curwp->w_ntrows += 2; } #ifdef MOUSE #ifdef EX_MOUSE /* New mouse function for real mouse text seletion. */ register_mfunc(mouse_in_pico, 2, 0, term.t_nrow - (term.t_mrow+1), term.t_ncol); #else mouse_in_content(KEY_MOUSE, -1, -1, -1, 0); register_mfunc(mouse_in_content, 2, 0, term.t_nrow - (term.t_mrow + 1), term.t_ncol); #endif #endif #ifdef _WINDOWS mswin_setdndcallback (composer_file_drop); mswin_mousetrackcallback(pico_cursor); #endif c = GetKey(); if (term.t_nrow < 6 && c != NODATA){ (*term.t_beep)(); emlwrite(_("Please make the screen bigger."), NULL); continue; } #ifdef MOUSE #ifdef EX_MOUSE clear_mfunc(mouse_in_pico); #else clear_mfunc(mouse_in_content); #endif #endif #ifdef _WINDOWS mswin_cleardndcallback (); mswin_mousetrackcallback(NULL); #endif if(c == NODATA || time_to_check()){ /* new mail ? */ if((*Pmaster->newmail)(c == NODATA ? 0 : 2, 1) >= 0){ int rv; if(km_popped){ term.t_mrow = 2; curwp->w_ntrows -= 2; curwp->w_flag |= WFHARD; km_popped = 0; } clearcursor(); mlerase(); rv = (*Pmaster->showmsg)(c); ttresize(); picosigs(); /* restore altered handlers */ if(rv) /* Did showmsg corrupt the display? */ PaintBody(0); /* Yes, repaint */ mpresf = 1; input = 0; } clearcursor(); movecursor(0, 0); } if(km_popped) switch(c){ case NODATA: case (CTRL|'L'): km_popped++; break; default: mlerase(); break; } if(c == NODATA) /* no op, getkey timed out */ continue; else if(!input++) (*Pmaster->keybinput)(); if (mpresf != FALSE) { /* message stay around only */ if (mpresf++ > NMMESSDELAY) /* so long! */ mlerase(); } f = FALSE; /* vestigial */ n = 1; /* Do it. */ execute(normalize_cmd(c, pfkm, 2), f, n); if(++checkpointcnt >= CHKPTDELAY){ checkpointcnt = 0; writeout(chkptfile, TRUE); } } }