0a49b66503fceee95953919cad3393f78f33b395
[apt.git] / cmdline / cmdline.cc
1 // -*- mode: c++; mode: fold -*-
2 #include <apt-pkg/configuration.h>
3 #include <apt-pkg/error.h>
4
5 #include <config.h>
6 #include <apti18n.h>
7
8 #include "cmdline.h"
9
10 #include <regex.h>
11
12 using namespace std;
13
14 // YnPrompt - Yes No Prompt.                                            /*{{{*/
15 // ---------------------------------------------------------------------
16 /* Returns true on a Yes.*/
17 bool YnPrompt()
18 {
19    if (_config->FindB("APT::Get::Assume-Yes",false) == true)
20    {
21       c1out << _("Y") << endl;
22       return true;
23    }
24
25    char response[1024] = "";
26    cin.getline(response, sizeof(response));
27
28    if (!cin)
29       return false;
30
31    if (strlen(response) == 0)
32       return true;
33
34    regex_t Pattern;
35    int Res;
36
37    Res = regcomp(&Pattern, nl_langinfo(YESEXPR),
38                  REG_EXTENDED|REG_ICASE|REG_NOSUB);
39
40    if (Res != 0) {
41       char Error[300];        
42       regerror(Res,&Pattern,Error,sizeof(Error));
43       return _error->Error(_("Regex compilation error - %s"),Error);
44    }
45    
46    Res = regexec(&Pattern, response, 0, NULL, 0);
47    if (Res == 0)
48       return true;
49    return false;
50 }
51                                                                         /*}}}*/
52 // AnalPrompt - Annoying Yes No Prompt.                                 /*{{{*/
53 // ---------------------------------------------------------------------
54 /* Returns true on a Yes.*/
55 bool AnalPrompt(const char *Text)
56 {
57    char Buf[1024];
58    cin.getline(Buf,sizeof(Buf));
59    if (strcmp(Buf,Text) == 0)
60       return true;
61    return false;
62 }
63                                                                         /*}}}*/
64 // ShowList - Show a list                                               /*{{{*/
65 // ---------------------------------------------------------------------
66 /* This prints out a string of space separated words with a title and 
67    a two space indent line wraped to the current screen width. */
68 bool ShowList(ostream &out,string Title,string List,string VersionsList)
69 {
70    if (List.empty() == true)
71       return true;
72    // trim trailing space
73    int NonSpace = List.find_last_not_of(' ');
74    if (NonSpace != -1)
75    {
76       List = List.erase(NonSpace + 1);
77       if (List.empty() == true)
78          return true;
79    }
80
81    // Acount for the leading space
82    int ScreenWidth = ::ScreenWidth - 3;
83       
84    out << Title << endl;
85    string::size_type Start = 0;
86    string::size_type VersionsStart = 0;
87    while (Start < List.size())
88    {
89       if(_config->FindB("APT::Get::Show-Versions",false) == true &&
90          VersionsList.size() > 0) {
91          string::size_type End;
92          string::size_type VersionsEnd;
93          
94          End = List.find(' ',Start);
95          VersionsEnd = VersionsList.find('\n', VersionsStart);
96
97          out << "   " << string(List,Start,End - Start) << " (" << 
98             string(VersionsList,VersionsStart,VersionsEnd - VersionsStart) << 
99             ")" << endl;
100
101          if (End == string::npos || End < Start)
102             End = Start + ScreenWidth;
103
104          Start = End + 1;
105          VersionsStart = VersionsEnd + 1;
106       } else {
107          string::size_type End;
108
109          if (Start + ScreenWidth >= List.size())
110             End = List.size();
111          else
112             End = List.rfind(' ',Start+ScreenWidth);
113
114          if (End == string::npos || End < Start)
115             End = Start + ScreenWidth;
116          out << "  " << string(List,Start,End - Start) << endl;
117          Start = End + 1;
118       }
119    }   
120
121    return false;
122 }
123
124 const char *op2str(int op)
125 {
126    switch (op & 0x0f)
127    {
128       case pkgCache::Dep::LessEq: return "<=";
129       case pkgCache::Dep::GreaterEq: return ">=";
130       case pkgCache::Dep::Less: return "<";
131       case pkgCache::Dep::Greater: return ">";
132       case pkgCache::Dep::Equals: return "=";
133       case pkgCache::Dep::NotEquals: return "!";
134       default: return "";
135    }
136 }
137
138 // SigWinch - Window size change signal handler                         /*{{{*/
139 // ---------------------------------------------------------------------
140 /* */
141 void SigWinch(int)
142 {
143    // Riped from GNU ls
144 #ifdef TIOCGWINSZ
145    struct winsize ws;
146
147    if (ioctl(1, TIOCGWINSZ, &ws) != -1 && ws.ws_col >= 5)
148       ScreenWidth = ws.ws_col - 1;
149 #endif
150 }
151
152 // vim:sts=3:sw=3