ReactOS  0.4.12-dev-945-g5a2911d
rgenstat.c File Reference
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <string.h>
#include <sys/io.h>
#include <errno.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <ctype.h>
Include dependency graph for rgenstat.c:

Go to the source code of this file.

Classes

struct  _API_INFO
 

Macros

#define MAX_PATH   260
 
#define DIR_SEPARATOR_CHAR   '/'
 
#define DIR_SEPARATOR_STRING   "/"
 
#define TAG_UNKNOWN   -1
 
#define TAG_IMPLEMENTED   0
 
#define TAG_UNIMPLEMENTED   1
 

Typedefs

typedef struct _API_INFO API_INFO
 
typedef struct _API_INFOPAPI_INFO
 

Functions

PAPI_INFO sort_linked_list (PAPI_INFO, unsigned, int(*)(PAPI_INFO, PAPI_INFO))
 
static charconvert_path (char *origpath)
 
static charpath_to_url (char *path)
 
static void write_line (char *line)
 
static void read_file (char *filename)
 
static void close_file ()
 
static int is_whitespace (char ch)
 
static int is_eol_char (char ch)
 
static int is_end_of_tag (char ch)
 
static int is_end_of_name (char ch)
 
static int is_valid_file (char *filename)
 
static int get_tag_id (char *tag)
 
static int skip_to_next_tag ()
 
static void skip_line ()
 
static void skip_comments ()
 
static int get_previous_identifier (unsigned int end, char *name)
 
static int skip_to_next_name (char *name)
 
static void get_filename (char *cvspath, char *filename, char *result)
 
static void parse_file (char *fullname, char *cvspath, char *filename)
 
static void process_directory (char *path, char *cvspath)
 
static int compare_api_order (PAPI_INFO p, PAPI_INFO q)
 
charget_filename_without_base (char *component_base, char *filename)
 
static void generate_xml_for_component (char *component_name, char *component_base)
 
static void read_input_file (char *input_file)
 
int main (int argc, char **argv)
 

Variables

static FILEin
 
static FILEout
 
static FILEfile_handle = NULL
 
static charfile_buffer = NULL
 
static unsigned int file_size = 0
 
static unsigned int file_pointer = 0
 
static char tagname [200]
 
static PAPI_INFO api_info_list = NULL
 
static char HELP []
 

Macro Definition Documentation

◆ DIR_SEPARATOR_CHAR

#define DIR_SEPARATOR_CHAR   '/'

Definition at line 33 of file rgenstat.c.

◆ DIR_SEPARATOR_STRING

#define DIR_SEPARATOR_STRING   "/"

Definition at line 34 of file rgenstat.c.

◆ MAX_PATH

#define MAX_PATH   260

Definition at line 31 of file rgenstat.c.

◆ TAG_IMPLEMENTED

#define TAG_IMPLEMENTED   0

Definition at line 41 of file rgenstat.c.

◆ TAG_UNIMPLEMENTED

#define TAG_UNIMPLEMENTED   1

Definition at line 42 of file rgenstat.c.

◆ TAG_UNKNOWN

#define TAG_UNKNOWN   -1

Definition at line 40 of file rgenstat.c.

Typedef Documentation

◆ API_INFO

◆ PAPI_INFO

Function Documentation

◆ close_file()

static void close_file ( )
static

Definition at line 165 of file rgenstat.c.

166 {
167  free(file_buffer);
168  file_buffer = NULL;
170  file_handle = NULL;
171  file_pointer = 0;
172 }
#define free
Definition: debug_ros.c:5
static char * file_buffer
Definition: rgenstat.c:60
smooth NULL
Definition: ftsmooth.c:416
static FILE * file_handle
Definition: rgenstat.c:59
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
static unsigned int file_pointer
Definition: rgenstat.c:62

Referenced by parse_file().

◆ compare_api_order()

static int compare_api_order ( PAPI_INFO  p,
PAPI_INFO  q 
)
static

Definition at line 669 of file rgenstat.c.

670 {
671  return strcmp(p->name, q->name);
672 }
GLdouble GLdouble GLdouble GLdouble q
Definition: gl.h:2063
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
GLfloat GLfloat p
Definition: glext.h:8902

Referenced by generate_xml_for_component().

◆ convert_path()

static char* convert_path ( char origpath)
static

Definition at line 68 of file rgenstat.c.

69 {
70  char* newpath;
71  int i;
72 
73  newpath = strdup(origpath);
74 
75  i = 0;
76  while (newpath[i] != 0)
77  {
78 #ifndef WIN32
79  if (newpath[i] == '\\')
80  {
81  newpath[i] = '/';
82  }
83 #else
84 #ifdef WIN32
85  if (newpath[i] == '/')
86  {
87  newpath[i] = '\\';
88  }
89 #endif
90 #endif
91  i++;
92  }
93  return(newpath);
94 }
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_Check_return_ _CRTIMP char *__cdecl strdup(_In_opt_z_ const char *_Src)

Referenced by main(), and read_input_file().

◆ generate_xml_for_component()

static void generate_xml_for_component ( char component_name,
char component_base 
)
static

Definition at line 682 of file rgenstat.c.

684 {
685  PAPI_INFO api_info;
686  char canonical_base[MAX_PATH];
687  char buf[200];
688  int complete;
689  int implemented_total;
690  int unimplemented_total;
691 
692  // Sort list
694 
695  implemented_total = 0;
696  unimplemented_total = 0;
697 
698  api_info = api_info_list;
699  while (api_info != NULL)
700  {
701  if (api_info->tag_id == TAG_IMPLEMENTED)
702  implemented_total ++;
703  else if (api_info->tag_id == TAG_UNIMPLEMENTED)
704  unimplemented_total ++;
705 
706  api_info = api_info->next;
707  }
708 
709  if (implemented_total + unimplemented_total > 0)
710  complete = ((implemented_total) * 100) / (implemented_total + unimplemented_total);
711  else
712  complete = 100;
713 
714  strcpy(canonical_base, component_base);
715  path_to_url(canonical_base);
716 
717  sprintf(buf, "<component name=\"%s\" base=\"%s\" complete=\"%d\" implemented_total=\"%d\" unimplemented_total=\"%d\">",
718  component_name, canonical_base, complete, implemented_total, unimplemented_total);
719  write_line(buf);
720 
721  if (api_info_list != NULL)
722  {
723  write_line("<functions>");
724 
725  api_info = api_info_list;
726  while (api_info != NULL)
727  {
728  sprintf(buf, "<f n=\"%s\" i=\"%s\" f=\"%s\" />",
729  api_info->name,
730  api_info->tag_id == TAG_IMPLEMENTED ? "true" : "false",
731  get_filename_without_base(component_base,
732  api_info->filename));
733  write_line(buf);
734  api_info = api_info->next;
735  }
736 
737  write_line("</functions>");
738  }
739 
740  write_line("</component>");
741 }
char filename[MAX_PATH]
Definition: rgenstat.c:49
static PAPI_INFO api_info_list
Definition: rgenstat.c:64
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define TAG_IMPLEMENTED
Definition: rgenstat.c:41
#define sprintf(buf, format,...)
Definition: sprintf.c:55
#define MAX_PATH
Definition: rgenstat.c:31
smooth NULL
Definition: ftsmooth.c:416
static int compare_api_order(PAPI_INFO p, PAPI_INFO q)
Definition: rgenstat.c:669
#define TAG_UNIMPLEMENTED
Definition: rgenstat.c:42
int tag_id
Definition: rgenstat.c:47
char name[100]
Definition: rgenstat.c:48
struct _API_INFO * next
Definition: rgenstat.c:46
static void write_line(char *line)
Definition: rgenstat.c:114
PAPI_INFO sort_linked_list(PAPI_INFO, unsigned, int(*)(PAPI_INFO, PAPI_INFO))
char * get_filename_without_base(char *component_base, char *filename)
Definition: rgenstat.c:675
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
static BOOL complete
Definition: htmldoc.c:198
static char * path_to_url(char *path)
Definition: rgenstat.c:97

Referenced by read_input_file().

◆ get_filename()

static void get_filename ( char cvspath,
char filename,
char result 
)
static

Definition at line 408 of file rgenstat.c.

409 {
410  strcpy(result, cvspath);
413 }
char * strcat(char *DstString, const char *SrcString)
Definition: utclib.c:568
const char * filename
Definition: ioapi.h:135
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
GLuint64EXT * result
Definition: glext.h:11304
static char * path_to_url(char *path)
Definition: rgenstat.c:97

Referenced by parse_file().

◆ get_filename_without_base()

char* get_filename_without_base ( char component_base,
char filename 
)

Definition at line 675 of file rgenstat.c.

677 {
678  return &filename[strlen(component_base)];
679 }
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
const char * filename
Definition: ioapi.h:135

Referenced by generate_xml_for_component().

◆ get_previous_identifier()

static int get_previous_identifier ( unsigned int  end,
char name 
)
static

Definition at line 341 of file rgenstat.c.

342 {
343  unsigned int my_file_pointer = end;
344  int len;
345 
346  name[0] = 0;
347 
348  while ((my_file_pointer > 0) && (is_whitespace(file_buffer[my_file_pointer])
349  || is_eol_char(file_buffer[my_file_pointer])))
350  {
351  my_file_pointer--;
352  }
353 
354  /* Skip any comments between function name and it's parameters */
355  if ((my_file_pointer > 0) && (file_buffer[my_file_pointer] == '/'))
356  {
357  if ((my_file_pointer > 0) && (file_buffer[my_file_pointer - 1] == '*'))
358  {
359  my_file_pointer--;
360  while ((my_file_pointer > 0) && !((file_buffer[my_file_pointer] == '*')
361  && (file_buffer[my_file_pointer - 1] == '/')))
362  {
363  my_file_pointer--;
364  }
365  my_file_pointer -= 2;
366  }
367  }
368 
369  /* Skip any remaining whitespace */
370  while ((my_file_pointer > 0) && (is_whitespace(file_buffer[my_file_pointer])))
371  {
372  my_file_pointer--;
373  }
374 
375  end = my_file_pointer;
376  while ((my_file_pointer > 0))
377  {
378  if (is_end_of_name(file_buffer[my_file_pointer]))
379  {
380  len = end - my_file_pointer;
381  strncpy(name, &file_buffer[my_file_pointer + 1], len);
382  name[len] = 0;
383  return 1;
384  }
385  my_file_pointer--;
386  }
387 
388  return 0;
389 }
static int is_whitespace(char ch)
Definition: rgenstat.c:175
char * strncpy(char *DstString, const char *SrcString, ACPI_SIZE Count)
Definition: utclib.c:427
static char * file_buffer
Definition: rgenstat.c:60
GLuint GLuint end
Definition: gl.h:1545
static int is_end_of_name(char ch)
Definition: rgenstat.c:225
GLenum GLsizei len
Definition: glext.h:6722
Definition: name.c:36
static int is_eol_char(char ch)
Definition: rgenstat.c:189

Referenced by skip_to_next_name().

◆ get_tag_id()

static int get_tag_id ( char tag)
static

Definition at line 256 of file rgenstat.c.

257 {
258  if (strcasecmp(tag, "implemented") == 0)
259  {
260  return TAG_IMPLEMENTED;
261  }
262  if (strcasecmp(tag, "unimplemented") == 0)
263  {
264  return TAG_UNIMPLEMENTED;
265  }
266  return TAG_UNKNOWN;
267 }
#define strcasecmp
Definition: fake.h:9
#define TAG_IMPLEMENTED
Definition: rgenstat.c:41
Definition: ecma_167.h:138
#define TAG_UNKNOWN
Definition: rgenstat.c:40
#define TAG_UNIMPLEMENTED
Definition: rgenstat.c:42

Referenced by skip_to_next_tag().

◆ is_end_of_name()

static int is_end_of_name ( char  ch)
static

Definition at line 225 of file rgenstat.c.

226 {
227  /* Currently the same as is_end_of_tag() */
228  return is_end_of_tag(ch);
229 }
static int is_end_of_tag(char ch)
Definition: rgenstat.c:203

Referenced by get_previous_identifier().

◆ is_end_of_tag()

static int is_end_of_tag ( char  ch)
static

Definition at line 203 of file rgenstat.c.

204 {
205  if ((ch >= 'a') && (ch <= 'z'))
206  {
207  return 0;
208  }
209  if ((ch >= 'A') && (ch <= 'Z'))
210  {
211  return 0;
212  }
213  if ((ch >= '0') && (ch <= '9'))
214  {
215  return 0;
216  }
217  if (ch == '_')
218  {
219  return 0;
220  }
221  return 1;
222 }

Referenced by is_end_of_name(), and skip_to_next_tag().

◆ is_eol_char()

static int is_eol_char ( char  ch)
static

Definition at line 189 of file rgenstat.c.

190 {
191  if (ch == '\r')
192  {
193  return 1;
194  }
195  if (ch == '\n')
196  {
197  return 1;
198  }
199  return 0;
200 }

Referenced by get_previous_identifier(), read_input_file(), and skip_line().

◆ is_valid_file()

static int is_valid_file ( char filename)
static

Definition at line 232 of file rgenstat.c.

233 {
234  char ext[MAX_PATH];
235  int i;
236 
237  i = strlen(filename);
238  while (i > 0 && filename[i] != '.')
239  {
240  i--;
241  }
242  if (i > 0)
243  {
244  memset(ext, 0, sizeof(ext));
245  strncpy(&ext[0], &filename[i], strlen(&filename[i]));
246 
247  if ((strncmp(ext, ".c", 2) == 0) || (strncmp(ext, ".C", 2) == 0))
248  {
249  return 1;
250  }
251  }
252  return 0;
253 }
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
char * strncpy(char *DstString, const char *SrcString, ACPI_SIZE Count)
Definition: utclib.c:427
const char * filename
Definition: ioapi.h:135
#define MAX_PATH
Definition: rgenstat.c:31
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
char ext[3]
Definition: mkdosfs.c:358
int strncmp(const char *String1, const char *String2, ACPI_SIZE Count)
Definition: utclib.c:534
#define memset(x, y, z)
Definition: compat.h:39

Referenced by process_directory().

◆ is_whitespace()

static int is_whitespace ( char  ch)
static

Definition at line 175 of file rgenstat.c.

176 {
177  if (ch == ' ')
178  {
179  return 1;
180  }
181  if (ch == '\t')
182  {
183  return 1;
184  }
185  return 0;
186 }

Referenced by get_previous_identifier(), and read_input_file().

◆ main()

int main ( int argc  ,
char **  argv 
)

Definition at line 876 of file rgenstat.c.

877 {
878  char *input_file;
879  char *output_file;
880 
881  if (argc != 3)
882  {
883  puts(HELP);
884  return 1;
885  }
886 
887  input_file = convert_path(argv[1]);
888  if (input_file[0] == 0)
889  {
890  free(input_file);
891  printf("Missing input-filename\n");
892  return 1;
893  }
894 
895  output_file = convert_path(argv[2]);
896  if (output_file[0] == 0)
897  {
898  free(input_file);
899  free(output_file);
900  printf("Missing output-filename\n");
901  return 1;
902  }
903 
904  out = fopen(output_file, "wb");
905  if (out == NULL)
906  {
907  free(input_file);
908  free(output_file);
909  printf("Cannot open output file");
910  return 1;
911  }
912 
913  read_input_file(input_file);
914 
915  free(input_file);
916  free(output_file);
917  fclose(out);
918 
919  return 0;
920 }
static int argc
Definition: ServiceArgs.c:12
static void read_input_file(char *input_file)
Definition: rgenstat.c:744
#define free
Definition: debug_ros.c:5
#define argv
Definition: mplay32.c:18
static char HELP[]
Definition: rgenstat.c:870
smooth NULL
Definition: ftsmooth.c:416
static char * convert_path(char *origpath)
Definition: rgenstat.c:68
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
int puts(const char *string)
Definition: crtsupp.c:23
static FILE * out
Definition: rgenstat.c:58
#define printf
Definition: config.h:203

◆ parse_file()

static void parse_file ( char fullname,
char cvspath,
char filename 
)
static

Definition at line 416 of file rgenstat.c.

417 {
418  PAPI_INFO api_info;
419  char prev[200];
420  char name[200];
421  int tag_id;
422 
423  read_file(fullname);
424 
425  prev[0] = 0;
426  do
427  {
428  tag_id = skip_to_next_tag();
429  if (tag_id == TAG_UNKNOWN)
430  {
431  break;
432  }
433 
434  /* Skip rest of the comments between the tag and the function name */
435  skip_comments();
436 
437  if (skip_to_next_name(name))
438  {
439  if (strlen(name) == 0)
440  {
441  printf("Warning: empty function name in file %s. Previous function name was %s.\n",
442  fullname, prev);
443  }
444  api_info = malloc(sizeof(API_INFO));
445  if (api_info == NULL)
446  {
447  printf("Out of memory\n");
448  exit(1);
449  }
450 
451  api_info->tag_id = tag_id;
452  strcpy(api_info->name, name);
453 
454  get_filename(cvspath, filename, api_info->filename);
455 
456  api_info->next = api_info_list;
457  api_info_list = api_info;
458  strcpy(prev, name);
459  }
460  } while (1);
461 
462  close_file();
463 }
char filename[MAX_PATH]
Definition: rgenstat.c:49
static void skip_comments()
Definition: rgenstat.c:321
static PAPI_INFO api_info_list
Definition: rgenstat.c:64
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
const char * filename
Definition: ioapi.h:135
static void close_file()
Definition: rgenstat.c:165
smooth NULL
Definition: ftsmooth.c:416
#define TAG_UNKNOWN
Definition: rgenstat.c:40
static int skip_to_next_name(char *name)
Definition: rgenstat.c:392
int tag_id
Definition: rgenstat.c:47
char name[100]
Definition: rgenstat.c:48
struct _API_INFO * next
Definition: rgenstat.c:46
static void get_filename(char *cvspath, char *filename, char *result)
Definition: rgenstat.c:408
Definition: name.c:36
static void read_file(char *filename)
Definition: rgenstat.c:129
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
#define malloc
Definition: debug_ros.c:4
static int skip_to_next_tag()
Definition: rgenstat.c:270
void exit(int exitcode)
Definition: _exit.c:33
#define printf
Definition: config.h:203

Referenced by process_directory().

◆ path_to_url()

static char* path_to_url ( char path)
static

Definition at line 97 of file rgenstat.c.

98 {
99  int i;
100 
101  i = 0;
102  while (path[i] != 0)
103  {
104  if (path[i] == '\\')
105  {
106  path[i] = '/';
107  }
108  i++;
109  }
110  return(path);
111 }
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
Definition: services.c:325

Referenced by generate_xml_for_component(), and get_filename().

◆ process_directory()

static void process_directory ( char path,
char cvspath 
)
static

Definition at line 527 of file rgenstat.c.

528 {
529  DIR *dirp;
530  struct dirent *entry;
531  struct stat stbuf;
532  char buf[MAX_PATH];
533  char newcvspath[MAX_PATH];
534 
535 #ifdef HAVE_D_TYPE
536  dirp = opendir(path);
537  if (dirp != NULL)
538  {
539  while ((entry = readdir(dirp)) != NULL)
540  {
541  if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
542  continue; // skip self and parent
543 
544  if (entry->d_type == DT_REG) // normal file
545  {
546  // Check for an absolute path
547  if (path[0] == DIR_SEPARATOR_CHAR)
548  {
549  strcpy(buf, path);
551  strcat(buf, entry->d_name);
552  }
553  else
554  {
555  if (!getcwd(buf, sizeof(buf)))
556  {
557  printf("Can't get CWD: %s\n", strerror(errno));
558  return;
559  }
561  strcat(buf, path);
562  strcat(buf, entry->d_name);
563  }
564 
565  if (stat(buf, &stbuf) == -1)
566  {
567  printf("Can't access '%s' (%s)\n", buf, strerror(errno));
568  return;
569  }
570 
571  if (S_ISDIR(stbuf.st_mode))
572  {
573  strcpy(newcvspath, cvspath);
574  strcat(newcvspath, f.name);
575  strcat(newcvspath, "/");
576 
577  process_directory(buf, newcvspath);
578  continue;
579  }
580 
581  /* Must be a .c file */
582  if (!is_valid_file(buf))
583  {
584  continue;
585  }
586 
587  parse_file(buf, cvspath, entry->d_name);
588  }
589  }
590  closedir(dirp);
591  }
592  else
593  {
594  printf("Can't open %s\n", path);
595  exit(1);
596  }
597 
598 #else
599 
600  dirp = opendir(path);
601  if (dirp != NULL)
602  {
603  while ((entry = readdir(dirp)) != NULL)
604  {
605  if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
606  continue; // skip self and parent
607 
608  // Check for an absolute path
609  if (path[0] == DIR_SEPARATOR_CHAR)
610  {
611  strcpy(buf, path);
613  strcat(buf, entry->d_name);
614  }
615  else
616  {
617  if (!getcwd(buf, sizeof(buf)))
618  {
619  printf("Can't get CWD: %s\n", strerror(errno));
620  return;
621  }
623  strcat(buf, path);
624  strcat(buf, entry->d_name);
625  }
626 
627  if (stat(buf, &stbuf) == -1)
628  {
629  printf("Can't access '%s' (%s)\n", buf, strerror(errno));
630  return;
631  }
632 
633  if (S_ISDIR(stbuf.st_mode))
634  {
635  strcpy(newcvspath, cvspath);
636  strcat(newcvspath, entry->d_name);
637  strcat(newcvspath, "/");
638 
639  process_directory(buf, newcvspath);
640  continue;
641  }
642 
643  /* Must be a .c file */
644  if (!is_valid_file(buf))
645  {
646  continue;
647  }
648 
649  parse_file(buf, cvspath, entry->d_name);
650  }
651  closedir(dirp);
652  }
653  else
654  {
655  printf("Can't open %s\n", path);
656  exit(1);
657  }
658 
659 #endif
660 }
static void process_directory(char *path, char *cvspath)
Definition: rgenstat.c:527
static int is_valid_file(char *filename)
Definition: rgenstat.c:232
char * strcat(char *DstString, const char *SrcString)
Definition: utclib.c:568
#define DIR_SEPARATOR_STRING
Definition: rgenstat.c:34
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
uint8_t entry
Definition: isohybrid.c:63
int errno
static void parse_file(char *fullname, char *cvspath, char *filename)
Definition: rgenstat.c:416
const char * strerror(int err)
Definition: compat_str.c:23
Definition: fatfs.h:198
DIR *__cdecl opendir(const char *)
#define MAX_PATH
Definition: rgenstat.c:31
#define DT_REG
Definition: fs.h:151
#define DIR_SEPARATOR_CHAR
Definition: rgenstat.c:33
Definition: dirent.h:39
smooth NULL
Definition: ftsmooth.c:416
GLfloat f
Definition: glext.h:7540
#define S_ISDIR(mode)
Definition: various.h:18
Definition: stat.h:55
int __cdecl closedir(DIR *)
_Check_return_ _Ret_opt_z_ _CRTIMP char *__cdecl getcwd(_Out_writes_opt_(_SizeInBytes) char *_DstBuf, _In_ int _SizeInBytes)
struct dirent *__cdecl readdir(DIR *)
_CRTIMP int __cdecl stat(const char *_Filename, struct stat *_Stat)
Definition: stat.h:345
Definition: services.c:325
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
void exit(int exitcode)
Definition: _exit.c:33
#define printf
Definition: config.h:203

Referenced by read_input_file().

◆ read_file()

static void read_file ( char filename)
static

Definition at line 129 of file rgenstat.c.

130 {
131  file_handle = fopen(filename, "rb");
132  if (file_handle == NULL)
133  {
134  printf("Can't open %s\n", filename);
135  exit(1);
136  }
137 
138  // Get the size of the file
141 
142  // Load it all into memory
144  if (file_buffer == NULL)
145  {
147  printf("Out of memory\n");
148  exit(1);
149  }
151  if (file_size > 0)
152  {
153  if (fread (file_buffer, 1, file_size, file_handle) < 1)
154  {
156  printf("Read error in file %s\n", filename);
157  exit(1);
158  }
159  }
160 
161  file_pointer = 0;
162 }
static unsigned int file_size
Definition: rgenstat.c:61
static char * file_buffer
Definition: rgenstat.c:60
const char * filename
Definition: ioapi.h:135
_Check_return_opt_ _CRTIMP size_t __cdecl fread(_Out_writes_bytes_(_ElementSize *_Count) void *_DstBuf, _In_ size_t _ElementSize, _In_ size_t _Count, _Inout_ FILE *_File)
smooth NULL
Definition: ftsmooth.c:416
_Check_return_opt_ _CRTIMP int __cdecl fseek(_Inout_ FILE *_File, _In_ long _Offset, _In_ int _Origin)
#define SEEK_SET
Definition: jmemansi.c:26
static FILE * file_handle
Definition: rgenstat.c:59
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
static unsigned int file_pointer
Definition: rgenstat.c:62
_Check_return_ _CRTIMP long __cdecl ftell(_Inout_ FILE *_File)
#define SEEK_END
Definition: cabinet.c:27
#define malloc
Definition: debug_ros.c:4
void exit(int exitcode)
Definition: _exit.c:33
#define printf
Definition: config.h:203

Referenced by parse_file().

◆ read_input_file()

static void read_input_file ( char input_file)
static

Definition at line 744 of file rgenstat.c.

745 {
746  char component_name[MAX_PATH];
747  char component_path[MAX_PATH];
748  char *canonical_path;
749  unsigned int index;
750  unsigned int start;
751  PAPI_INFO api_info;
752  PAPI_INFO next_api_info;
753  char *buffer;
754  unsigned int size;
755  int len;
756 
757  in = fopen(input_file, "rb");
758  if (in == NULL)
759  {
760  printf("Cannot open input file");
761  exit(1);
762  }
763 
764  // Get the size of the file
765  fseek(in, 0, SEEK_END);
766  size = ftell(in);
767 
768  // Load it all into memory
769  buffer = malloc(size);
770  if (buffer == NULL)
771  {
772  fclose(in);
773  printf("Out of memory\n");
774  exit(1);
775  }
776  fseek(in, 0, SEEK_SET);
777  if (fread (buffer, 1, size, in) < 1)
778  {
779  fclose(in);
780  printf("Read error in file %s\n", input_file);
781  exit(1);
782  }
783 
784  index = 0;
785 
786  write_line("<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>");
787  write_line("<?xml-stylesheet type=\"text/xsl\" href=\"rapistatus.xsl\"?>");
788  write_line("");
789  write_line("<components>");
790 
791  while (1)
792  {
793  /* Free previous list */
794  for (api_info = api_info_list; api_info != NULL; api_info = next_api_info)
795  {
796  next_api_info = api_info->next;
797  free(api_info);
798  }
800 
801  /* Skip whitespace and eol characters */
802  while ((index < size) && (is_whitespace(buffer[index]) || (is_eol_char(buffer[index]))))
803  index++;
804  if ((file_pointer < size) && (buffer[index] == '\n'))
805  index++;
806 
807  if (buffer[index] == ';')
808  {
809  /* Skip comments */
810  while ((index < size) && (!is_eol_char(buffer[index])))
811  index++;
812  if ((index < size) && (buffer[index] == '\n'))
813  index++;
814  continue;
815  }
816 
817  /* Get component name */
818  start = index;
819  while ((index < size) && (!is_whitespace(buffer[index])))
820  index++;
821  if (index >= size)
822  break;
823 
824  len = index - start;
825  strncpy(component_name, &buffer[start], len);
826  component_name[len] = 0;
827 
828  /* Skip whitespace */
829  while ((index < size) && (is_whitespace(buffer[index])))
830  index++;
831  if (index >= size)
832  break;
833 
834  /* Get component path */
835  start = index;
836  while ((index < size) && (!is_whitespace(buffer[index]) && !is_eol_char(buffer[index])))
837  index++;
838 
839  len = index - start;
840  strncpy(component_path, &buffer[start], len);
841  component_path[len] = 0;
842 
843  /* Append directory separator if needed */
844  if (component_path[strlen(component_path)] != DIR_SEPARATOR_CHAR)
845  {
846  int i = strlen(component_path);
847  component_path[strlen(component_path)] = DIR_SEPARATOR_CHAR;
848  component_path[i + 1] = 0;
849  }
850 
851  /* Skip to end of line */
852  while ((index < size) && (!is_eol_char(buffer[index])))
853  index++;
854  if ((index < size) && (buffer[index] == '\n'))
855  index++;
856 
857  canonical_path = convert_path(component_path);
858  if (canonical_path != NULL)
859  {
860  process_directory(canonical_path, canonical_path);
861  free(canonical_path);
862  generate_xml_for_component(component_name,
863  component_path);
864  }
865  }
866 
867  write_line("</components>");
868 }
static void process_directory(char *path, char *cvspath)
Definition: rgenstat.c:527
static PAPI_INFO api_info_list
Definition: rgenstat.c:64
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
static int is_whitespace(char ch)
Definition: rgenstat.c:175
char * strncpy(char *DstString, const char *SrcString, ACPI_SIZE Count)
Definition: utclib.c:427
#define free
Definition: debug_ros.c:5
GLuint buffer
Definition: glext.h:5915
#define MAX_PATH
Definition: rgenstat.c:31
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_Check_return_opt_ _CRTIMP size_t __cdecl fread(_Out_writes_bytes_(_ElementSize *_Count) void *_DstBuf, _In_ size_t _ElementSize, _In_ size_t _Count, _Inout_ FILE *_File)
#define DIR_SEPARATOR_CHAR
Definition: rgenstat.c:33
smooth NULL
Definition: ftsmooth.c:416
_Check_return_opt_ _CRTIMP int __cdecl fseek(_Inout_ FILE *_File, _In_ long _Offset, _In_ int _Origin)
GLuint index
Definition: glext.h:6031
#define SEEK_SET
Definition: jmemansi.c:26
GLsizeiptr size
Definition: glext.h:5919
#define index(s, c)
Definition: various.h:29
static char * convert_path(char *origpath)
Definition: rgenstat.c:68
GLenum GLsizei len
Definition: glext.h:6722
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
struct _API_INFO * next
Definition: rgenstat.c:46
static unsigned int file_pointer
Definition: rgenstat.c:62
static void write_line(char *line)
Definition: rgenstat.c:114
GLuint in
Definition: glext.h:9616
GLuint start
Definition: gl.h:1545
_Check_return_ _CRTIMP long __cdecl ftell(_Inout_ FILE *_File)
#define SEEK_END
Definition: cabinet.c:27
#define malloc
Definition: debug_ros.c:4
void exit(int exitcode)
Definition: _exit.c:33
static void generate_xml_for_component(char *component_name, char *component_base)
Definition: rgenstat.c:682
static int is_eol_char(char ch)
Definition: rgenstat.c:189
#define printf
Definition: config.h:203

Referenced by main().

◆ skip_comments()

static void skip_comments ( )
static

Definition at line 321 of file rgenstat.c.

322 {
323  while ((file_pointer < file_size))
324  {
325  if (file_buffer[file_pointer] == '*')
326  {
327  if ((file_pointer + 1 < file_size))
328  {
329  if (file_buffer[file_pointer + 1] == '/')
330  {
331  skip_line();
332  return;
333  }
334  }
335  }
336  file_pointer++;
337  }
338 }
static unsigned int file_size
Definition: rgenstat.c:61
static char * file_buffer
Definition: rgenstat.c:60
static void skip_line()
Definition: rgenstat.c:308
static unsigned int file_pointer
Definition: rgenstat.c:62

Referenced by parse_file().

◆ skip_line()

static void skip_line ( )
static

Definition at line 308 of file rgenstat.c.

309 {
311  {
312  file_pointer++;
313  }
314  if ((file_pointer < file_size) && (file_buffer[file_pointer] == '\n'))
315  {
316  file_pointer++;
317  }
318 }
static unsigned int file_size
Definition: rgenstat.c:61
static char * file_buffer
Definition: rgenstat.c:60
static unsigned int file_pointer
Definition: rgenstat.c:62
static int is_eol_char(char ch)
Definition: rgenstat.c:189

Referenced by skip_comments().

◆ skip_to_next_name()

static int skip_to_next_name ( char name)
static

Definition at line 392 of file rgenstat.c.

393 {
394  while ((file_pointer < file_size))
395  {
396  if (file_buffer[file_pointer] == '(')
397  {
399  }
400  file_pointer++;
401  }
402  return 0;
403 }
static int get_previous_identifier(unsigned int end, char *name)
Definition: rgenstat.c:341
static unsigned int file_size
Definition: rgenstat.c:61
static char * file_buffer
Definition: rgenstat.c:60
static unsigned int file_pointer
Definition: rgenstat.c:62
Definition: name.c:36

Referenced by parse_file().

◆ skip_to_next_tag()

static int skip_to_next_tag ( )
static

Definition at line 270 of file rgenstat.c.

271 {
272  unsigned int start;
273  int end_of_tag;
274  int found_tag = 0;
275  int tag_id;
276  int len;
277 
278  tagname[0] = 0;
279  while ((file_pointer < file_size) && (!found_tag))
280  {
281  if (file_buffer[file_pointer] == '@')
282  {
283  file_pointer++;
285  end_of_tag = 0;
286  while ((file_pointer < file_size) && (!end_of_tag))
287  {
288  end_of_tag = is_end_of_tag(file_buffer[file_pointer]);
289  file_pointer++;
290  }
291  len = file_pointer > start ? file_pointer - start - 1 : 0;
293  tagname[len] = 0;
294 
295  tag_id = get_tag_id(tagname);
296  if (tag_id != TAG_UNKNOWN)
297  {
298  return tag_id;
299  }
300  }
301  file_pointer++;
302  }
303 
304  return TAG_UNKNOWN;
305 }
static unsigned int file_size
Definition: rgenstat.c:61
char * strncpy(char *DstString, const char *SrcString, ACPI_SIZE Count)
Definition: utclib.c:427
static char * file_buffer
Definition: rgenstat.c:60
static int get_tag_id(char *tag)
Definition: rgenstat.c:256
#define TAG_UNKNOWN
Definition: rgenstat.c:40
static char tagname[200]
Definition: rgenstat.c:63
GLenum GLsizei len
Definition: glext.h:6722
static unsigned int file_pointer
Definition: rgenstat.c:62
GLuint start
Definition: gl.h:1545
static int is_end_of_tag(char ch)
Definition: rgenstat.c:203

Referenced by parse_file().

◆ sort_linked_list()

PAPI_INFO sort_linked_list ( PAPI_INFO  ,
unsigned  ,
int(*)(PAPI_INFO, PAPI_INFO  
)

◆ write_line()

static void write_line ( char line)
static

Definition at line 114 of file rgenstat.c.

115 {
116  char buf[200];
117 
118  memset(buf, 0, sizeof(buf));
119  strcpy(buf, line);
120  /* Terminate the line */
121  buf[strlen(buf)] = '\r';
122  buf[strlen(buf)] = '\n';
123 
124  (void)fwrite(&buf[0], 1, strlen(buf), out);
125 }
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:49
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
_Check_return_opt_ _CRTIMP size_t __cdecl fwrite(_In_reads_bytes_(_Size *_Count) const void *_Str, _In_ size_t _Size, _In_ size_t _Count, _Inout_ FILE *_File)
Definition: parser.c:48
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
static FILE * out
Definition: rgenstat.c:58
#define memset(x, y, z)
Definition: compat.h:39

Referenced by generate_xml_for_component(), and read_input_file().

Variable Documentation

◆ api_info_list

PAPI_INFO api_info_list = NULL
static

Definition at line 64 of file rgenstat.c.

Referenced by generate_xml_for_component(), parse_file(), and read_input_file().

◆ file_buffer

◆ file_handle

FILE* file_handle = NULL
static

Definition at line 59 of file rgenstat.c.

Referenced by close_file(), and read_file().

◆ file_pointer

unsigned int file_pointer = 0
static

◆ file_size

unsigned int file_size = 0
static

Definition at line 61 of file rgenstat.c.

Referenced by read_file(), skip_comments(), skip_line(), skip_to_next_name(), and skip_to_next_tag().

◆ HELP

char HELP[]
static
Initial value:
=
"RGENSTAT input-filename output-filename\n"
"\n"
" input-filename File containing list of components to process\n"
" output-filename File to create\n"

Definition at line 870 of file rgenstat.c.

Referenced by main().

◆ in

FILE* in
static

Definition at line 57 of file rgenstat.c.

◆ out

FILE* out
static

Definition at line 58 of file rgenstat.c.

Referenced by main(), and write_line().

◆ tagname