37 QueueJob *job = grab_job(0);
41 if(
xstrcmp(cur_pwd, job->pwd)) {
43 cur_pwd.
set(job->pwd);
46 if(
xstrcmp(cur_lpwd, job->lpwd)) {
48 cur_lpwd.
set(job->lpwd);
51 buffer.
append(job->cmd.get()).append(
'\n');
58 QueueJob *job =
new QueueJob;
65 job->cmd.truncate(strlen(job->cmd)-1);
67 insert_jobs(job, jobs, lastjob, pos != -1? get_job(pos):
NULL);
68 PrintJobs(job, v,
_(
"Added job$|s$"));
85 xstring& QueueFeeder::FormatJobs(
xstring&
s,
const QueueJob *job,
int v,
const char *plur)
const
90 const char *pwd = 0, *lpwd = 0;
93 for(
const QueueJob *
j = job;
j;
j=
j->next)
120 for(
const QueueJob *
j = job;
j;
j=
j->next)
145 s.
append(
j->cmd.get()).append(
'\n');
149 void QueueFeeder::PrintJobs(
const QueueJob *job,
int v,
const char *plur)
const
152 FormatJobs(buf,job,v,plur);
153 printf(
"%s",buf.get());
158 QueueJob *job = grab_job(from);
163 if(from == -1 || !jobs)
164 printf(
_(
"No queued jobs.\n"));
166 printf(
_(
"No queued job #%i.\n"), from+1);
171 PrintJobs(job, v,
_(
"Deleted job$|s$"));
179 QueueJob *job = grab_job(cmd);
185 printf(
_(
"No queued jobs.\n"));
187 printf(
_(
"No queued jobs match \"%s\".\n"), cmd);
192 PrintJobs(job, v,
_(
"Deleted job$|s$"));
205 if(from == to)
return false;
207 QueueJob *before = to != -1? get_job(to):
NULL;
209 QueueJob *job = grab_job(from);
210 if(job ==
NULL)
return false;
212 PrintJobs(job, v,
_(
"Moved job$|s$"));
213 assert(job != before);
215 insert_jobs(job, jobs, lastjob, before);
221 QueueJob *before = to != -1? get_job(to):
NULL;
227 QueueJob *job = grab_job(cmd);
228 if(job ==
NULL)
return false;
230 PrintJobs(job, v,
_(
"Moved job$|s$"));
232 insert_jobs(job, jobs, lastjob, before);
237 void QueueFeeder::unlink_job(QueueJob *job)
240 if(!job->prev) jobs = jobs->next;
241 if(!job->next) lastjob = lastjob->prev;
244 if(job->prev) job->prev->next = job->next;
245 if(job->next) job->next->prev = job->prev;
246 job->prev = job->next = 0;
249 QueueFeeder::QueueJob *QueueFeeder::get_job(
int n)
256 while(j && n--) j=j->next;
264 QueueFeeder::QueueJob *QueueFeeder::grab_job(
int n)
266 QueueJob *j = get_job(n);
272 QueueFeeder::QueueJob *QueueFeeder::grab_job(
const char *cmd)
274 QueueJob *j = jobs, *head =
NULL, *tail =
NULL;
277 QueueJob *match = get_next_match(cmd, j);
283 insert_jobs(match, head, tail,
NULL);
289 QueueFeeder::QueueJob *QueueFeeder::get_next_match(
const char *cmd, QueueJob *j)
302 void QueueFeeder::insert_jobs(QueueJob *job,
312 QueueJob *tail = job;
313 while(tail->next) tail=tail->next;
317 job->prev = lst_tail;
321 job->prev = before->prev;
324 if(job->prev) job->prev->next = job;
325 if(tail->next) tail->next->prev = tail;
326 if(!tail->next) lst_tail = tail;
327 if(!job->prev) lst_head = job;
331 void QueueFeeder::FreeList(QueueJob *j)
352 return FormatJobs(s, jobs, v,
"");
358 const char *pwd = cur_pwd, *lpwd = cur_lpwd;
359 for(
const QueueJob *job = jobs; job; job = job->next) {
360 if(v<2 && n>4 && job->next)
362 s.
appendf(
"%s%2d. ...\n",prefix,n);
366 if(v >= 2 && (
xstrcmp(pwd, job->pwd)))
367 s.
appendf(
"%s cd %s\n",prefix,job->pwd.get());
368 if(v >= 2 && (
xstrcmp(lpwd, job->lpwd)))
369 s.
appendf(
"%s lcd %s\n",prefix,job->lpwd.get());
373 s.
appendf(
"%s%2d. %s\n",prefix,n++,job->cmd.get());