// adapted from http://stackoverflow.com/questions/2302969/how-to-implement-char-ftoafloat-num-without-sprintf-library-function-i/2303011#2303011 char* ftoa(double num, char* str) { int whole_part = num; int digit; int log_value = dlog10(num), index = log_value; long wt =0; double fraction_part = num - whole_part; // go in reverse order int i = 0; while (whole_part != 0) { int remainder = whole_part % 10; str[i++] = remainder + '0'; whole_part = whole_part / 10; } strrev(str); index = log_value + 1; str[index] = '.'; double tmp1 = fraction_part, tmp =0; //Extract the fraction part from num for( int i= 1; i < PRECISION; i++) { wt = 10; tmp = tmp1 * wt; digit = tmp; //Store digit in string str[++index] = digit + 48; // ASCII value of digit = digit + 48 tmp1 = tmp - digit; } return str; }
int FileService::on_read(Socket *socket) { dlog10("into int FileService::on_read(Socket *socket)"); FifoBuffer::Packet packet; while (socket->get_one_packet(&packet)) { char *data = (char*) packet.data; bigheader *header = (bigheader*) data; int cmd = ntohs(header->cmd); // printf("cmd = %d \n", cmd); if (cmd == BIG_OPEN_REQ) { //不验证,直接默认全部通过 bigloginrspall resp; socket->send((const char*) &resp, sizeof(bigloginrspall)); } else if (cmd == BIG_WRITE_REQ) { bigwritereq * req = (bigwritereq*) (data + sizeof(bigheader)); printf("write file %s \n", req->path); WriteFile((const char*) (req->path), (const char*) ((char*) req + sizeof(bigwritereq)), ntohl(req->data_len)); bigwriterspall resp(0); socket->send((const char*) &resp, sizeof(resp)); } else if (cmd == BIG_READ_REQ) { bigreadreq *req = (bigreadreq*) (data + sizeof(bigheader)); int len = 0; char *buffer = ReadFile((const char*) (req->path), len); if (buffer == NULL) { bigreadrspall resp(1, 0); socket->send((const char*) &resp, sizeof(resp)); } else { bigreadrspall resp(0, len); char *data = (char*) malloc(sizeof(bigreadrspall) + len); if (data == NULL) { resp.rsp.result = 1; resp.rsp.data_len = 0; socket->send((const char*) &resp, sizeof(resp)); } else { memcpy(data, (void*) &resp, sizeof(bigreadrspall)); memcpy(data + sizeof(bigreadrspall), data, len); socket->send((const char*) &resp, sizeof(resp) + len); free(data); } } } else if (cmd == BIG_CLOSE_REQ) { } else { printf("cmd = %d , can not parse \n", cmd); } } return FSM_END; }