* Bug #13901 fixed - lines() was not updated when resizing Scilab console.
[scilab.git] / scilab / modules / output_stream / src / c / sciprint_full.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) Francois Vogel
4  * Copyright (C) 2008-2008 - INRIA - Bruno JOFRET
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11  *
12  */
13
14 /*--------------------------------------------------------------------------*/
15 /* sciprint_full function */
16 /*--------------------------------------------------------------------------*/
17 /* sciprint geared towards long strings (>MAXPRINTF) */
18 /* the long string is splitted in elements of length equal to the number of columns  */
19 /* from lines()                                                                      */
20 /*--------------------------------------------------------------------------*/
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include "sciprint_full.h"
25 #include "sciprint.h"
26 #include "sci_malloc.h"
27 #include "localization.h"
28 #include "scilines.h"
29 #include "configvariable_interface.h"
30 /*--------------------------------------------------------------------------*/
31 #ifdef _MSC_VER
32 #define vsnprintf _vsnprintf
33 #endif
34 /*--------------------------------------------------------------------------*/
35 /* MAXCHARSSCIPRINT_FULL is for sciprint_full - more than this gets truncated */
36 #define MAXCHARSSCIPRINT_FULL 5000
37 /*--------------------------------------------------------------------------*/
38 void sciprint_full(char *fmt, ...)
39 {
40     int lstr;
41     va_list ap;
42     char *s_buf = NULL;
43     char *split_s_buf = NULL;
44     int count = 0;
45     int p_s = 0;
46     static int colwidth;
47
48     s_buf = MALLOC(sizeof(char) * (MAXCHARSSCIPRINT_FULL + 1));
49     if (s_buf == (char *) 0)
50     {
51         sciprint(_("%s: No more memory.\n"), "sciprint_full");
52         return;
53     }
54
55     /* number of columns as set by command lines() */
56     colwidth = getConsoleWidth();
57
58     split_s_buf = MALLOC(sizeof(char) * (colwidth + 1));
59     if (split_s_buf == (char *) 0)
60     {
61         sciprint(_("%s: No more memory.\n"), "sciprint_full");
62         FREE(s_buf);
63         return;
64     }
65
66     va_start(ap, fmt);
67
68 #if defined(linux) || defined(_MSC_VER)
69     count = vsnprintf (s_buf, MAXCHARSSCIPRINT_FULL - 1, fmt, ap );
70     if (count == -1)
71     {
72         s_buf[MAXCHARSSCIPRINT_FULL - 1] = '\0';
73     }
74 #else
75     (void )vsprintf(s_buf, fmt, ap );
76 #endif
77
78     va_end(ap);
79
80     lstr = (int) strlen(s_buf);
81
82     if (lstr < colwidth)
83     {
84         sciprint("%s", s_buf);
85     }
86     else
87     {
88         strncpy(split_s_buf, s_buf + p_s, colwidth - 1);
89         split_s_buf[colwidth] = '\0';
90         p_s = p_s + colwidth - 1;
91         sciprint("%s", split_s_buf);
92         sciprint("\n");
93         while (p_s + colwidth - 1 < (int)lstr)
94         {
95             strncpy(split_s_buf, s_buf + p_s, colwidth - 1);
96             split_s_buf[colwidth] = '\0';
97             p_s = p_s + colwidth - 1;
98             sciprint(_("  (cont'd) %s\n"), split_s_buf);
99         }
100         strncpy(split_s_buf, s_buf + p_s, lstr - p_s);
101         split_s_buf[lstr - p_s] = '\0';
102         sciprint(_("     (end) %s\n"), split_s_buf);
103     }
104
105     if (s_buf)
106     {
107         FREE(s_buf);
108         s_buf = NULL;
109     }
110     if (split_s_buf)
111     {
112         FREE(split_s_buf);
113         split_s_buf = NULL;
114     }
115
116 }
117 /*--------------------------------------------------------------------------*/