Free Downloads, Community Forum,
FAQs and Developer Resources


Make /Tools Your Home | Link to us

Today's posts | Posts since last visit | Most Active Topics

All Forums Register Login Search Subscriptions My Profile Inbox
Tool Warehouse FAQs Resources Help Member List Address Book Logout

Flex does not correctly ignore a whitespace defition

 
Logged in as: Guest
Users viewing this topic: none
  Printable Version
All Forums >> [SFU / Interix / SUA Technology] >> Tools Discussion Forum >> Flex does not correctly ignore a whitespace defition Page: [1] 2   next >   >>
Login
Message << Older Topic   Newer Topic >>
Flex does not correctly ignore a whitespace defition - Aug. 19, '04, 12:14:48 PM   
henrikbach

 

Posts: 28
Joined: Jul. 9, '04,
From: Copenhagen, Denmark
Status: offline
Hi

I experience problems with flex 2.5.4 when ignoring whitespaces given by the defintion:

[ \t\n\r]+ { /* Ignore whitespace */ }

The flex program produces this output:

Length = 23
WhatsInBuffer=include "../Target.td"

...

idx hex char
0 69 i
1 6E n
2 63 c
3 6C l
4 75 u
5 64 d
6 65 e
7 20
8 22 "
9 2E .
10 2E .
11 2F /
12 54 T
13 61 a
14 72 r
15 67 g
16 65 e
17 74 t
18 2E .
19 74 t
20 64 d
21 22 "
22 D

On other *IX systems the flex program correctly ignores the last character (0xD) as a whitespace, thus Length = 22 instead of 23.

Any suggestions?


/Henrik
Post #: 1
RE: Flex does not correctly ignore a whitespace defition - Aug. 19, '04, 2:23:15 PM   
Rodney

 

Posts: 3729
Joined: Jul. 9, '02,
From: /Tools lab
Status: offline
I've just written a small flex program that is based on the first example
on the flex man page and slightly modified for debugging. I have the same
text in a file named "in" as you have given. I get from the program and by
hand a count of 21. You'll need to show us your whole flex program because
this indicates to me that there is an earlier rule matching than your whitespace
rule. My test code is:
        int num_chars = 0;

%%
[ \t\n\r]+      printf("ignore: %s %d\n", yytext, yytext[0]);
.       ++num_chars; printf("count: %d %s\n", num_chars, yytext);

%%
main()
        {
        yylex();
        printf( "# of chars = %d\n", num_chars );
        }


then compiled as "flex t2; gcc lex.yy.c -fl"
and then run as "cat in | ./a.out" to produce:
count: 1 i
count: 2 n
count: 3 c
count: 4 l
count: 5 u
count: 6 d
count: 7 e
ignore:   32
count: 8 "
count: 9 .
count: 10 .
count: 11 /
count: 12 T
count: 13 a
count: 14 r
count: 15 g
count: 16 e
count: 17 t
count: 18 .
count: 19 t
count: 20 d
count: 21 "
ignore:
 10
# of chars = 21

(in reply to henrikbach)
Post #: 2
RE: Flex does not correctly ignore a whitespace defition - Aug. 19, '04, 3:22:48 PM   
henrikbach

 

Posts: 28
Joined: Jul. 9, '04,
From: Copenhagen, Denmark
Status: offline
my complete flex program is this:
---- Start ----------------------
/*===-- FileLexer.l - Scanner for TableGen Files ----------------*- C++ -*-===//
// 
//                     The LLVM Compiler Infrastructure
//
// This file was developed by the LLVM research group and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
// 
//===----------------------------------------------------------------------===//
//
// This file defines a simple flex scanner for TableGen files.  This is pretty
// straight-forward, except for the magic to handle file inclusion.
//
//===----------------------------------------------------------------------===*/

%option prefix="File"
%option yylineno
%option nostdinit
%option never-interactive
%option batch
%option nodefault
%option 8bit
%option outfile="Lexer.cpp"
%option ecs
%option noreject
%option noyymore

%x comment

%{
//hb:-->
#ifdef __INTERIX
# define _ALL_SOURCE
# define _GLIBCPP_USE_C99_DYNAMIC 1
# define _GLIBCPP_USE_C99_LONG_LONG_DYNAMIC 1
#endif
//hb:--<

#include "Record.h"
typedef std::pair<llvm::Record*, std::vector<llvm::Init*>*> SubClassRefTy;
#include "FileParser.h"

int Fileparse();

namespace llvm {

// Global variable recording the location of the include directory
std::string IncludeDirectory;

/// ParseInt - This has to handle the special case of binary numbers 0b0101
///
static int ParseInt(const char *Str) {
  if (Str[0] == '0' && Str[1] == 'b')
    return strtol(Str+2, 0, 2);
  return strtol(Str, 0, 0); 
}

static int CommentDepth = 0;

struct IncludeRec {
  std::string Filename;
  FILE *File;
  unsigned LineNo;
  YY_BUFFER_STATE Buffer;

  IncludeRec(const std::string &FN, FILE *F)
    : Filename(FN), File(F), LineNo(0){
  }
};

static std::vector<IncludeRec> IncludeStack;

std::ostream &err() {
  if (IncludeStack.empty())
    return std::cerr << "At end of input: ";

  for (unsigned i = 0, e = IncludeStack.size()-1; i != e; ++i)
    std::cerr << "Included from " << IncludeStack[i].Filename << ":"
              << IncludeStack[i].LineNo << ":\n";
  return std::cerr << "Parsing " << IncludeStack.back().Filename << ":"
                   << Filelineno << ": ";
}

/// ParseFile - this function begins the parsing of the specified tablegen file.
///
void ParseFile(const std::string &Filename, const std::string & IncludeDir) {
  FILE *F = stdin;
  if (Filename != "-") {
    F = fopen(Filename.c_str(), "r");

    if (F == 0) {
      std::cerr << "Could not open input file '" + Filename + "'!\n";
      exit (1);
    }
    IncludeStack.push_back(IncludeRec(Filename, F));
  } else {
    IncludeStack.push_back(IncludeRec("<stdin>", stdin));
  }

  // Record the location of the include directory so that the lexer can find
  // it later.
  IncludeDirectory = IncludeDir;
 
  Filein = F;
  Filelineno = 1;
  Fileparse();
  Filein = stdin;
}

/// HandleInclude - This function is called when an include directive is
/// encountered in the input stream...
///
static void HandleInclude(const char *Buffer) {
  unsigned Length = yyleng;
  //hb: -->
  std::cerr << "Length = " << Length << "\n";
  printf ("idx\thex\tchar\n");
  for (uint i=0; i < Length; i++)
  {
        printf ("%d\t%X\t%c\n", i, Buffer[i], Buffer[i]);
  }
  std::string WhatsInBuffer(Buffer, Buffer+Length);
  std::cerr << "WhatsInBuffer=" << WhatsInBuffer << "\n";
  if (Buffer[Length-1] == '"')
        std::cerr << "assert=true\n";
  else
        std::cerr << "assert=false\n";
  //hb: --<
  assert(Buffer[Length-1] == '"'); //hb: Don't you mean != "", because the line ends with "
  Buffer += strlen("include ");
  Length -= strlen("include ");
  while (*Buffer != '"') {
    ++Buffer;
    --Length;
  }
  assert(Length >= 2 && "Double quotes not found?");
  std::string Filename(Buffer+1, Buffer+Length-1);
  std::cerr << "Filename = '" << Filename << "'\n"; //hb:

  // Save the line number and lex buffer of the includer...
  IncludeStack.back().LineNo = Filelineno;
  IncludeStack.back().Buffer = YY_CURRENT_BUFFER;

  // Open the new input file...
  yyin = fopen(Filename.c_str(), "r");
  if (yyin == 0) {
    // If we couldn't find the file in the current directory, look for it in
    // the include directories.
    //
    // NOTE: Right now, there is only one directory.  We need to eventually add
    // support for more.
    std::string NextFilename = IncludeDirectory + "/" + Filename;
    yyin = fopen(NextFilename.c_str(), "r");
    if (yyin == 0) {
//hb:      err() << "Could not find include file '" << Filename << "'!\n";
      err() << "Could not find include file '" << NextFilename << "'!\n"; //hb:
      exit(1);
    }
    Filename = NextFilename;
  }

  // Add the file to our include stack...
  IncludeStack.push_back(IncludeRec(Filename, yyin));
  Filelineno = 1;  // Reset line numbering...
  //yyrestart(yyin);    // Start lexing the new file...

  yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
}

/// yywrap - This is called when the lexer runs out of input in one of the
/// files. Switch back to an includer if an includee has run out of input.
///
extern "C"
int yywrap() {
  if (IncludeStack.back().File != stdin)
    fclose(IncludeStack.back().File);
  IncludeStack.pop_back();
  if (IncludeStack.empty()) return 1;  // Top-level file is done.

  // Otherwise, we need to switch back to a file which included the current one.
  Filelineno = IncludeStack.back().LineNo;  // Restore current line number
  yy_switch_to_buffer(IncludeStack.back().Buffer);
  return 0;
}

} // End llvm namespace

using namespace llvm;

%}

Comment      \/\/.*

Identifier   [a-zA-Z_][0-9a-zA-Z_]*
Integer      [-+]?[0-9]+|0x[0-9a-fA-F]+|0b[01]+
CodeFragment \[\{([^}]+|\}[^\]])*\}\]
StringVal    \"[^"]*\"
IncludeStr   include[ \t\n]+\"[^"]*\"

%%

{Comment}      { /* Ignore comments */ }

{IncludeStr}   { HandleInclude(yytext); }
{CodeFragment} { Filelval.StrVal = new std::string(yytext+2, yytext+yyleng-2);
                 return CODEFRAGMENT; }

int            { return INT; }
bit            { return BIT; }
bits           { return BITS; }
string         { return STRING; }
list           { return LIST; }
code           { return CODE; }
dag            { return DAG; }

class          { return CLASS; }
def            { return DEF; }
field          { return FIELD; }
let            { return LET; }
in             { return IN; }

{Identifier}   { Filelval.StrVal = new std::string(yytext, yytext+yyleng);
                 return ID; }
${Identifier}  { Filelval.StrVal = new std::string(yytext+1, yytext+yyleng);
                 return VARNAME; } 

{StringVal}    { Filelval.StrVal = new std::string(yytext+1, yytext+yyleng-1);
                 return STRVAL; }

{Integer}      { Filelval.IntVal = ParseInt(Filetext); return INTVAL; }

[ \t\n\r]+     { /* Ignore whitespace */ }


"/*"                    { BEGIN(comment); CommentDepth++; }
<comment>[^*/]*         /* eat anything that's not a '*' or '/' */
<comment>"*"+[^*/]*     /* eat up '*'s not followed by '/'s */
<comment>"/*"           { ++CommentDepth; }
<comment>"/"+[^*]*      /* eat up /'s not followed by *'s */
<comment>"*"+"/"        { if (!--CommentDepth) { BEGIN(INITIAL); } }
<comment><<EOF>>        { err() << "Unterminated comment!\n"; exit(1); }

.              { return Filetext[0]; }

%%

---- End ----------------------

< Message edited by henrikbach -- Aug. 20, '04, 6:43:56 AM >

(in reply to Rodney)
Post #: 3
RE: Flex does not correctly ignore a whitespace defition - Aug. 19, '04, 3:34:37 PM   
henrikbach

 

Posts: 28
Joined: Jul. 9, '04,
From: Copenhagen, Denmark
Status: offline
Hi Rodney

I also notice that your flex program's is accepting newline (0x10). My program ignores carriage return (0x13).

How do your program behave, if the last character is a carriage return?

/Henrik

(in reply to Rodney)
Post #: 4
RE: Flex does not correctly ignore a whitespace defition - Aug. 19, '04, 3:54:54 PM   
henrikbach

 

Posts: 28
Joined: Jul. 9, '04,
From: Copenhagen, Denmark
Status: offline
I replaced my carriage return with a newline (0x10) and then my flex program ignored the whitespace as expected.

(in reply to henrikbach)
Post #: 5
RE: Flex does not correctly ignore a whitespace defition - Aug. 19, '04, 4:09:14 PM   
Rodney

 

Posts: 3729
Joined: Jul. 9, '02,
From: /Tools lab
Status: offline
When I have <cr> instead of <nl> switched in the results are the same for my test.
I've copied my test program to other Unix systems and the result is the same.
I ran your code through flex on Interix and on BSD (both with flex 2.5.4) and
got virtually the same code (just different spaces in the flex comments generated).

I don't have everything taht you do for code (I'm guessing there are many files).
What is feeding the text string into your program? Is it a Win32 program perhaps?

(in reply to henrikbach)
Post #: 6
RE: Flex does not correctly ignore a whitespace defition - Aug. 19, '04, 4:41:32 PM   
Rodney

 

Posts: 3729
Joined: Jul. 9, '02,
From: /Tools lab
Status: offline
For your code, which I've looked at for a while now, I can't determine
what the problem is since I don't have the C++ header files, etc.
If I take what's there and wack it down to just the patterns, replacing the
C++ calls with printf's then it seems to work. That is 0xD and 0x10 are
noticed by the "[ \t\n\r]+" line.

Something else must be happening at run time. If you can isolate it to a chunk
of standalone code then I can check into it. But all I'm getting is a valid result.
But that's on hacked code.

Try taking your flex code and for each pattern match ("{Integer}", etc.) add
an o/p statement to identify when the match happens and what it's matching.

(in reply to Rodney)
Post #: 7
RE: Flex does not correctly ignore a whitespace defition - Aug. 19, '04, 5:07:59 PM   
henrikbach

 

Posts: 28
Joined: Jul. 9, '04,
From: Copenhagen, Denmark
Status: offline
Hi Rodney

Before moving further with your suggestions, I'll compile your test program. However, the -fl option is unrecognized on my system (Interix 3.5):

bash-2.05b$ flex t2.l; gcc lex.yy.c -fl
cc1: error: unrecognized option `-fl'
bash-2.05b$ gcc --version
gcc (GCC) 3.3

What's going on?

/Henrik

(in reply to Rodney)
Post #: 8
RE: Flex does not correctly ignore a whitespace defition - Aug. 19, '04, 5:37:51 PM   
jimraf

 

Posts: 17
Joined: Apr. 22, '03,
From: Boston, MA
Status: offline
I can't speak for Rodney but I believe he meant "-lfl", which tells gcc to link with libfl.a, the flex library.

(in reply to henrikbach)
Post #: 9
RE: Flex does not correctly ignore a whitespace defition - Aug. 19, '04, 5:45:03 PM   
Rodney

 

Posts: 3729
Joined: Jul. 9, '02,
From: /Tools lab
Status: offline
yup, I did mean "-lfl" as Jim notes.

(in reply to jimraf)
Post #: 10
RE: Flex does not correctly ignore a whitespace defition - Aug. 19, '04, 7:23:24 PM   
henrikbach

 

Posts: 28
Joined: Jul. 9, '04,
From: Copenhagen, Denmark
Status: offline
Hi

The below code is able to reproduce the error on my system.

Notice however, that if the lines of the in file ends with <cr> my error emerges ("include:"). If the lines ends with <nl> the "count:" and "ignore" statements emerges, which they shouldn't. It should be "include:", too.

Very strange...

< Message edited by henrikbach -- Aug. 20, '04, 3:34:22 AM >

(in reply to Rodney)
Post #: 11
RE: Flex does not correctly ignore a whitespace defition - Aug. 19, '04, 10:11:22 PM   
Rodney

 

Posts: 3729
Joined: Jul. 9, '02,
From: /Tools lab
Status: offline
When you (or anyone else) copy code into the Forum can you please, please,
use the "code" button. Otherwise the code, as shown above, is slightly mangled
making it invalid syntax. Then I have to fix it and I don't want to do that because
I want to use exactly what you have. Thanks.

(in reply to henrikbach)
Post #: 12
RE: Flex does not correctly ignore a whitespace defition - Aug. 20, '04, 3:33:12 AM   
henrikbach

 

Posts: 28
Joined: Jul. 9, '04,
From: Copenhagen, Denmark
Status: offline
Hi Rodney,

Sorry, I didn't know this feature. Now I know :-)


                int num_chars = 0;
                static int CommentDepth = 0;

Comment         \/\/.*
Identifier              [a-zA-Z_][0-9a-zA-Z_]*
Integer         [-+]?[0-9]+|0x[0-9a-fA-F]+|0b[01]+
CodeFragment    \[\{([^}]+|\}[^\]])*\}\]
StringVal               \"[^"]*\"
IncludeStr              include[ \t\n]+\"[^"]*\"

/*%%
[ \t\n\r]+      printf("ignore: %X\n", yytext[0]);
.               ++num_chars; printf("count: %d %c\n", num_chars, yytext[0]);

%%*/

%%

{Comment}      { /* Ignore comments */ }

{IncludeStr}    {
                                char *Buffer;
                                unsigned Length;
                                uint i;
                                
                                Buffer = yytext;
                                printf ("include: %s\n", yytext);

                                Length = yyleng;

                                printf ("Length = %d\n", Length);
                                printf ("idx\thex\tchar\n");
                                for (i=0; i < Length; i++)
                                {
                                        printf ("%d\t%X\t%c\n", i, Buffer[i], Buffer[i]);
                                }
                                printf ("WhatsInBuffer = %s\n", Buffer);
                                if (Buffer[Length-1] == '"')
                                        printf ("assert=true\n");
                                else
                                        printf ("assert=false\n");
                        }


{CodeFragment} { /*Filelval.StrVal = new std::string(yytext+2, yytext+yyleng-2);
                 return CODEFRAGMENT;*/ }

int            { /*return INT;*/ }
bit            { /*return BIT;*/ }
bits           { /*return BITS;*/ }
string         { /*return STRING;*/ }
list           { /*return LIST;*/ }
code           { /*return CODE;*/ }
dag            { /*return DAG;*/ }

class          { /*return CLASS;*/ }
def            { /*return DEF;*/ }
field          { /*return FIELD;*/ }
let            { /*return LET;*/ }
in             { /*return IN;*/ }

{Identifier}   { /*Filelval.StrVal = new std::string(yytext, yytext+yyleng);
                 return ID;*/ }
${Identifier}  { /*Filelval.StrVal = new std::string(yytext+1, yytext+yyleng);
                 return VARNAME;*/ } 

{StringVal}    { /*Filelval.StrVal = new std::string(yytext+1, yytext+yyleng-1);
                 return STRVAL;*/ }

{Integer}      { /*Filelval.IntVal = ParseInt(Filetext); return INTVAL;*/ }

[ \t\n\r]+     { printf("ignore: %X\n", yytext[0]); }

.              { ++num_chars; printf("count: %d %c\n", num_chars, yytext[0]); }

%%


main()
{
        yylex();
        printf( "# of chars = %d\n", num_chars );
}





/Henrik

(in reply to Rodney)
Post #: 13
RE: Flex does not correctly ignore a whitespace defition - Aug. 20, '04, 10:14:22 AM   
Rodney

 

Posts: 3729
Joined: Jul. 9, '02,
From: /Tools lab
Status: offline
Thanks.

Just to keep things confirmed, this is what I get as output below;
this is the same as you get, yes?
include: include "../Target.td"
Length = 22
idx     hex     char
0       69      i
1       6E      n
2       63      c
3       6C      l
4       75      u
5       64      d
6       65      e
7       20
8       22      "
9       2E      .
10      2E      .
11      2F      /
12      54      T
13      61      a
14      72      r
15      67      g
16      65      e
17      74      t
18      2E      .
19      74      t
20      64      d
21      22      "
WhatsInBuffer = include "../Target.td"
assert=true
ignore: D
# of chars = 0

(in reply to henrikbach)
Post #: 14
RE: Flex does not correctly ignore a whitespace defition - Aug. 20, '04, 11:12:13 AM   
henrikbach

 

Posts: 28
Joined: Jul. 9, '04,
From: Copenhagen, Denmark
Status: offline
No, unfortunately. However, now it seems to be specific to my system:
include: include "../Target.td"
Length = 23
idx     hex     char
0       69      i
1       6E      n
2       63      c
3       6C      l
4       75      u
5       64      d
6       65      e
7       20       
8       22      "
9       2E      .
10      2E      .
11      2F      /
12      54      T
13      61      a
14      72      r
15      67      g
16      65      e
17      74      t
18      2E      .
19      74      t
20      64      d
21      22      "
22      D       
WhatsInBuffer = include "../Target.td"
assert=false
# of chars = 0


I admit, I've been poking and playing around with gcc's c++config.h file in my LLVM porting project. I'll try to restore it to it's previous state.

< Message edited by henrikbach -- Aug. 20, '04, 5:20:01 PM >

(in reply to Rodney)
Post #: 15
RE: Flex does not correctly ignore a whitespace defition - Aug. 26, '04, 10:03:47 AM   
henrikbach

 

Posts: 28
Joined: Jul. 9, '04,
From: Copenhagen, Denmark
Status: offline
Now, I've reinstalled SFU SDK, pkg, bash and flex.

However, the error still exists.

Moreover, it should be the first test on a clean system. However, I wonder why I'm able to move through my old bash history log.

Any suggestions to, why the error still emerges?

< Message edited by henrikbach -- Aug. 26, '04, 4:07:05 PM >

(in reply to henrikbach)
Post #: 16
RE: Flex does not correctly ignore a whitespace defition - Aug. 26, '04, 11:02:09 AM   
Rodney

 

Posts: 3729
Joined: Jul. 9, '02,
From: /Tools lab
Status: offline
> However, I wonder why I'm able to move through my old bash history log.

It depends where you set your home directory. It's normally (~/.bash_history).
That's an RTFM thing :-)

The other thing is that what you consider to be "clean" may not be. It all depends
on how you did the "cleaning". I have several machines here that give me the results
I last reported. One of these machines is the machine for testing installations of
packages. I regularly clean this machine of packages. Every now and then I "clean+"
the machine by removing SFU and reinstalling it in a different directory. Not because
I like doing this, but because it happens my regular clean misses something and then
someone lets me know.

The other thing to try is to use the lex that ships with SFU (it's a version
of flex). Do the link as "gcc -ll" instead of "gcc -lfl". See if there is a
difference.

(in reply to henrikbach)
Post #: 17
RE: Flex does not correctly ignore a whitespace defition - Aug. 26, '04, 12:17:57 PM   
henrikbach

 

Posts: 28
Joined: Jul. 9, '04,
From: Copenhagen, Denmark
Status: offline
I compiled the (f)lex program with the following command:
lex t2; gcc lex.yy.c -ll"

However, it produced the the same result.

>That's an RTFM thing :-)

Sure, or an error 40 ;-)

Should I try, to install SFU in a different directory then?

< Message edited by henrikbach -- Aug. 26, '04, 6:18:55 PM >

(in reply to Rodney)
Post #: 18
RE: Flex does not correctly ignore a whitespace defition - Aug. 26, '04, 12:58:07 PM   
Rodney

 

Posts: 3729
Joined: Jul. 9, '02,
From: /Tools lab
Status: offline
> Should I try, to install SFU in a different directory then?

Something is odd on your machine somewhere. Obviously finding what it
is causing the problem is not getting us anywhere too fast.
If you install SFU into a different directory it won't be able to use
any of the old files or settings (outside what you have in your home directory).

Here's a couple of ideas/questions before doing a re-install:
- do you have some other software installed that may be Unix-like (U/Win, cygwin, MKS)?
It's happened before something gets picked up from the 'other' software.
- I notice you're using bash. Have you tried doing the compile from another
shell? I'm thinking that maybe there's something in your startup script for bash
and that starting another shell it'll be "cleaner" because you don't have any
startup scripts specificly for it (i.e csh).

(in reply to henrikbach)
Post #: 19
RE: Flex does not correctly ignore a whitespace defition - Aug. 26, '04, 1:26:15 PM   
henrikbach

 

Posts: 28
Joined: Jul. 9, '04,
From: Copenhagen, Denmark
Status: offline
>- do you have some other software installed that may be Unix-like (U/Win, cygwin, MKS)?

After having experienced the problems noted in this thread, I've downloaded cygwin, but not installed it (although, cygwin have made some folders on my system). None of the mentioned programs are or have been installed on my system. So, I don't consider this to be the problem.

>- I notice you're using bash. Have you tried doing the compile from another shell?

No, will do.

It still produces the same error (tried with lex) with both csh and ksh.

(in reply to Rodney)
Post #: 20
Page:   [1] 2   next >   >>
All Forums >> [SFU / Interix / SUA Technology] >> Tools Discussion Forum >> Flex does not correctly ignore a whitespace defition Page: [1] 2   next >   >>
Jump to:





New Messages No New Messages
Hot Topic w/ New Messages Hot Topic w/o New Messages
Locked w/ New Messages Locked w/o New Messages
 Post New Thread
 Reply to Message
 Post New Poll
 Submit Vote
 Delete My Own Post
 Delete My Own Thread
 Rate Posts


Search All Forums -

Advanced search


SPONSORS



Forum Software © ASPPlayground.NET Advanced Edition 2.5 ANSI

0.156