XMoshSum digestBlock( hp_byte* initialByteBlock, XMoshSum sum ) { sha2_word block[ ROUNDS ]; sha2_word* words = ( sha2_word* ) &sum.data; for( unsigned int i = 0; i < 16; i++ ) { BLOCK_COPY( block, initialByteBlock, i ); } for( unsigned i = 16; i < ROUNDS; i++ ) { block[ i ] = block[ i - 16 ] + SIGMA0( block, i ) + block[ i - 7 ] + SIGMA1( block, i ); } sha2_word a = words[ 0 ]; sha2_word b = words[ 1 ]; sha2_word c = words[ 2 ]; sha2_word d = words[ 3 ]; sha2_word e = words[ 4 ]; sha2_word f = words[ 5 ]; sha2_word g = words[ 6 ]; sha2_word h = words[ 7 ]; sha2_word temp1, temp2; for( unsigned i = 0; i < ROUNDS; i++ ) { temp1 = ( h + ( SUM1( e ) ) + CH( e, f, g ) + K[ i ] + block[ i ] ); temp2 = ( SUM0( a ) ) + MAJ( a, b, c ); h = g; g = f; f = e; e = d + temp1; d = c; c = b; b = a; a = temp1 + temp2; } words[ 0 ] += a; words[ 1 ] += b; words[ 2 ] += c; words[ 3 ] += d; words[ 4 ] += e; words[ 5 ] += f; words[ 6 ] += g; words[ 7 ] += h; return sum; }
int create_csv_line(px_header *header, px_fieldInfo **felder, px_records block, char *blobname) { int i, block_index = 0; #define BLOCK_COPY(x,size) \ memcpy(x, block + block_index, size); \ /*fprintf(stderr, "\nBl-IDX1: %04x - ",block_index);*/ \ block_index += size; for (i = 0; i < header->numFields; i++ ) { // fprintf(stderr, "%02d: %d - ", felder[i]->type, felder[i]->size); if (i > 0) putchar(delim); if (felder[i]->type == PX_Field_Type_Alpha) { char *str = malloc(felder[i]->size + 1); char *qstr = malloc(felder[i]->size*2 + 1); BLOCK_COPY(str, felder[i]->size); str[felder[i]->size] = '\0'; PXtoCSVString(qstr, str, felder[i]->type); PXtoQuotedString(qstr, qstr, felder[i]->type); printf("\"%s\"", qstr); free(qstr); free(str); } else if (felder[i]->type == PX_Field_Type_ShortInt) { unsigned short s; unsigned long long d; BLOCK_COPY(&s, felder[i]->size); switch(PXtoLong(s, &d, felder[i]->type)) { case VALUE_OK: printf("%Ld", d ); break; case VALUE_IS_NULL: printf("NULL"); break; default: break; } } else if (felder[i]->type == PX_Field_Type_Logical) { unsigned char s; unsigned long long d; BLOCK_COPY(&s, felder[i]->size); switch(PXtoLong(s, &d, felder[i]->type)) { case VALUE_OK: printf("%Lx", d); break; case VALUE_IS_NULL: printf("NULL"); break; default: break; } } else if (felder[i]->type == PX_Field_Type_LongInt) { unsigned long s; unsigned long long d; BLOCK_COPY(&s, felder[i]->size); switch(PXtoLong(s, &d, felder[i]->type)) { case VALUE_OK: printf("%Ld", d); break; case VALUE_IS_NULL: printf("NULL"); break; default: break; } } else if (felder[i]->type == PX_Field_Type_Incremental) { unsigned long s; unsigned long long d; BLOCK_COPY(&s, felder[i]->size); switch(PXtoLong(s, &d, felder[i]->type)) { case VALUE_OK: printf("%Ld", d); break; case VALUE_IS_NULL: printf("NULL"); break; default: break; } } else if (felder[i]->type == PX_Field_Type_Number) { unsigned long long s; double d; BLOCK_COPY(&s, felder[i]->size); switch(PXtoDouble(s, &d, felder[i]->type)) { case VALUE_OK: printf("%f", d ); break; case VALUE_IS_NULL: printf("NULL"); break; default: break; } } else if (felder[i]->type == PX_Field_Type_Currency) { unsigned long long s; double d; BLOCK_COPY(&s, felder[i]->size); switch(PXtoDouble(s, &d, felder[i]->type)) { case VALUE_OK: printf("%f", d ); break; case VALUE_IS_NULL: printf("NULL"); break; default: break; } } else if (felder[i]->type == PX_Field_Type_Date) { unsigned long long s; struct tm _tm; BLOCK_COPY(&s, felder[i]->size); switch (PXtoTM(s, &_tm, felder[i]->type)) { case VALUE_OK: printf("'%04i-%02i-%02i'", _tm.tm_year+1900, _tm.tm_mon+1, _tm.tm_mday); break; case VALUE_IS_NULL: printf("NULL"); break; default: break; } } else if (felder[i]->type == PX_Field_Type_Time) { unsigned long long s; struct tm _tm; BLOCK_COPY(&s, felder[i]->size); switch (PXtoTM(s, &_tm, felder[i]->type)) { case VALUE_OK: printf("%02i:%02i:%02i'",_tm.tm_hour, _tm.tm_min, _tm.tm_sec); break; case VALUE_IS_NULL: printf("NULL"); break; default: break; } } else if (felder[i]->type == PX_Field_Type_Timestamp) { unsigned long long s; struct tm _tm; BLOCK_COPY(&s, felder[i]->size); switch (PXtoTM(s, &_tm, felder[i]->type)) { case VALUE_OK: printf("'%04i-%02i-%02i ", _tm.tm_year+1900, _tm.tm_mon+1, _tm.tm_mday); printf("%02i:%02i:%02i'",_tm.tm_hour, _tm.tm_min, _tm.tm_sec); break; case VALUE_IS_NULL: printf("NULL"); break; default: break; } } else if (felder[i]->type == PX_Field_Type_MemoBLOB) { void *blob = malloc(felder[i]->size); char *s = NULL; BLOCK_COPY(blob, felder[i]->size); s = PXMEMOtoString(blob, felder[i]->size, blobname); if (s != NULL) { char *qstr = malloc(strlen(s)*2 + 1); PXtoCSVString(qstr, s, felder[i]->type); PXtoQuotedString(qstr, qstr, felder[i]->type); printf("\"%s\"",qstr); free(s); free(qstr); } else { char *qstr = malloc(strlen((char *)blob)*2 + 1); PXtoCSVString(qstr, (char *)blob, felder[i]->type); PXtoQuotedString(qstr, qstr, felder[i]->type); printf("\"%s\"",qstr); free(qstr); } free(blob); } else if (felder[i]->type == PX_Field_Type_Graphic || felder[i]->type == PX_Field_Type_BinBLOB) { void *blob = malloc(felder[i]->size); int s_size; void *s = NULL; BLOCK_COPY(blob, felder[i]->size); PXBLOBtoBinary(blob, felder[i]->size, blobname, &s, &s_size); if (s) { int fd; char fn[255]; static int gra_cnt = 0; sprintf(fn, "/tmp/pxtools.%d-%d.bin", getpid(), gra_cnt++); if ((fd = open(fn, O_WRONLY | O_CREAT, S_IRWXU | S_IRGRP | S_IROTH )) == -1) { fprintf(stderr, "%s.%d: can't open %s: %s\n", __FILE__, __LINE__, fn, strerror(errno)); } else { write(fd, s, s_size); close(fd); } printf("\"file:/%s\"", fn); } else { fprintf(stderr, "%s.%d: block is empty !!\n", __FILE__, __LINE__); } free(blob); } else { fprintf(stderr, "\nUnknown: type: %d, size: %d\n",felder[i]->type, felder[i]->size); block_index += felder[i]->size; fprintf(stderr, "Name: %s\n", felder[i]->name); } // fprintf(stderr, "\n"); } #undef BLOCK_COPY printf("\n"); return 0; }