<testcase>
<info>
<keywords>
checksrc
</keywords>
</info>

#
# Client-side
<client>
<server>
none
</server>
<name>
checksrc
</name>

<command type="perl">
%SRCDIR/../scripts/checksrc.pl %LOGDIR/code%TESTNUMBER.c
</command>
<file name="%LOGDIR/code%TESTNUMBER.c">
/* test source code
 * Violate each rule at least once.
 **/
int hello; /*------------------------------------------------------------------*/
int	tab;
int trailing_space;
int a = func ();
int b = func( b);
int b = func(b );
func(a, b , c);

int hello()
{
  return(2);
}
func(a, b,c);

if(a == 2) {
  ;
} else {
  moo = 2;
}

if(a == 2){ /* followed by comment */
  ;
}

func() ;

a = sprintf(buffer, "%s", moo);

FILE *f = fopen("filename", "r");

void startfunc(int a, int b) {
  func();
}

 for(;;) {
     func(1);
 } while(1);

 char * name = "hello";
 char* name = "hello";

 int foo=bar;
 int foo= bar;
 int foo = bar;
 int foo = bar;foo++;
 for(;;)  {
 }

 int a = sizeof int;
 int a = snprintf(buffer, sizeof(buffer), "%d", 99);

 if(a) b++;

 // CPP comment?

 /* comment doesn't end

</file>
</client>

#
# Verify data after the test has been "shot"
<verify>
<stdout>
./%LOGDIR/code1185.c:4:82: warning: Longer than 79 columns (LONGLINE)
 int hello; /*------------------------------------------------------------------*/
./%LOGDIR/code1185.c:5:4: error: Contains TAB character (TABS)
 int	tab;
    ^
./%LOGDIR/code1185.c:7:13: warning:  func with space (SPACEBEFOREPAREN)
 int a = func ();
             ^
./%LOGDIR/code1185.c:8:14: warning: space after open parenthesis (SPACEAFTERPAREN)
 int b = func( b);
              ^
./%LOGDIR/code1185.c:9:16: warning: space before close parenthesis (SPACEBEFORECLOSE)
 int b = func(b );
                ^
./%LOGDIR/code1185.c:10:11: warning: space before comma (SPACEBEFORECOMMA)
 func(a, b , c);
           ^
./%LOGDIR/code1185.c:14:9: warning: return without space before paren (RETURNNOSPACE)
   return(2);
         ^
./%LOGDIR/code1185.c:16:11: warning: comma without following space (COMMANOSPACE)
 func(a, b,c);
           ^
./%LOGDIR/code1185.c:18:12: warning: wrongly placed open brace (BRACEPOS)
 if(a == 2) {
            ^
./%LOGDIR/code1185.c:20:1: warning: else after closing brace on same line (BRACEELSE)
 } else {
 ^
./%LOGDIR/code1185.c:24:11: warning: missing space after close paren (PARENBRACE)
 if(a == 2){  
           ^
./%LOGDIR/code1185.c:28:7: warning: no space before semicolon (SPACESEMICOLON)
 func() ;
       ^
./%LOGDIR/code1185.c:30:5: warning: use of sprintf is banned (BANNEDFUNC)
 a = sprintf(buffer, "%s", moo);
     ^
./%LOGDIR/code1185.c:32:11: warning: use of non-binary fopen without FOPEN_* macro: r (FOPENMODE)
 FILE *f = fopen("filename", "r");
           ^
./%LOGDIR/code1185.c:34:30: warning: wrongly placed open brace (BRACEPOS)
 void startfunc(int a, int b) {
                              ^
./%LOGDIR/code1185.c:39:6: warning: not indented 2 steps (uses 4) (INDENTATION)
      func(1);
      ^
./%LOGDIR/code1185.c:42:8: warning: space after declarative asterisk (ASTERISKSPACE)
  char * name = "hello";
        ^
./%LOGDIR/code1185.c:43:7: warning: space after declarative asterisk (ASTERISKSPACE)
  char* name = "hello";
       ^
./%LOGDIR/code1185.c:43:6: warning: no space before asterisk (ASTERISKNOSPACE)
  char* name = "hello";
      ^
./%LOGDIR/code1185.c:45:10: warning: no space after equals sign (EQUALSNOSPACE)
  int foo=bar;
          ^
./%LOGDIR/code1185.c:46:9: warning: no space before equals sign (NOSPACEEQUALS)
  int foo= bar;
         ^
./%LOGDIR/code1185.c:48:16: warning: no space after semicolon (SEMINOSPACE)
  int foo = bar;foo++;
                ^
./%LOGDIR/code1185.c:49:10: warning: multiple spaces (MULTISPACE)
  for(;;)  {
          ^
./%LOGDIR/code1185.c:50:2: warning: not indented 2 steps (uses 0) (INDENTATION)
  }
  ^
./%LOGDIR/code1185.c:52:16: warning: sizeof without parenthesis (SIZEOFNOPAREN)
  int a = sizeof int;
                ^
./%LOGDIR/code1185.c:53:10: warning: use of snprintf is banned (SNPRINTF)
  int a = snprintf(buffer, sizeof(buffer), "%d", 99);
          ^
./%LOGDIR/code1185.c:55:7: warning: conditional block on the same line (ONELINECONDITION)
  if(a) b++;
       ^
./%LOGDIR/code1185.c:57:2: warning: // comment (CPPCOMMENTS)
  // CPP comment?
  ^
./%LOGDIR/code1185.c:1:1: error: Missing copyright statement (COPYRIGHT)
 
 ^
./%LOGDIR/code1185.c:1:1: error: Missing closing comment (OPENCOMMENT)
 
 ^
checksrc: 0 errors and 30 warnings
</stdout>
<errorcode>
5
</errorcode>
</verify>
</testcase>
