File: Leaf.cc

package info (click to toggle)
openc%2B%2B 2.8-4
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 5,464 kB
  • ctags: 3,333
  • sloc: cpp: 19,071; sh: 12,793; ansic: 3,549; makefile: 577
file content (101 lines) | stat: -rw-r--r-- 2,003 bytes parent folder | download | duplicates (2)
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
//@beginlicenses@
//@license{chiba_tokyo}{}@
//
//  Permission to use, copy, distribute and modify this software and its  
//  documentation for any purpose is hereby granted without fee, provided that
//  the above copyright notice appears in all copies and that both that copyright
//  notice and this permission notice appear in supporting documentation.
// 
//  1997-2001 Shigeru Chiba, Tokyo Institute of Technology. make(s) no representations about the suitability of this
//  software for any purpose. It is provided "as is" without express or implied
//  warranty.
//  
//  Copyright (C)  1997-2001 Shigeru Chiba, Tokyo Institute of Technology.
//
//@endlicenses@

#include <cstring>
#include <iostream>
#include <opencxx/parser/token-names.h>
#include <opencxx/parser/Token.h>
#include <opencxx/parser/Leaf.h>

using namespace std;

namespace Opencxx
{

// class Leaf

Leaf::Leaf(char* ptr, int len)
{
    data.leaf.position = ptr;
    data.leaf.length = len;
}

Leaf::Leaf(Token& tk)
{
    data.leaf.position = tk.ptr;
    data.leaf.length = tk.len;
}

bool Leaf::IsLeaf() const
{
    return true;
}

void Leaf::Print(ostream& s, int, int)
{
    char* p = data.leaf.position;
    int n = data.leaf.length;

    // Recall that [, ], and @ are special characters.

    if(n < 1)
	return;
    else if(n == 1 && *p == '@'){
	s << "\\@";
	return;
    }

    char c = *p++;
    if(c == '[' || c == ']')
	s << '\\' << c;		// [ and ] at the beginning are escaped.
    else
	s << c;

    while(--n > 0)
	s << *p++;
}

int Leaf::Write(ostream& out, int indent)
{
    int n = 0;
    char* ptr = data.leaf.position;
    int len = data.leaf.length;
    while(len-- > 0){
	char c = *ptr++;
	if(c == '\n'){
	    PrintIndent(out, indent);
	    ++n;
	}
	else
	    out << c;
    }

    return n;
}

void Leaf::PrintOn(std::ostream& out) const
{
    // :TODO: reimplement with 'std::copy'
    char* ptr = data.leaf.position;
    int len = data.leaf.length;
    while(len-- > 0)
    {
	out << *ptr++;
    }
}

}