void NameParser::parse (const std::string& imagename, size_t max_num_sequences) { specification = imagename; if (Path::is_dir (imagename)) { array.resize (1); array[0].set_str (imagename); return; } folder_name = Path::dirname (specification); try { std::string::size_type pos; std::string basename = Path::basename (specification); size_t num = 0; while ( (pos = basename.find_last_of (']')) < std::string::npos && num < max_num_sequences) { insert_str (basename.substr (pos+1)); basename = basename.substr (0, pos); if ( (pos = basename.find_last_of ('[')) == std::string::npos) throw Exception ("malformed image sequence specifier for image \"" + specification + "\""); insert_seq (basename.substr (pos+1)); num++; basename = basename.substr (0, pos); } insert_str (basename); for (size_t i = 0; i < array.size(); i++) if (array[i].is_sequence()) if (array[i].sequence().size()) for (size_t n = 0; n < array[i].sequence().size()-1; n++) for (size_t m = n+1; m < array[i].sequence().size(); m++) if (array[i].sequence() [n] == array[i].sequence() [m]) throw Exception ("malformed image sequence specifier for image \"" + specification + "\" (duplicate indices)"); } catch (...) { array.resize (1); array[0].set_str (imagename); throw; } }
void print_statistics(int socktype, struct timeval start, struct timeval end, int total_bytes, int io) { int i; struct s_time_record *record; struct timeval tdiff, total_delay, avg_delay, sqrsum;// sdiv, tmp; int npackets = 0; double t_delay, t_avg, t_total; record = time_record_head.next; int last_seq = 1; struct s_seqlist *seqlist; total_delay.tv_sec = 0; total_delay.tv_usec = 0; sqrsum.tv_sec = 0; sqrsum.tv_usec = 0; while(record != NULL) { /* printf("%i ", record->seq); if(seqformat++ == 10) { printf("\n"); seqformat = 0; }*/ if(socktype == SOCK_DGRAM) { /* save potentially lost sequence numbers */ for(i = last_seq + 1; i < record->seq; i++) insert_seq(i); /* saved sequence number found. Delete it from lost-seq-number list */ if(last_seq > record->seq) delete_seq(record->seq); last_seq = record->seq; } tvsub(&tdiff, &(record->my_time), &(record->his_time)); /* delay */ tvadd(&total_delay, &total_delay, &tdiff); /* sum delay */ npackets++; record = record->next; } avg_delay.tv_sec = total_delay.tv_sec / npackets; avg_delay.tv_usec = total_delay.tv_usec / npackets; /* //standard diviation: record = time_record_head.next; while(record != NULL) { tvsub(&tdiff, &(record->my_time), &(record->his_time)); //delay tvsub(&tmp, &tdiff, &avg_delay); // x1 - mü tvsqr(&tmp); // (x - mü)^2 tvadd(&sdiv, &tmp); record = record->next; }*/ tvsub(&tdiff, &end, &start); t_avg = tvtosec(&avg_delay); t_total = tvtosec(&tdiff); t_delay = tvtosec(&total_delay); printf("\n\nprinting statistics:\n" \ "--------------------------\n"); printf("%i bytes received in %.2f seconds\n", total_bytes, t_total); printf("I/O calls: %i\n", io); printf("packets received: %i\n", npackets); printf("total delay: %.2f seconds\n", t_delay); printf("average delay: %f seconds\n", t_avg); /* printf("standard diviation: %ld seconds, %ld microseconds\n", sdiv.tv_sec / npackets, sdiv.tv_usec / npackets); */ /* print lost packets (only UDP) */ if(socktype == SOCK_DGRAM) { seqlist = seqlist_head.next; if(seqlist == NULL) printf("No packet loss\n"); else { int format = 0; int packetloss = 0; printf("\nPackets with the following sequence numbers are lost:\n\n"); while(seqlist != NULL) { packetloss++; printf("%i ", seqlist->val); seqlist = seqlist->next; if(format++ == 10) { printf("\n"); format = 0; } } printf("\n\nNumber of packets lost: %i\n", packetloss); } } printf("\n\n"); }