5afd10158beab236e749673e0573b4fd367e0e3c
[pspp-builds.git] / src / ui / gui / psppire-lex-reader.c
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 2011 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
16
17 /* A lex_reader object to read characters directly from a GtkTextBuffer */
18
19 #include <config.h>
20
21 #include "psppire-lex-reader.h"
22 #include "src/language/lexer/lexer.h"
23
24 #include <gtk/gtk.h>
25
26
27 #include "libpspp/cast.h"
28
29 static const struct lex_reader_class lex_gtk_text_buffer_reader_class ;
30
31
32 struct lex_gtk_text_buffer_reader
33 {
34   struct lex_reader reader;
35   GtkTextBuffer *buffer;
36   GtkTextIter start;
37   GtkTextIter stop;
38 };
39
40 static struct lex_gtk_text_buffer_reader *
41 lex_gtk_text_buffer_reader_cast (struct lex_reader *r)
42 {
43   return UP_CAST (r, struct lex_gtk_text_buffer_reader, reader);
44 }
45
46
47 struct lex_reader *
48 lex_reader_for_gtk_text_buffer (GtkTextBuffer *buffer, GtkTextIter start, GtkTextIter stop)
49 {
50   struct lex_gtk_text_buffer_reader *r = xmalloc (sizeof *r);
51
52   lex_reader_init (&r->reader, &lex_gtk_text_buffer_reader_class);
53
54   r->buffer = buffer;
55   g_object_ref (buffer);
56
57   r->start = start;
58   r->stop = stop;
59
60   return &r->reader;
61 }
62
63
64 static size_t
65 lex_gtk_text_buffer_read (struct lex_reader *r_, char *buf, size_t n,
66                  enum prompt_style prompt_style UNUSED)
67 {
68   struct lex_gtk_text_buffer_reader *r = lex_gtk_text_buffer_reader_cast (r_);
69   int n_chars = n;
70   char *s;
71
72   GtkTextIter iter = r->start ;
73   
74   int offset = gtk_text_iter_get_offset (&iter);
75   int end_offset = gtk_text_iter_get_offset (&r->stop);
76
77   if ( end_offset - offset < n)
78     n_chars = end_offset - offset;
79   
80   gtk_text_iter_set_offset (&iter, offset + n_chars);
81
82   s = gtk_text_iter_get_text (&r->start, &iter);
83
84   strcpy (buf, s);
85
86   r->start = iter;
87
88   return strlen (s);
89 }
90
91
92
93 static void
94 lex_gtk_text_buffer_close (struct lex_reader *r_)
95 {
96   struct lex_gtk_text_buffer_reader *r = lex_gtk_text_buffer_reader_cast (r_);
97
98   g_object_unref (r->buffer);
99 }
100
101
102 static const struct lex_reader_class lex_gtk_text_buffer_reader_class =
103   {
104     lex_gtk_text_buffer_read,
105     lex_gtk_text_buffer_close
106   };