void char_to_window(Display *display, Window win, GC gc, char c, int *x, int y) { int idx, sourcex; if(isalpha(c)) { idx = letter_index(c); sourcex = letter_source_x(idx); XCopyArea(display,RadioSkin.pixmap,win, gc, letters.srcx + sourcex, letters.srcy, letters.w[idx], letters.h, *x, y); *x += letters.w[idx]; } else { idx = digit_index(c); sourcex = digit_source_x(idx); XCopyArea(display,RadioSkin.pixmap,win, gc, digits.srcx + sourcex, digits.srcy, digits.w[idx], digits.h, *x, y); *x += digits.w[idx]; } }
LAlphabet CipherText::frequencies(unsigned int key_length, unsigned int substring_index) { assert(key_length == 0 || substring_index < key_length); LAlphabet alphabet; if (key_length == 0) key_length = 1; // Count letter frequencies alphabet.fill(0); for (size_t x=substring_index; x < ciphertext_.length(); x += key_length) { int letter = letter_index(ciphertext_[x]); if (letter != -1) alphabet[letter] += 1; } return alphabet; }
CipherText * CipherTextFactory::CipherTextFromStdin() { char c; unsigned long readed = 0; std::string text; VigenereStreamAnalysis *stat = new VigenereStreamAnalysis; while (std::cin.get(c)) { int index = letter_index(c); if (index == -1) continue; readed++; if (readed > MAX_ANALYZED_INPUT_LEN) break; text.push_back(c); stat->put(c); } stat->put_eof(text); // Construct a CipherText object and return it return new CipherText(text, stat); }
int main(int argc, char const *argv[]) { FILE *file; int seq1_size = 0; char *seq1, *seq2; int seq2_size = 0; file = fopen(argv[1], "r"); if (file != NULL) { fscanf(file, "%d %d", &seq1_size, &seq2_size); seq1 = (char *) calloc(seq1_size + 1, sizeof(char)); seq2 = (char *) calloc(seq2_size + 1, sizeof(char)); fscanf(file, "%s %s", seq1, seq2); } else { printf("%s\n", "Unable to open file"); exit(-1); } fclose(file); int *P = (int *) calloc(ALPHA_SIZE * (seq2_size + 1), sizeof(int)); int *matrix = (int*) calloc((seq1_size + 1) * (seq2_size + 1), sizeof(int)); if (matrix == NULL) { printf("Not enough memory. Learning how to program in C might help...\n"); exit(-1); } int i, j; int gap = seq2_size + 1; /* Compute P table */ #pragma omp parallel for private(j) for (i = 0; i < ALPHA_SIZE; i++) { int index = i * gap; char c = C(i); for (j = 1; j < seq2_size + 1; j++) { char b = seq2[j - 1]; if (b == c) { P[index + j] = j; } else { P[index + j] = P[index + j - 1]; } } } for (i = 1; i < seq1_size + 1; i++) { int index = i * gap; #pragma omp parallel for for (j = 1; j < seq2_size + 1; j++) { char xi = seq1[i - 1]; char yj = seq2[j - 1]; int l_value = letter_index(xi); int p_value = P[l_value * gap + j]; int t = (0 - p_value) < 0? 1 : 0; int s = (0 - (matrix[index - gap + j] - t * matrix[index - gap + p_value - 1])) < 0? 1 : 0; if (xi == yj) cost(i); matrix[index + j] = matrix[index - gap + j] + t * (s ^ 1); } } i = seq1_size; j = seq2_size; char xi, yj; int last_cell = matrix[i * gap + j]; int len = last_cell; char lcs[len + 1]; lcs[len] = '\0'; while(last_cell > 0) { int index = i * gap + j; xi = seq1[i - 1]; yj = seq2[j - 1]; if (xi == yj) { lcs[last_cell - 1] = xi; last_cell--; i--; j--; } else if (matrix[index - gap] > matrix[index - 1]) { i--; } else { j--; } } printf("%d\n%s\n", len, lcs); free(matrix); free(P); free(seq1); free(seq2); return 0; }