ReactOS  0.4.12-dev-701-g3ddf59e
find.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <windef.h>
#include <winbase.h>
#include <winuser.h>
#include <dos.h>
#include "resource.h"
Include dependency graph for find.c:

Go to the source code of this file.

Macros

#define MAX_STR   1024
 

Functions

int find_str (char *sz, FILE *p, int invert_search, int count_lines, int number_output, int ignore_case)
 
void usage (void)
 
int main (int argc, char **argv)
 

Macro Definition Documentation

◆ MAX_STR

#define MAX_STR   1024

Definition at line 43 of file find.c.

Function Documentation

◆ find_str()

int find_str ( char sz,
FILE p,
int  invert_search,
int  count_lines,
int  number_output,
int  ignore_case 
)

Definition at line 52 of file find.c.

54 {
55  int i, length;
56  long line_number = 0, total_lines = 0;
57  char *c, temp_str[MAX_STR], this_line[MAX_STR];
58 
59  /* Convert to upper if needed */
60  if (ignore_case)
61  {
62  length = strlen (sz);
63  for (i = 0; i < length; i++)
64  sz[i] = toupper (sz[i]);
65  }
66 
67  /* Scan the file until EOF */
68  while (fgets (temp_str, MAX_STR, p) != NULL)
69  {
70  /* Remove the trailing newline */
72  if (temp_str[length-1] == '\n')
73  {
74  temp_str[length-1] = '\0';
75  }
76 
77  /* Increment number of lines */
78  line_number++;
79  strcpy (this_line, temp_str);
80 
81  /* Convert to upper if needed */
82  if (ignore_case)
83  {
84  for (i = 0; i < length; i++)
85  {
86  temp_str[i] = toupper (temp_str[i]);
87  }
88  }
89 
90  /* Locate the substring */
91 
92  /* strstr() returns a pointer to the first occurrence in the
93  string of the substring */
94  c = strstr (temp_str, sz);
95 
96  if ( ((invert_search) ? (c == NULL) : (c != NULL)) )
97  {
98  if (!count_lines)
99  {
100  if (number_output)
101  printf ("%ld:", line_number);
102 
103  /* Print the line of text */
104  puts (this_line);
105  }
106 
107  total_lines++;
108  } /* long if */
109  } /* while fgets */
110 
111  if (count_lines)
112  {
113  /* Just show num. lines that contain the string */
114  printf ("%ld\n", total_lines);
115  }
116 
117 
118  /* RETURN: If the string was found at least once, returns 1.
119  * If the string was not found at all, returns 0.
120  */
121  return (total_lines > 0 ? 1 : 0);
122 }
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define MAX_STR
Definition: find.c:43
char * strstr(char *String1, char *String2)
Definition: utclib.c:653
int line_number
Definition: parser.yy.c:775
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
smooth NULL
Definition: ftsmooth.c:416
int toupper(int c)
Definition: utclib.c:881
GLenum GLuint GLenum GLsizei length
Definition: glext.h:5579
const GLubyte * c
Definition: glext.h:8905
int puts(const char *string)
Definition: crtsupp.c:23
_Check_return_opt_ _CRTIMP char *__cdecl fgets(_Out_writes_z_(_MaxCount) char *_Buf, _In_ int _MaxCount, _Inout_ FILE *_File)
static CHAR temp_str[MAX_PATH]
Definition: dispatch.c:32
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
#define c
Definition: ke_i.h:80
GLfloat GLfloat p
Definition: glext.h:8902
#define printf
Definition: config.h:203

Referenced by main().

◆ main()

int main ( int argc  ,
char **  argv 
)

Definition at line 139 of file find.c.

140 {
141  char *opt, *needle = NULL;
142  int ret = 0;
143  WCHAR wszMessage[4096];
144  char oemMessage[4096];
145 
146  int invert_search = 0; /* flag to invert the search */
147  int count_lines = 0; /* flag to whether/not count lines */
148  int number_output = 0; /* flag to print line numbers */
149  int ignore_case = 0; /* flag to be case insensitive */
150 
151  FILE *pfile; /* file pointer */
152  int hfind; /* search handle */
153  struct _finddata_t finddata; /* _findfirst, filenext block */
154 
155  /* Scan the command line */
156  while ((--argc) && (needle == NULL))
157  {
158  if (*(opt = *++argv) == '/')
159  {
160  switch (opt[1])
161  {
162  case 'c':
163  case 'C': /* Count */
164  count_lines = 1;
165  break;
166 
167  case 'i':
168  case 'I': /* Ignore */
169  ignore_case = 1;
170  break;
171 
172  case 'n':
173  case 'N': /* Number */
174  number_output = 1;
175  break;
176 
177  case 'v':
178  case 'V': /* Not with */
179  invert_search = 1;
180  break;
181 
182  default:
183  usage ();
184  exit (2); /* syntax error .. return error 2 */
185  break;
186  }
187  }
188  else
189  {
190  /* Get the string */
191  if (needle == NULL)
192  {
193  /* Assign the string to find */
194  needle = *argv;
195  }
196  }
197  }
198 
199  /* Check for search string */
200  if (needle == NULL)
201  {
202  /* No string? */
203  usage ();
204  exit (1);
205  }
206 
207  /* Scan the files for the string */
208  if (argc == 0)
209  {
210  ret = find_str (needle, stdin, invert_search, count_lines,
211  number_output, ignore_case);
212  }
213 
214  while (--argc >= 0)
215  {
216  hfind = _findfirst (*++argv, &finddata);
217  if (hfind < 0)
218  {
219  /* We were not able to find a file. Display a message and
220  set the exit status. */
221  LoadStringW (GetModuleHandleW (NULL), IDS_NO_SUCH_FILE, wszMessage, sizeof(wszMessage) / sizeof(wszMessage[0]));
222  CharToOemW (wszMessage, oemMessage);
223  fprintf (stderr, oemMessage, *argv);
224  }
225  else
226  {
227  /* repeat find next file to match the filemask */
228  do
229  {
230  /* We have found a file, so try to open it */
231  if ((pfile = fopen (finddata.name, "r")) != NULL)
232  {
233  printf ("---------------- %s\n", finddata.name);
234  ret = find_str (needle, pfile, invert_search, count_lines,
235  number_output, ignore_case);
236  fclose (pfile);
237  }
238  else
239  {
240  LoadStringW (GetModuleHandleW (NULL), IDS_CANNOT_OPEN, wszMessage, sizeof(wszMessage) / sizeof(wszMessage[0]));
241  CharToOemW (wszMessage, oemMessage);
242  fprintf (stderr, oemMessage,
243  finddata.name);
244  }
245  }
246  while (_findnext(hfind, &finddata) > 0);
247  }
248  _findclose(hfind);
249  } /* for each argv */
250 
251  /* RETURN: If the string was found at least once, returns 0.
252  * If the string was not found at all, returns 1.
253  * (Note that find_str.c returns the exact opposite values.)
254  */
255  exit ( (ret ? 0 : 1) );
256 }
static int argc
Definition: ServiceArgs.c:12
#define IDS_CANNOT_OPEN
Definition: resource.h:5
int _findclose(intptr_t handle)
Definition: find.c:11
__wchar_t WCHAR
Definition: xmlstorage.h:180
FILE * stdin
#define argv
Definition: mplay32.c:18
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
smooth NULL
Definition: ftsmooth.c:416
_CRTIMP int __cdecl _findnext(intptr_t _FindHandle, struct _finddata_t *_FindData)
void usage(void)
Definition: find.c:126
int ret
_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 find_str(char *sz, FILE *p, int invert_search, int count_lines, int number_output, int ignore_case)
Definition: find.c:52
_CRTIMP intptr_t __cdecl _findfirst(const char *_Filename, struct _finddata_t *_FindData)
#define IDS_NO_SUCH_FILE
Definition: resource.h:4
FILE * stderr
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:845
Definition: io.h:37
void exit(int exitcode)
Definition: _exit.c:33
BOOL WINAPI CharToOemW(_In_ LPCWSTR pSrc, _Out_writes_(_Inexpressible_(strlen(pSrc)+1)) LPSTR pDst)
#define printf
Definition: config.h:203

◆ usage()

void usage ( void  )

Definition at line 126 of file find.c.

127 {
128  WCHAR wszUsage[4096];
129  char oemUsage[4096];
130 
131  LoadStringW (GetModuleHandleW (NULL), IDS_USAGE, wszUsage, sizeof(wszUsage) / sizeof(wszUsage[0]));
132  CharToOemW (wszUsage, oemUsage);
133  fputs (oemUsage, stdout);
134 }
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define IDS_USAGE
Definition: resource.h:3
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
FILE * stdout
smooth NULL
Definition: ftsmooth.c:416
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:845
BOOL WINAPI CharToOemW(_In_ LPCWSTR pSrc, _Out_writes_(_Inexpressible_(strlen(pSrc)+1)) LPSTR pDst)
_Check_return_opt_ _CRTIMP int __cdecl fputs(_In_z_ const char *_Str, _Inout_ FILE *_File)

Referenced by main().