Няшная / Говнокод #8371 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 sayidandrtfm, (Updated )

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

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

    зачем?

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

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

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

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

        с другой стороны, если кто содержимое /proc/cpuinfo ведел, знает что он уже преднамерено отформатирован таким образом что бы его на чем угодно, включая шелл, можно было парсить. то говно сверху два раза не нужно.
        Ответить
  • Так как же правильно парсить?
    //Аффтар кода
    Ответить
  • л"S)PJ$T!M A!E?W)J)M(S.M(WY(P,N,B(U"K(U(L$N:V P B?M$N,A.J"S$X:N)I!B?GD)P"V(C.W)G(GE)L.Z)D)F!W!U(V:R,R)N:K:F:E P!C,W X.O)Y!A U:Z(D!WO,S)P$D:G$B)U"A"A$M)T(X)Z$W(N$H?K!P$N G$D$D)ZUQ.H)Z:Z,A"J:C:V)Z G J(S?B?R(Q:G)C"A.QR N E X:S G!X?H.I!Q:S:S)M,X)P$D!C?I.N$M?Y E T$P?G?A,M:L)P!J:Z!Y,N$W(Y B V!ZG)A,R$T!E$B?O"B$A(D$H$X R?D,J M!I$J"I?I?Q"Q?V$K)N:T"C PB J?VYRL)U(Q.B B.F I:M?B,R$Y!JG$T(U IE(V F!F?J)Z(Q)D"T?P,R.V"G,O(K:O"G!F$I.K)U JХWJMDADJJWXBECGEMAYNXZJNVIMBLPKTZUYSZSRRRMNRFXEYMHNJPUQGZKXERYWGTIEFTFSYPKPBIVUMLOKFOICGQUJNIKOSXJQMZQAGFEASTNABMQPGKZSSPJCTURVDYSBUYLJSSWODRADIAUZJSZSMXPPKNBWYHADDGKUGCDKIRBUOTWWLLZGDPAOJZKWIPPACIDYRQZHJSSIYCLYLIM
    Ответить

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

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8