char ICACHE_FLASH_ATTR * combine_env_strings(char *temp, char * humi) { char *ptr; ptr = combine_strings("T:", temp); ptr = combine_strings(ptr, "*C H:"); ptr = combine_strings(ptr, humi); ptr = combine_strings(ptr, "%"); return ptr; }
/* * Name: define_diff * Purpose: get info needed to initialize diff * Date: October 31, 1992 * Passed: window: pointer to current window * Notes: allow the user to start the diff at the beginning of the * file or at the current cursor location. once the diff * has been defined, the user may press one key to diff again. * user may diff any two visible windows on the screen. */ int define_diff( WINDOW *window ) { int rc; char temp[MAX_COLS]; int num1; int let1; int num2; int let2; int start; char line_buff[(MAX_COLS+1)*2]; /* buffer for char and attribute */ char buff[MAX_COLS*2]; /* buffer for char and attribute */ /* * get window number and letter of the first diff window. then, * verify that window - does it exit? is it visible? */ *temp = '\0'; rc = get_name( diff_prompt1, window->bottom_line, temp, g_display.message_color ); if (rc == OK) { rc = verify_number( temp, &num1 ); if (rc == OK) rc = verify_letter( temp, &let1, &diff.w1 ); } else return( ERROR ); if (rc == ERROR) { combine_strings( buff, diff_prompt6a, temp, diff_prompt6b ); error( WARNING, window->bottom_line, buff ); return( ERROR ); } /* * get and verify the next window number and letter to diff. */ *temp = '\0'; rc = get_name( diff_prompt2, window->bottom_line, temp, g_display.message_color ); if (rc == OK) { rc = verify_number( temp, &num2 ); if (rc == OK) rc = verify_letter( temp, &let2, &diff.w2 ); } else return( ERROR ); if (rc == ERROR) { combine_strings( buff, diff_prompt6a, temp, diff_prompt6b ); error( WARNING, window->bottom_line, buff ); return( ERROR ); } /* * are leading spaces significant? */ save_screen_line( 0, window->bottom_line, line_buff ); set_prompt( diff_prompt7a, window->bottom_line ); start = get_yn( ); restore_screen_line( 0, window->bottom_line, line_buff ); if (start != ERROR) diff.leading = start == A_YES ? TRUE : FALSE; else return( ERROR ); /* * are all spaces significant? */ save_screen_line( 0, window->bottom_line, line_buff ); set_prompt( diff_prompt7b, window->bottom_line ); start = get_yn( ); restore_screen_line( 0, window->bottom_line, line_buff ); if (start != ERROR) { if (start == A_YES) diff.leading = diff.all_space = TRUE; else diff.all_space = FALSE; } else return( ERROR ); /* * are blank lines significant? */ save_screen_line( 0, window->bottom_line, line_buff ); set_prompt( diff_prompt7c, window->bottom_line ); start = get_yn( ); restore_screen_line( 0, window->bottom_line, line_buff ); if (start != ERROR) diff.blank_lines = start == A_YES ? TRUE : FALSE; else return( ERROR ); /* * is end of line significant? */ save_screen_line( 0, window->bottom_line, line_buff ); set_prompt( diff_prompt7d, window->bottom_line ); start = get_yn( ); restore_screen_line( 0, window->bottom_line, line_buff ); if (start != ERROR) diff.ignore_eol = start == A_YES ? TRUE : FALSE; else return( ERROR ); /* * now, find out were to start the diff -- beginning of file or * current cursor location. */ save_screen_line( 0, window->bottom_line, line_buff ); set_prompt( diff_prompt3, window->bottom_line ); start = get_bc( ); restore_screen_line( 0, window->bottom_line, line_buff ); if (start != ERROR) { entab_linebuff( ); if (un_copy_line( window->ll, window, TRUE ) == ERROR) return( ERROR ); /* * if everything is everything, initialize the diff pointers. */ diff.defined = TRUE; if (start == BEGINNING) { diff.d1 = diff.w1->file_info->line_list; diff.d2 = diff.w2->file_info->line_list; diff.rline1 = 1L; diff.rline2 = 1L; diff.bin_offset1 = 0; diff.bin_offset2 = 0; rc = differ( 0, 0, window->bottom_line ); } else { diff.d1 = diff.w1->ll; diff.d2 = diff.w2->ll; diff.rline1 = diff.w1->rline; diff.rline2 = diff.w2->rline; diff.bin_offset1 = diff.w1->bin_offset; diff.bin_offset2 = diff.w2->bin_offset; rc = differ( diff.w1->rcol, diff.w2->rcol, window->bottom_line ); } } return( rc ); }
char *make_rwait_freq_graph( int *rc, char *url, char *style, int ssl, struct fetch_status *fetch) { int event, off, cases, spot, heaps; char *result = 0, *title = 0; float *waitfreq = 0, *bracket = 0, span, delta, dmin= 0.0, dmax = 0.0; struct ckpt_chain *walk, *prev = 0; struct chart_options *chopt = 0; heaps = GR_FREQ_BRACKETS; title = combine_strings( rc, GR_FR_RWAIT_TITLE_LEAD, url); if( *rc == RC_NORMAL) { if( ssl) event = EVENT_SSL_NET_READ; else event = EVENT_READ_PACKET; cases = 0; prev = 0; for( walk = fetch->checkpoint; walk; walk = walk->next) { if( walk->event == event && walk->detail) { if( prev) { delta = calc_time_difference( &prev->clock, &walk->clock, fetch->clock_res); if( !cases) dmin = dmax = delta; if( delta < dmin) dmin = delta; if( delta > dmax) dmax = delta; cases++; } prev = walk; } } /* printf( "<!-- dbg:: RWFR: cases:%d min:%f max:%f -->\n", cases, dmin, dmax); */ bracket = (float *) malloc( heaps * (sizeof *bracket)); waitfreq = (float *) malloc( heaps * (sizeof *waitfreq)); if( !bracket || !waitfreq) *rc = ERR_MALLOC_FAILED; else { for( off = 0; off < heaps; off++) *(waitfreq + off) = 0.0; if( dmax == dmin) { *bracket = dmin; *waitfreq = cases; heaps = 1; } else { span = (dmax - dmin) / heaps; /* printf( "<!-- dbg:: RWFR: brackets:%d span:%f -->\n", heaps, span); */ *bracket = dmin + (span / 2); for( off = 1; off < heaps; off++) *(bracket + off) = *(bracket + off - 1) + span; prev = 0; for( walk = fetch->checkpoint; walk; walk = walk->next) { if( walk->event == event && walk->detail) { if( prev) { delta = calc_time_difference( &prev->clock, &walk->clock, fetch->clock_res); spot = (delta - dmin) / span; if( spot >= heaps ) spot = heaps - 1; *(waitfreq + spot) += 1; } prev = walk; } } spot = 0; for( off = 0; off < heaps; off++) { if( *(waitfreq + off) > 0.0) { *(waitfreq + spot) = *(waitfreq + off); *(bracket + spot) = *(bracket + off); spot++; } } heaps = spot; if( !heaps) heaps = 1; /* for( off = 0; off < heaps; off++) { printf( "!<-- dbg:: RWFR: data: %d. %f %f -->\n", off, *(bracket + off), *(waitfreq + off)); } */ } } chopt = alloc_chart_options(); if( !chopt ) *rc = ERR_MALLOC_FAILED; else chopt->ymin_soft = 0; result = hf_generate_graph( rc, heaps, bracket, waitfreq, style, title, GR_FR_RWAIT_XAX_TITLE, GR_FR_RWAIT_YAX_TITLE, chopt); } if( title) free( title); if( waitfreq) free( waitfreq); if( bracket) free( bracket); if( chopt) free_chart_options( chopt); return( result); }
char *make_psize_freq_graph( int *rc, char *url, char *style, int ssl, struct fetch_status *fetch) { int event, dlen, dmin, dmax, off, cases, spot, heaps; char *result = 0, *title = 0; float *psfreq = 0, *bracket = 0, span; struct ckpt_chain *walk; struct chart_options *chopt = 0; heaps = GR_FREQ_BRACKETS; title = combine_strings( rc, GR_FR_PSIZE_TITLE_LEAD, url); if( *rc == RC_NORMAL) { if( ssl) event = EVENT_SSL_NET_READ; else event = EVENT_READ_PACKET; cases = 0; for( walk = fetch->checkpoint; walk; walk = walk->next) { if( walk->event == event && walk->detail) { dlen = walk->detail->len; if( !cases) dmin = dmax = dlen; if( dlen < dmin) dmin = dlen; if( dlen > dmax) dmax = dlen; cases++; } } /* printf( "dbg:: PSFR: cases:%d min:%d max:%d\n", cases, dmin, dmax); */ bracket = (float *) malloc( heaps * (sizeof *bracket)); psfreq = (float *) malloc( heaps * (sizeof *psfreq)); if( !bracket || !psfreq) *rc = ERR_MALLOC_FAILED; else { for( off = 0; off < heaps; off++) *(psfreq + off) = 0.0; if( dmax == dmin) { *bracket = dmin; *psfreq = cases; heaps = 1; } else { span = ((float) (dmax - dmin)) / heaps; /* printf( "dbg:: PSFR: brackets:%d span:%f\n", heaps, span); */ *bracket = dmin + (span / 2); for( off = 1; off < heaps; off++) *(bracket + off) = *(bracket + off - 1) + span; for( walk = fetch->checkpoint; walk; walk = walk->next) { if( walk->event == event && walk->detail) { dlen = walk->detail->len; spot = (dlen - dmin) / span; if( spot >= heaps ) spot = heaps - 1; *(psfreq + spot) += 1; } } spot = 0; for( off = 0; off < heaps; off++) { if( *(psfreq + off) > 0.0) { *(psfreq + spot) = *(psfreq + off); *(bracket + spot) = *(bracket + off); spot++; } } heaps = spot; if( !heaps) heaps = 1; /* for( off = 0; off < heaps; off++) { printf( "dbg:: PSFR: data: %d. %f %f\n", off, *(bracket + off), *(psfreq + off)); } */ } } chopt = alloc_chart_options(); if( !chopt ) *rc = ERR_MALLOC_FAILED; else chopt->ymin_soft = 0; result = hf_generate_graph( rc, heaps, bracket, psfreq, style, title, GR_FR_PSIZE_XAX_TITLE, GR_FR_PSIZE_YAX_TITLE, chopt); } if( title) free( title); if( psfreq) free( psfreq); if( bracket) free( bracket); if( chopt) free_chart_options( chopt); return( result); }
char *make_accdata_graph( int *rc, char *url, char *style, int ssl, struct fetch_status *fetch) { int event, cases, off; long accumulate = 0; char *result = 0, *title = 0, *mst_type = 0; float *elap = 0, *recbytes = 0, delta; struct ckpt_chain *stime, *walk; struct chart_options *chopt = 0; struct milestone *mstone = 0, *curr = 0, *last = 0; title = combine_strings( rc, GR_ACCDAT_TITLE_LEAD, url); if( *rc == RC_NORMAL) { if( ssl) event = EVENT_SSL_NET_READ; else event = EVENT_READ_PACKET; cases = 0; for( walk = fetch->checkpoint; walk; walk = walk->next) if( walk->event == event && walk->detail) cases++; cases++; } if( *rc == RC_NORMAL && cases < GR_MIN_CASES) { result = strdup( GR_PACK_NOGRAPH); if( !result) *rc = ERR_MALLOC_FAILED; } else if( *rc == RC_NORMAL) { elap = (float *) malloc( cases * (sizeof *elap)); recbytes = (float *) malloc( cases * (sizeof *recbytes)); if( !elap || !recbytes) *rc = ERR_MALLOC_FAILED; else { *elap = 0; *recbytes = 0; off = 1; stime = fetch->checkpoint; for( walk = fetch->checkpoint; walk; walk = walk->next) { if( walk->event == event && walk->detail) { delta = calc_time_difference( &stime->clock, &walk->clock, fetch->clock_res); *(elap + off) = delta; accumulate += walk->detail->len; *(recbytes + off) = accumulate; off++; } } chopt = alloc_chart_options(); if( !chopt ) *rc = ERR_MALLOC_FAILED; else { for( walk = fetch->checkpoint; walk && *rc == RC_NORMAL; walk = walk->next) { if( walk->event == EVENT_DNS_LOOKUP) mst_type = MSTONE_DNS; else if( walk->event == EVENT_CONNECT_SERVER) mst_type = MSTONE_CONN; else if( walk->event == EVENT_SSL_HANDSHAKE) mst_type = MSTONE_SSL; else if( walk->event == EVENT_REQUEST_SENT) mst_type = MSTONE_SEND; else if( walk->event == EVENT_FIRST_RESPONSE) mst_type = MSTONE_1STREAD; else if( walk->event == EVENT_READ_ALL_DATA) mst_type = MSTONE_ALLDATA; else mst_type = 0; if( mst_type) { curr = (struct milestone *) malloc( sizeof *curr); if( !curr) *rc = ERR_MALLOC_FAILED; else { if( !mstone) chopt->mstone = mstone = curr; if( last) last->next = curr; curr->offset = calc_time_difference( &stime->clock, &walk->clock, fetch->clock_res); curr->label = strdup( mst_type); curr->next = 0; last = curr; } } } } } result = hf_generate_graph( rc, cases, elap, recbytes, style, title, GR_ACCDAT_XAX_TITLE, GR_ACCDAT_YAX_TITLE, chopt); } if( title) free( title); if( elap) free( elap); if( recbytes) free( recbytes); if( chopt) free_chart_options( chopt); return( result); }
char *make_packet_graph( int *rc, char *url, char *style, int ssl, struct fetch_status *fetch) { int event, cases, off; char *result = 0, *title = 0; float *elap = 0, *psize = 0, delta; struct chart_options *chopt = 0; struct ckpt_chain *stime, *walk; ENTER( "make_packet_graph" ) title = combine_strings( rc, GR_PACK_TITLE_LEAD, url); if( *rc == RC_NORMAL) { if( ssl) event = EVENT_SSL_NET_READ; else event = EVENT_READ_PACKET; cases = 0; for( walk = fetch->checkpoint; walk; walk = walk->next) if( walk->event == event && walk->detail) cases++; } if( *rc == RC_NORMAL && cases < GR_MIN_CASES) { result = strdup( GR_PACK_NOGRAPH); if( !result) *rc = ERR_MALLOC_FAILED; } else if( *rc == RC_NORMAL) { elap = (float *) malloc( cases * (sizeof *elap)); psize = (float *) malloc( cases * (sizeof *psize)); chopt = alloc_chart_options(); if( !elap || !psize || !chopt ) *rc = ERR_MALLOC_FAILED; else { off = 0; stime = 0; for( walk = fetch->checkpoint; walk; walk = walk->next) { if( walk->event == event && walk->detail) { if( !stime) stime = walk; delta = calc_time_difference( &stime->clock, &walk->clock, fetch->clock_res); *(elap + off) = delta; *(psize + off) = walk->detail->len; off++; } } chopt->data_line_alpha = GR_PACK_DATA_LINE_ALPHA; chopt->data_line_color = strdup( GR_PACK_DATA_LINE_COLOR ); } INSUB( "make_packet_graph", "before-hf-generate" ) result = hf_generate_graph( rc, cases, elap, psize, style, title, GR_PACK_XAX_TITLE, GR_PACK_YAX_TITLE, chopt ); } if( title) free( title); if( elap) free( elap); if( psize) free( psize); if( chopt) free_chart_options( chopt); LEAVE( "make_packet_graph" ) return( result); }