www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Get and set terminal size

reply "Denis Mezhov" <d.o.mezhov gmail.com> writes:
I want use tgetnum for get terminal size
http://www.mkssoftware.com/docs/man3/curs_termcap.3.asp

extern(C):
int tgetnum(const(char) *capname);

calling a method from main
writeln(tgetnum(toStringz("li")));


I receive an error message
Undefined symbols for architecture x86_64:
   "_tgetnum", referenced from:
       _main in RSConsole.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to 
see invocation)


Does anyone know what the problem is?
Maybe there are other methods to get and set sizes of the Mac OS 
X console?
Apr 19 2014
parent reply "Adam D. Ruppe" <destructionator gmail.com> writes:
Try adding -lncurses or -lcurses to the command line. tgetnum is 
found in the curses library which isn't linked in automatically 
by default.
Apr 19 2014
parent reply "Denis Mezhov" <d.o.mezhov gmail.com> writes:
On Saturday, 19 April 2014 at 09:59:39 UTC, Adam D. Ruppe wrote:
 Try adding -lncurses or -lcurses to the command line. tgetnum 
 is found in the curses library which isn't linked in 
 automatically by default.
Error: unrecognized switch '-lcurses' Error: unrecognized switch '-lncurses' :((
Apr 19 2014
parent reply "Adam D. Ruppe" <destructionator gmail.com> writes:
Blargh, I don't know teh ldc switch for it :(

Try adding pragma(lib, "curses"); (or ncurses) to your file with 
main in it, i think ldc supports that.
Apr 19 2014
parent reply "Denis Mezhov" <d.o.mezhov gmail.com> writes:
On Saturday, 19 April 2014 at 10:39:43 UTC, Adam D. Ruppe wrote:
 Blargh, I don't know teh ldc switch for it :(

 Try adding pragma(lib, "curses"); (or ncurses) to your file 
 with main in it, i think ldc supports that.
pragma(lib, "curses"); extern(C): int tgetnum(const(char) *capname); hmm segfault error :( Segmentation fault: 11
Apr 19 2014
next sibling parent "FreeSlave" <freeslave93 gmail.com> writes:
What are compiler and platform do you use? Probably you are 
trying to link with 64-bit library while being on 32-bit OS (or 
vice versa)
It works fine on my 32-bit Debian with ldc2 and dmd.
Apr 19 2014
prev sibling parent reply "FreeSlave" <freeslave93 gmail.com> writes:
I use
ldc2 main.d -L-lcurses
or
dmd main.d -L-lcurses

and following source code:

import std.stdio;

extern(C) int tgetnum(const(char) *id);

int main()
{
     writeln(tgetnum("li"));
     return 0;
}

Note that you don't need to apply toStringz to string literals 
since they implicitly cast to const char*.
Apr 19 2014
next sibling parent Mike Parker <aldacron gmail.com> writes:
On 4/19/2014 9:06 PM, FreeSlave wrote:
 Note that you don't need to apply toStringz to string literals since
 they implicitly cast to const char*.
And, more importantly, are nul terminated.
Apr 19 2014
prev sibling parent "Denis Mezhov" <d.o.mezhov gmail.com> writes:
On Saturday, 19 April 2014 at 12:06:58 UTC, FreeSlave wrote:
 I use
 ldc2 main.d -L-lcurses
 or
 dmd main.d -L-lcurses

 and following source code:

 import std.stdio;

 extern(C) int tgetnum(const(char) *id);

 int main()
 {
     writeln(tgetnum("li"));
     return 0;
 }

 Note that you don't need to apply toStringz to string literals 
 since they implicitly cast to const char*.
It's work) Thanks.
Apr 20 2014