Advertisement
Guest User

lab hdr

a guest
Sep 23rd, 2016
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.96 KB | None | 0 0
  1. /*Вывести на экран содержимое файла с программой на языке С, выделяя в строке все заголовки функций*/
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <windows.h>
  5. #define BEGIN 1
  6. #define END 0
  7. //#define _CRT_SECURE_NO_WARNINGS 1
  8.  
  9. void main(void)
  10. {
  11.     FILE *f;
  12.     HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
  13.     char line[1024]; // считываемая строка файла
  14.     int i=0, flag=0, flag_hdr=0; // flag - на комментарий, flag_hdr - на заголовок
  15.     f=fopen("test.txt", "r");
  16.     if (f==NULL) return;
  17.     while (! feof(f))
  18.     {
  19.         fgets (line, 1024, f);
  20.         if (strstr(line, "/*") && !strstr(line, "*/")) flag=BEGIN;
  21.         if  ((((strstr(line, "int "))!=NULL)||(strstr(line, "void "))!=NULL) && (strstr(line, "["))==NULL && (strstr(line, "="))==NULL || (flag_hdr!=END) || (flag==BEGIN)) // если в строке есть тип INT или VOID, открывающая скобка и это не объявление и инициализация переменной или уже ранее начался заголовок
  22.         {
  23.             for (i=0; line[i]!='\0'; i++) // пока не закончится строка
  24.             {
  25.                 /*Если встречен просто комментарий*/
  26.                 /*то, начиная с //, всё записывать (белым) и выход из цикла (переход на след строку)*/
  27.                 SetConsoleTextAttribute(handle, 15); // белый
  28.                 if (line[i]=='/' && line[i+1]=='/')
  29.                 {
  30.                     printf(strstr(line,"//"));
  31.                     break;
  32.                 }
  33.                 else
  34.                 {
  35.                     /*Если встречен граничный комментарий*/
  36.                     /*поднять на него флаг и записывать всё (белым), пока очередные символы не будут закрывающей границей*/
  37.                     if (line [i]=='/' && line [i+1]=='*' || flag==BEGIN)
  38.                     {
  39.                         flag=BEGIN;
  40.                         printf("%c", line[i]);
  41.                         if (line[i-1]=='*' && line [i]=='/')
  42.                             flag=END;
  43.                         if (line[i]=='\0')
  44.                             break;
  45.                     }
  46.                     else
  47.                         /*Если встречена ;*/
  48.                         /*написать её (белым)*/
  49.                         if ((line[i]==';') || (line[i]==' '))
  50.                             printf("%c", line[i]);
  51.                         /*Если встречено всё остальное*/
  52.                         /*записывать красным, вернуть белый*/
  53.                         else
  54.                         {
  55.                             if ((flag!=BEGIN) || (flag_hdr!=END)) // если это не часть ранее открытого комментария или заголовок уже начался
  56.                             {
  57.                             SetConsoleTextAttribute(handle, 12); // красный
  58.                             printf("%c", line[i]);
  59.                             flag_hdr=BEGIN;
  60.                             if (strstr(line, ")"))
  61.                                 flag_hdr=END;
  62.                             }
  63.                         }
  64.                 }
  65.             }
  66.         }
  67.         else // если не строка с заголовком
  68.         {
  69.             SetConsoleTextAttribute(handle, 15);
  70.             printf(line);
  71.         }
  72.     }
  73.     fclose (f);
  74.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement