File: gnatpp-source_line_buffer.ads

package info (click to toggle)
asis 2007-4
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 7,832 kB
  • ctags: 34
  • sloc: ada: 93,665; makefile: 225
file content (154 lines) | stat: -rw-r--r-- 7,367 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
------------------------------------------------------------------------------
--                                                                          --
--                            GNATPP COMPONENTS                             --
--                                                                          --
--            G N A T P P . S O U R C E _ L I N E _ B U F F E R             --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
--                   Copyright (C) 2001-2004, ACT Europe                    --
--                                                                          --
-- GNATPP is free software; you can redistribute it  and/or modify it under --
-- terms of the  GNU General Public License as published  by the Free Soft- --
-- ware  Foundation;  either version 2,  or (at your option) any later ver- --
-- sion.  GNATPP is  distributed in the  hope that it will  be  useful, but --
-- WITHOUT ANY WARRANTY; without even the implied warranty of  MERCHANTABI- --
-- LITY or  FITNESS  FOR A  PARTICULAR  PURPOSE. See the GNU General Public --
-- License  for more details. You  should  have  received a copy of the GNU --
-- General Public License  distributed with GNAT; see file COPYING. If not, --
-- write  to  the Free  Software  Foundation,  59 Temple Place - Suite 330, --
-- Boston,                                                                  --
--                                                                          --
-- GNATPP is maintained by ACT Europe (http://www.act-europe.fr).           --
--                                                                          --
------------------------------------------------------------------------------

--  This package defines the buffer into which the string image of the source
--  line of the original text is placed during traversing the source. The main
--  idea of pretty-printing the Ada code is to traverse the abstract Ada
--  structure of the code in parallel with scanning the corresponding source
--  line.

with Asis;          use Asis;
with Asis.Text;     use Asis.Text;

with GNATPP.Common; use GNATPP.Common;

package GNATPP.Source_Line_Buffer is

   -----------------
   -- Line Buffer --
   -----------------

   --  The simple fixed-length buffer abstraction is used at the moment
   --  May be, we should implement this buffer on top of the GNAT Table
   --  abstraction???

   Max_Line_Buf_Len : constant Positive := 1024;
   --  Should be enough.

   Line_Buf : Program_Text (1 .. Max_Line_Buf_Len);

   Line_Len : Natural;
   --  The length of the line currently placed into the buffer (may be zero)

   Line_Pos : Natural;
   --  Pointer to the position where we are at the given stage of the source
   --  traversal process. Is set to zero i two (???) cases:
   --  (1) When the corresponding line in the source is empty;
   --  (2) If line traversal routine has reached the end of the source line

   HT_Passed : Boolean := False;
   --  This flag is set by Skip_Blank routines. It is set on if at least one
   --  HT character is passed when skipping the sequence of white spaces.

   ------------------------------
   -- End of the revised stuff --
   ------------------------------

   Word_End : Natural;
   --  Supposing that Line_Pos points to some non-space symbol, this variable
   --  may be set by Set_Word_End procedure to the end of the word pointed by
   --  Line_Pos. ("Words" are any character sequences separated by white
   --  spaces, the end of the buffer and beginning of the buffer. If Line_Pos
   --  is equal to 0, Set_Word_End also sets Word_End to 0.

   Keyword : Keyword_Kinds;
   --  The keyword in the source buffer pointer by Line_Pos. Set to Not_A_KW if
   --  the next word in the buffer is not a keyword

   Delimiter : Delimiter_Kinds;
   --  The delimiter in the source buffer pointer by Line_Pos. Set to
   --  Not_A_Dlm if the next word in the buffer is not a delimiter

   procedure In_Buffer (Str_Num : Line_Number_Positive);
   --  Places the argument line into the buffer, sets Line_Len to Str'Length
   --  and Line_Pos to 1. The first procedure also sets
   --  GNATPP.State.Current_Source_Line to Str_Num
   --
   --  Note, that this procedure is not supposed to be called for the empty
   --  arguments, so the buffer is always non-empty???

   procedure Next_Line_In_Buffer;
   --  Places the next line in the buffer. The caller is responsible for
   --  making sure that this procedure will not go beyond the last line of
   --  the source being processed.

   function End_Of_Line_Comment return Boolean;
   --  Checks if the substring between Line_Pos and Line_Len contains the
   --  end-of-line comment only. If it is, as a side-effect this function sets
   --  Line_Pos pointing to the first '-' of this comment. Otherwise it leaves
   --  Line_Pos unchanged

   procedure Skip_Blanks;
   --  If Line_Pos points to non-space character (HT is considered as space),
   --  does nothing. Else moves Line_Pos to the right till the first non-space
   --  character is found or the end of the line is reached. In the latter case
   --  Line_Pos is set to 0.

   procedure Skip_Word;
   --  Skips the next word in the line and sets Line_Pos to the first
   --  character of the next word. If there are no word left, sets Line_Pos
   --  to 0.

   function Get_End_Idx return Natural;
   --  Returns the index of the last non-blank character in of the line stored
   --  in the line buffer. Returns zero if the line in the line buffer is the
   --  blank line.

   function Is_Blank_Line return Boolean;
   --  Checks if the part of the line in the Buffer starting from Line_Pos is
   --  empty or contains only space and HT characters

   procedure Set_Word_End;
   --  Providing that Line_Pos points to the beginning of some word in the
   --  buffer, sets the Word_End variable to the end of this word. If Line_Pos
   --  is zero, Word_End is also set to zero. Here we consider that the word
   --  has the syntax of Ada identifier.

   procedure Set_Word_End_In_Comment;
   --  Similar to the previous procedure, but this procedure does not consider
   --  '--' as the end of the word. That is, only white spaces are considered
   --  as word separators.

   function Normalized_Word return Program_Text;
   --  This function supposes that Line_Pos and Word_End point to the beginning
   --  and to the end of some word in the buffer. If this word consists only of
   --  characters which belong to the first 256 positions of Wide_Character
   --  type, it returns the this word converted to lover case characters.
   --  Otherwise it returns this word as is.

   procedure Detect_Keyword;
   --  Set the value of the Keyword variable. This procedure is supposed to
   --  be called when the buffer contain some non-space symbols after Line_Pos

   procedure Detect_Delimiter;
   --  Set the value of the Delimiter variable. It is supposed that Line_Pos
   --  points to the (first character of the) delimiter

   procedure Save_Buf;
   procedure Restore_Buf;
   --  These routines save and restore the content of the line buffer and the
   --  settiing of Line_Pos

end GNATPP.Source_Line_Buffer;