Advertisement
Guest User

Untitled

a guest
Apr 1st, 2020
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.89 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5.  
  6. #define NAME_LEN              512
  7. #define USER_LEN              512
  8. #define MEM_INIT              1024
  9. #define NODE_FIRST            'a'
  10. #define NODE_LAST             'z'
  11. #define NODE_CUNT             (NODE_LAST-NODE_FIRST+1)
  12.  
  13. typedef struct node_t node_t;
  14.  
  15. typedef struct node_t{
  16.   node_t           *next[NODE_CUNT];
  17.   int               num;
  18. }node_t;
  19.  
  20. static node_t      *mem;
  21. static size_t       mem_s;
  22. static size_t       mem_c;
  23. static node_t       root;
  24.  
  25. static void         fuk         (void);
  26.  
  27. static void         mem_init    (void);
  28. static node_t      *mem_alloc   (void);
  29.  
  30. static void         node_init   (node_t *n);
  31. static int          node_insert (node_t *n,char const *str,int agurk);
  32.  
  33. static char        *trimik      (char *str);
  34. static void         mak_nik     (char *name,char *user);
  35.  
  36. static void fuk(void){
  37.   printf("fuk\n");
  38.   exit(1);
  39. }
  40.  
  41. static void mem_init(void){
  42.   mem = malloc(sizeof(node_t)*MEM_INIT);
  43.   if(!mem) fuk();
  44.   mem_s = MEM_INIT;
  45.   mem_c = 0;
  46. }
  47.  
  48. static node_t *mem_alloc(void){
  49.   if(mem_c >= mem_s){
  50.     size_t s = mem_s<<1;
  51.     mem = realloc(mem,sizeof(node_t)*s);
  52.     if(!mem) fuk();
  53.     mem_s = s;
  54.   }
  55.  
  56.   return &mem[mem_c++];
  57. }
  58.  
  59. static void node_init(node_t *n){
  60.   memset(n->next,0x00,sizeof(n->next));
  61.   n->num = -1;
  62. }
  63.  
  64. static int node_insert(node_t *n,char const *str,int agurk){
  65.   size_t  i;
  66.   node_t *m;
  67.  
  68.   i = (size_t)str[0]-NODE_FIRST;
  69.   if(i >= NODE_CUNT) fuk();
  70.   m = n->next[i];
  71.  
  72.   if(!m){
  73.     m          = mem_alloc();
  74.     n->next[i] = m;
  75.     node_init(m);
  76.   }
  77.  
  78.   if(str[1]){
  79.     return node_insert(m,str+1,agurk);
  80.   }else{
  81.     if(!agurk && m->num >= 0) return -1;
  82.     return ++m->num;
  83.   }
  84. }
  85.  
  86. static char *trimik(char *str){
  87.   char *end = str+strlen(str)-1;
  88.   while(end >= str && isspace((unsigned char)*end)){
  89.     *end-- = 0;
  90.   }
  91.   return str;
  92. }
  93.  
  94. static void mak_nik(char *name,char *user){
  95.   char *last;
  96.   char *n;
  97.   int   num;
  98.  
  99.   last = strrchr(name,' ');
  100.   if(!last){
  101.     strcpy(user,"-");
  102.     return;
  103.   }
  104.   if(last-name+1+10 >= USER_LEN) fuk(); //idiot)
  105.   *last++ = 0;
  106.  
  107.   n = user;
  108.   for(char *c = name;*c;c++){
  109.     if(*c == ' ') continue;    
  110.     *n++ = tolower(*c);
  111.   }
  112.   *n = 0;
  113.  
  114.   if(node_insert(&root,user,0) > -1) return;
  115.  
  116.   *n++  = tolower(*last);
  117.   *n    = 0;
  118.   num   = node_insert(&root,user,1);
  119.   if(num) snprintf(n,USER_LEN-(n-user),"%d",num);
  120. }
  121.  
  122. int main(int argc,char **argv){
  123.   FILE   *f;
  124.   char    name[NAME_LEN];
  125.   char    user[USER_LEN];
  126.  
  127.   if(argc < 2) fuk();
  128.  
  129.   mem_init();
  130.   node_init(&root);
  131.  
  132.   f = fopen(argv[1],"r");
  133.   if(!f) fuk();
  134.  
  135.   while(fgets(name,NAME_LEN,f)){
  136.     trimik(name);
  137.     if(!*name) continue;
  138.  
  139.     printf("%-50s ",name);
  140.     mak_nik(name,user);
  141.     printf("%s\n",user);
  142.   }
  143.   if(ferror(f)) fuk();
  144.   fclose(f);
  145.  
  146.   return 0;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement