void recv_serv(t_main *c) { char buf[BUF_SIZE + 1]; int len; memset(buf, 0, BUF_SIZE + 1); if ((len = recv(c->sfd, buf, BUF_SIZE, 0)) <= 0) disconnect(c); if (!add_buffer(c, buf, len)) return ; c->start = 0; c->end = 0; str_clean(c->buf, strlen(c->buf)); aff_msg(c->m, str_clean(c->buf, strlen(c->buf))); memset(c->buf, 0, BUF_SIZE + 3); }
int send_split(char *buf, int fd) { char *s; char *tmp; char *max; int res; res = 0; tmp = buf; max = buf + strlen(buf); s = str_clean(strdup(buf)); printf("Sending to %s%d%s:\t\t%s%s%s\n", BLUEG, fd, DEFAULT, GREENG, s, DEFAULT); while (tmp < max) { res = (int)(max - tmp) > BUF_SIZE ? BUF_SIZE : (int)(max - tmp) % BUF_SIZE; if ((res = send(fd, buf, strlen(buf), 0)) <= 0) { fprintf(stderr, "Error while sending %s to %d\n", s, fd); break; } tmp += BUF_SIZE; } free(s); return (res); }
int main(void) { int c; string str; if(str_new(&str, 255) == 0) return 1; while((c = getchar()) != EOF) { if(c == '\n'){ sort(&str); printf("%s\n-----\n", str.str); str_clean(&str); } else str_push(&str, c); } return 0; }
static void client_console(int sock) { char client_buf[BABBLE_BUFFER_SIZE]; char *server_buf; char *user_buf =NULL; size_t user_buf_size=0; int cid = -1; int answer_expected = 0; while(getline(&user_buf, &user_buf_size, stdin) != -1){ /* truncate input if need be */ strncpy(client_buf, user_buf, BABBLE_BUFFER_SIZE); str_clean(client_buf); /* check command on client side */ cid = str_to_command(client_buf, &answer_expected); if(cid == -1){ continue; } if (network_send(sock, strlen(client_buf)+1,(void*) client_buf) != strlen(client_buf)+1){ perror("ERROR writing to socket"); break; } if(cid == TIMELINE){ /* specific protocol for timeline request */ int *t_length, i; if(network_recv(sock, (void**) &t_length) != sizeof(int)){ perror("ERROR in timeline protocol"); break; } printf("Timeline of size: %d\n", *t_length); /* recv only the last BABBLE_TIMELINE_MAX */ int to_recv= (*t_length < BABBLE_TIMELINE_MAX)? *t_length : BABBLE_TIMELINE_MAX; free(t_length); for(i=0; i< to_recv; i++){ if(network_recv(sock, (void**) &server_buf) < 0){ perror("ERROR reading from socket"); break; } printf("%s", server_buf); free(server_buf); } if(i != to_recv){ break; } } else{ if(answer_expected){ if(network_recv(sock, (void**) &server_buf) < 0){ perror("ERROR reading from socket"); break; } printf("%s", server_buf); free(server_buf); } } } printf("### Client exiting \n"); }
/** Lexikalni analyzator * * @param string slozi k navratu identifikatoru a cisel * vraci ciselnou reprezentaci tokenu */ static inline int get_token__(void) { static int c; static int state = FSM_READ; int num = 0; // buffer se musi vyprazdnit str_clean(&str); for(;;) { switch(state) { // nacitani znaku case FSM_READ: c = fgetc(input); // nekdy byva potreba nacteni znaku preskocit case FSM_START: if(isspace(c)) { state = FSM_READ; if(c == '\n') ++line; } else if(isalpha(c) || c == '_') state = FSM_IDENTIFIER; else if(isdigit(c)) state = FSM_NUMBER; else if(c == '+') { state = FSM_READ; return PLUS; } else if(c == '*') { state = FSM_READ; return MUL; } else if(c == '/') { state = FSM_READ; return DIV; } else if(c == '.') state = FSM_DOT; else if(c == '<') state = FSM_LESS; else if(c == '>') state = FSM_GREAT; else if(c == '~') state = FSM_NOT_EQUALS; else if(c == '^') { state = FSM_READ; return POWER; } else if(c == '(') { state = FSM_READ; return LBRAC; } else if(c == ')') { state = FSM_READ; return RBRAC; } else if(c == ',') { state = FSM_READ; return COMMA; } else if(c == '-') state = FSM_DASH; else if(c == '=') state = FSM_EQUALS; else if(c == '"') state = FSM_STRING; else if(c == ';') { state = FSM_READ; return SEMICOLON; } else if(c == EOF) return NOTHING; else { state = FSM_READ; return ERROR_LEX_UX_CHAR; } break; case FSM_IDENTIFIER: str_push(&str, c); c = fgetc(input); if(! (isalnum(c) || c == '_')) { state = FSM_START; return check_keyword(&str); // kontrola klicovych slov } break; case FSM_NUMBER: str_push(&str, c); c = fgetc(input); if(isdigit(c)) ; else if(c == '.') state = FSM_FLOAT0; else if(c == 'E' || c == 'e') state = FSM_EXP_E; else { state = FSM_START; return NUMBER; } break; case FSM_FLOAT0: str_push(&str, c); c = fgetc(input); if(isdigit(c)) state = FSM_FLOAT; else { state = FSM_START; return ERROR_LEX_NUMBER; } break; case FSM_FLOAT: str_push(&str, c); c = fgetc(input); if(isdigit(c)) ; else if(c == 'E' || c == 'e') state = FSM_EXP_E; else { state = FSM_START; return NUMBER; } break; case FSM_EXP_E: str_push(&str, c); c = fgetc(input); if(c == '+' || c == '-') state = FSM_EXP0; else if (isdigit(c)) state = FSM_EXP; else { state = FSM_START; return ERROR_LEX_NUMBER; } break; case FSM_EXP0: str_push(&str, c); c = fgetc(input); if(isdigit(c)) state = FSM_EXP; else { state = FSM_START; return ERROR_LEX_NUMBER; } break; case FSM_EXP: str_push(&str, c); c = fgetc(input); if(! isdigit(c)) { state = FSM_START; return NUMBER; } break; // NOTE: Zminit v dokumentaci, ze jsme zakazali primo vkladat ridici znaky ASCII do retezcu case FSM_STRING: c = fgetc(input); if(c < ASCII_CONTROLL) { state = FSM_START; return ERROR_LEX_UX_CHAR; } else if(c == '\\') state = FSM_ESCAPE; else if(c == '"') { state = FSM_READ; return STRING; } else str_push(&str, c); break; case FSM_ESCAPE: c = fgetc(input); if(c == 'n') { state = FSM_STRING; str_push(&str, '\n'); } else if(c == 't') { state = FSM_STRING; str_push(&str, '\t'); } else if(c == '\\' || c == '"') { state = FSM_STRING; str_push(&str, c); } else if(isdigit(c)) state = FSM_ESCAPE_NUM; else { state = FSM_START; return ERROR_LEX_ESC_SEC; } break; case FSM_ESCAPE_NUM: num = c - '0'; c = fgetc(input); if(isdigit(c)) { num = num * 10 + c - '0'; state = FSM_ESCAPE_NUM2; } else { state = FSM_START; return ERROR_LEX_ESC_SEC; } break; case FSM_ESCAPE_NUM2: c = fgetc(input); if(isdigit(c)) { num = num * 10 + c - '0'; if(num > 0 && num < 256) { str_push(&str, num); state = FSM_STRING; } else { state = FSM_START; return ERROR_LEX_ESC_SEC; } } else { state = FSM_START; return ERROR_LEX_ESC_SEC; } break; case FSM_DASH: c = fgetc(input); if(c == '-') state = FSM_DASH2; else { state = FSM_START; return MINUS; } break; case FSM_DASH2: c = fgetc(input); if(c == '[') state = FSM_DASH2B; else if(c == '\n') state = FSM_READ; else state = FSM_COMMENT_LINE; break; case FSM_DASH2B: c = fgetc(input); if(c == '[') state = FSM_COMMENT_BLOCK; else state = FSM_COMMENT_LINE; break; case FSM_COMMENT_LINE: c = fgetc(input); if(c == '\n') { state = FSM_READ; ++line; } else if(c == EOF) return NOTHING; break; case FSM_COMMENT_BLOCK: c = fgetc(input); if(c == ']') state = FSM_COMMENT_BLOCK_END; else if(c == '\n') ++line; else if(c == EOF) return ERROR_LEX_X_CMNT_END; break; case FSM_COMMENT_BLOCK_END: c = fgetc(input); if(c == ']') state = FSM_READ; else { state = FSM_COMMENT_BLOCK; if(c == '\n') ++line; } break; case FSM_EQUALS: c = fgetc(input); if(c == '=') { state = FSM_READ; return EQUAL; } else { state = FSM_START; return ASSIGN; } break; case FSM_DOT: c = fgetc(input); if(c == '.') { state = FSM_READ; return STRCONCAT; } else { state = FSM_START; return ERROR_LEX_UX_CHAR; } break; case FSM_LESS: c = fgetc(input); if(c == '=') { state = FSM_READ; return LESS_EQ; } else { state = FSM_START; return LESS; } break; case FSM_GREAT: c = fgetc(input); if(c == '=') { state = FSM_READ; return GREAT_EQ; } else { state = FSM_START; return GREAT; } break; case FSM_NOT_EQUALS: c = fgetc(input); if(c == '=') { state = FSM_READ; return NOT_EQUAL; } else { state = FSM_START; return ERROR_LEX_UX_CHAR; } break; #ifdef DEBUG // konecny automat by nemel vypadnout do jineho stavu default: assert(0); break; #endif } /* switch */ } /* for */ }