1. Си / Говнокод #8371

    +133

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    /* ... */
    /**************************************************************************************
      cpu_information () parse /proc/cpuinfo to get information about CPU 
     **************************************************************************************/
    int cpu_information (data* user_data, int pos)
    {
      FILE *cpufp/* /proc/cpuinfo */ /*, *sysfs_max_cpu_freq_fp  /sys/devices/system/cpu/cpu%d/cpufreq/cpuinfo_max_freq */;
       
      char* ch = (char*)malloc (MAXLEN);
      char* line = (char*)malloc (MAXLEN);
      char* buf = (char*)malloc (MAXLEN);
      
      GtkTreeIter iter[2];
      // int y = 0;
      if ((cpufp = fopen(CPU_INFORMATION_FILE, "r")) == NULL)
        printf ("%s\n", "Error opening /proc/cpuinfo");
    
      while (fgets (ch, MAXLEN, cpufp) != NULL) 
      {
        if (!strncmp (ch, "processor", 9)) 
        {
          sscanf (ch, "%*s %*s %s", line);
          strcpy (buf, "CPU");
          gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[0],NULL, pos, 0, buf, 1, line, -1);
        } else if (!strncmp(ch, "vendor_id", 9))
        {
          sscanf(ch,"%*s %*s %s", line);
          strcpy (buf, "Processor type:");
          gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[1],&iter[0], pos, 0, buf, 1, line, -1); 
        } else if (!strncmp(ch, "model name", 10))
        {
          strcpy(buf, "Model name");
          ch[strlen(ch)-1] = '\0'; //delete '\n' symbol from the end of string
          gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[1],&iter[0], pos, 0, buf, 1, &ch[13], -1);
        } else if (!strncmp(ch, "cpu MHz", 7))
        {
          int curr_cpu_freq;
          sscanf(ch, "%*s %*s %*s %d\n", &curr_cpu_freq);
          sprintf(line, "%d", curr_cpu_freq);
          strcpy (buf, "Current Processor Speed in MHz");
          gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[1],&iter[0], pos, 0, buf, 1, line,-1);
          /*
    	 Begin parsing /sys/devices/system/cpu/cpu%d/cpufreq/cpuinfo_max_freq 
    	 
          sprintf (sysfs_max_cpu_freq_path, SYSFS_CPU_MAX_FREQ_FORMAT_STRING, y);
          if ((sysfs_max_cpu_freq_fp = fopen (sysfs_max_cpu_freq_path, "r")) == NULL) {
        	  printf("%s %s\n", "Error opening",  sysfs_max_cpu_freq_path);
          }
          while (fgets (line, MAXLEN, sysfs_max_cpu_freq_fp) != NULL)
          {
    	sscanf (line, "%d", &max_cpu_freq);
    	sprintf (line, "%d", max_cpu_freq/1000);
    	strcpy (buf, "Max Processor Speed in MHz");
    	gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[2],&iter[1], pos, 0, buf, 1, line,-1);
          }
          y++;
          
    	 End parsing 
           
          fclose (sysfs_max_cpu_freq_fp);*/
        }  else if (!strncmp(ch, "cache size", 10))
        {
          sscanf(ch, "%*s %*s %*s %s", line);
          strcpy (buf, "Processor cache size");
          strcat (line, " KB");
          gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[1],&iter[0], pos, 0, buf, 1, line, -1);
    
        } else if (!strncmp(ch, "bogomips", 8)) 
        {
          sscanf(ch, "%*s %*s %s", line);
          strcpy (buf, "Processor speed in Bogomips");
          gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[1],&iter[0], pos, 0, buf, 1, line, -1);
          cpu_temperature (user_data,&iter[0], pos); //get CPU temperature.
        }
        pos++;
      }
    
      free (buf);
      free (line);
      free (ch);
      //free (sysfs_max_cpu_freq_path);
      fclose (cpufp);
      return 0;
    }
    /* ... */

    По просьбам трудящихся http://govnokod.ru/7979#comment116436

    По коду:
    1) хорошо бы проверять, что попытался выделить;
    2) ошибка произошла успешно — начинаем парсить...;
    3) для решения таких задач стоит обратить своё внимание на, например, PyGTK.

    P.S. Если уж совсем не в мочь и к строкам так тянет,
    то допилите под себя LiteC, у Г.Шилдта есть что подсмотреть.

    Запостил: sayidandrtfm, 31 Октября 2011

    Комментарии (20) RSS

    • > 3) для решения таких задач стоит обратить своё внимание на, например, PyGTK.
      > P.S. Если уж совсем не в мочь и к строкам так тянет, то допилите под себя LiteC

      зачем?

      просто теже регулярки взять - и даже на обычном С это все очень легко парсится.

      да даже теми же sscanf()ами можно без проблем тексты пилить. если вы конечно в курсе "%[^]" фишки.
      Ответить
      • > зачем?
        Для чего изобретать очередной новый парсер, когда достаточно вызвать одну( ну несколько) уже готовых функций.
        Учитывая цель приложения — сбор и отображение информации, преимущества языка С — не нужны.

        Если и писать это на С, то выберу регулярки - просто и привычнее.

        > если вы конечно в курсе...
        да, на глаза попадалось... вот и повод разобраться.
        Ответить
        • в целом по моему опыту тут дело не в языке - а именно в опыте разбора текста. я пару лет веб кравлеры/датамайнеры на перле ваял - после чего мне нужно было очень мало времени что бы этот опыт на С/С++ перенести.

          с другой стороны, если кто содержимое /proc/cpuinfo ведел, знает что он уже преднамерено отформатирован таким образом что бы его на чем угодно, включая шелл, можно было парсить. то говно сверху два раза не нужно.
          Ответить
    • а что, это обязательно парсить?
      Ответить
    • Так как же правильно парсить?
      //Аффтар кода
      Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий