Advertisement
EmanueleManca

Untitled

Jan 9th, 2023
734
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.06 KB | None | 0 0
  1. /* strtok example */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <ctype.h>
  6. #include <sys/socket.h>
  7. #include <arpa/inet.h>
  8. #include <unistd.h>
  9.  
  10. #define OPS "+*&^%|"
  11.  
  12. void allocate(char* tok[3], char* ls, char* le, char* op, char* rs, char* re){
  13.    
  14.     tok[0] = (char*)calloc(le-ls, sizeof(char));
  15.     tok[1] = (char*)calloc(2, sizeof(char));
  16.     tok[2] = (char*)calloc(re-rs, sizeof(char));
  17.  
  18.     memcpy(tok[0], ls+1, le-ls-1);
  19.     memcpy(tok[1], op, 1);
  20.     memcpy(tok[2], rs+1, re-rs-1);
  21. }
  22.  
  23. int token(char* tok[3], char* str){
  24.     /*
  25.         (left) op. (right)
  26.         l -> left
  27.         r -> right
  28.  
  29.         s -> start
  30.         e -> end
  31.  
  32.         c -> count of innested parenthesis
  33.     */
  34.     char *le, *ls, *rs, *re, *op;
  35.     int len = strlen(str);
  36.  
  37.     ls = strchr(str, '(');
  38.     if(!ls){
  39.         ls = str;
  40.         le = str+1;
  41.         while(isdigit((char)*le)) le++;
  42.         op = le;
  43.         le--;
  44.         rs = op+1;
  45.         re = str + strlen(str)-1;
  46.  
  47.         tok[0] = (char*)calloc(le-ls+2, sizeof(char));
  48.         tok[1] = (char*)calloc(2, sizeof(char));
  49.         tok[2] = (char*)calloc(re-rs+2, sizeof(char));
  50.  
  51.         memcpy(tok[0], ls, le-ls+1);
  52.         memcpy(tok[1], op, 1);
  53.         memcpy(tok[2], rs, re-rs+1);
  54.  
  55.         return 0;
  56.     }
  57.     re = strrchr(str, ')');
  58.    
  59.     le = ls;
  60.     rs = re;
  61.     int lc = 1, rc = 1;
  62.  
  63.     while(lc){
  64.         le++;
  65.         if(*le == ')'){
  66.             lc--;
  67.         }else if( *le == '('){
  68.             lc++;
  69.         }
  70.     }
  71.     if(le == re && le-str == len-1){ // 12 * (34*2)
  72.         rs = str;
  73.         re = rs + strcspn(rs, " ");
  74.         op = re+1;
  75.         allocate(tok, rs, re, op, ls, le);
  76.         return 1;
  77.     }
  78.     while(rc){
  79.         rs--;
  80.         if(*rs == ')'){
  81.             rc++;
  82.         }else if( *rs == '('){
  83.             rc--;
  84.         }
  85.     }
  86.     if(rs == ls && rs == str){   // (12+3) / 4
  87.         op = le+2;
  88.         rs = op+1;
  89.         re = str + strlen(str);
  90.     }else{
  91.         op = le + 2;
  92.     }
  93.     allocate(tok, ls, le, op, rs, re);
  94.     return 1;
  95.     /*
  96.     printf("ls= %c:%d[%c]\nle= %c:%d[%c]\nrs= %c:%d[%c]\nre= %c:%d[%c]\n",
  97.             *ls, ls-str, str[ls-str], *le, le-str, str[le-str], *rs, rs-str, str[rs-str],*re, re-str, str[re-str]);
  98.     */
  99.  
  100. }
  101.  
  102. int contains(char* str, char* match){
  103.     int l = strlen(match);
  104.     while(*str){
  105.         for(int i = 0; i < l; i++){
  106.             if(*str == match[i]){
  107.                 return 1;
  108.             }
  109.         }
  110.         str++;
  111.     }
  112.     return 0;
  113. }
  114.  
  115. long compute(char* str){
  116.     if(!contains(str, OPS)){
  117.         return atol(str);
  118.     }
  119.     char* tok[3];
  120.     token(tok, str);
  121.     long l = compute(tok[0]);
  122.     long r = compute(tok[2]);
  123.     switch(tok[1][0]){
  124.     case '+':
  125.         return l + r;
  126.     case '*':
  127.         return l * r;
  128.     case '&':
  129.         return l & r;
  130.     case '^':
  131.         return l ^ r;
  132.     case '%':
  133.         return l % r;
  134.     case '|':
  135.         return l | r;
  136.     }
  137.     free(tok[0]);
  138.     free(tok[1]);
  139.     free(tok[2]);
  140. }
  141.  
  142. void pwncollege(){}
  143.  
  144. int main(){
  145.  
  146.     char str[256] = {0}, *expr;
  147.     unsigned long len = 0;
  148.     int off = 0;
  149.    
  150.     int sock = socket(AF_INET, SOCK_STREAM, 0);
  151.     if(sock < 0){
  152.         printf("Socket creation error\n");
  153.         return -1;
  154.     }
  155.  
  156.     struct sockaddr_in serv_addr;
  157.     serv_addr.sin_family = AF_INET;
  158.     serv_addr.sin_port = htons(1493);
  159.     inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);
  160.  
  161.     int client_fd = connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
  162.     if(client_fd < 0){
  163.         printf("Connectio failed\n");
  164.         return -1;
  165.     }
  166.  
  167.     while(read(sock, str, 256) > 0){
  168.  
  169.         printf("READ: %s", str);
  170.        
  171.         if(strstr(str, "CHALLENGE") == NULL){
  172.             continue;
  173.         }
  174.  
  175.         len = strlen(str)-1;
  176.         str[len] = '\0';        // removing \n
  177.  
  178.         if( (off = strcspn(str, "123456789(")) != len ){
  179.  
  180.             expr = str+off;
  181.             printf("EXPR: '%s'\n", expr);
  182.             long res = compute(expr);
  183.             printf("%ld\n", res);
  184.             //printf("RES: %ld\n", res);
  185.             char str[32];
  186.             sprintf(str, "%ld\n", res);
  187.             send(sock, str, strlen(str), 0);
  188.         }
  189.        
  190.         memset(str, 0, 255);
  191.     }
  192.  
  193.     return 0;
  194. }
  195.  
  196. /*
  197. void printexptr_r(char* str, int depth){
  198.     char *tok[3];
  199.     if(!token(tok, str)){
  200.         for(int i = 0; i < depth; i++) printf("- ");
  201.         printf("%s %s %s\n", tok[0], tok[1], tok[2]);
  202.         return;
  203.     }
  204.     printexptr_r(tok[0], depth+1);
  205.     for(int i = 0; i < depth; i++) printf("- ");
  206.     printf("%s\n", tok[1]);
  207.     printexptr_r(tok[2], depth+1);
  208. }
  209.  
  210. void printexptr(char* expr){
  211.     printexptr_r(expr, 0);
  212. }
  213.  
  214. int main ()
  215. {  
  216.  
  217.         char *str;
  218.         unsigned long l = 0;
  219.         getline(&str, &l, stdin);
  220.         printf("%d\n", compute(str));
  221.         free(str);
  222.  
  223. /*
  224.     char* tok[3];
  225.     if( token(tok, str) ){
  226.         for(int i = 0; i < 3; i++){
  227.             printf("%s\n", tok[i]);
  228.         }
  229.     }
  230.     return 0;
  231. }
  232. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement