2 * Grace - GRaphing, Advanced Computation and Exploration of data
4 * Home page: http://plasma-gate.weizmann.ac.il/Grace/
6 * Copyright (c) 1991-1995 Paul J Turner, Portland, OR
7 * Copyright (c) 1996-2003 Grace Development Team
9 * Maintained by Evgeny Stambulchik
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, write to the Free Software
26 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
43 #include <sys/types.h>
44 #include <sys/resource.h>
45 #ifdef HAVE_SYS_SELECT_H
46 # include <sys/select.h>
60 static void rereadConfig(Grace
*grace
);
61 static RETSIGTYPE
actOnSignal(int signo
);
64 * swap doubles and ints
66 void fswap(double *x
, double *y
)
75 void iswap(int *x
, int *y
)
84 int isoneof(int c
, char *s
)
96 int argmatch(char *s1
, char *s2
, int atleast
)
107 return (strncmp(s1
, s2
, l1
) == 0);
111 * convert a string from lower to upper case
112 * leaving quoted strings alone
114 void lowtoupper(char *s
)
116 unsigned int i
, quoteon
= FALSE
;
118 for (i
= 0; i
< strlen(s
); i
++) {
122 } else if ((i
> 0) && (s
[i
-1] != '\\')) {
126 if (quoteon
== FALSE
) {
127 if (!isprint(s
[i
])) {
129 } else if (s
[i
] >= 'a' && s
[i
] <= 'z') {
137 * remove all that fortran nastiness
139 void convertchar(char *s
)
144 if (*s
== 'D' || *s
== 'd')
149 char *dayofweekstrs
[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
150 char *dayofweekstrl
[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
151 char *months
[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
152 char *monthl
[] = {"January", "February", "March", "April", "May", "June",
153 "July", "August", "September", "October", "November", "December"};
155 int dayofweek(double j
)
157 int i
= (int) floor(j
+ 1.5);
158 return (i
<= 0) ? 6 - (6 - i
)%7 : i
%7;
164 char *escapequotes (char *s
)
166 static char *es
= NULL
;
167 int i
, k
, n
, len
, elen
;
173 es
= xrealloc(es
, (len
+ 1)*SIZEOF_CHAR
);
176 while ((es
= strchr(es
, '\"'))) {
182 es
= xrealloc(es
, elen
*SIZEOF_CHAR
);
197 double mytrunc(double a
)
209 void bailout(Grace
*grace
)
211 if ((grace
->project
&& !quark_dirtystate_get(grace
->project
)) ||
212 yesno("Exit losing unsaved changes?", NULL
, NULL
, NULL
)) {
219 * Reread config (TODO)
221 static void rereadConfig(Grace
*grace
)
223 getparms(grace
, "gracerc");
226 static void please_report_the_bug(void)
228 fprintf(stderr
, "\nPlease use \"Help/Comments\" to report the bug.\n");
230 fprintf(stderr
, "NB: This version of Grace was compiled with LessTif.\n");
231 fprintf(stderr
, " Make sure to read the FAQ carefully prior to\n");
232 fprintf(stderr
, " reporting the bug, ESPECIALLY if the problem might\n");
233 fprintf(stderr
, " be related to the graphical interface.\n");
238 * Warn about a possible bug displaying the passed message, try to save
239 * any unsaved work and abort
241 void emergency_exit(Grace
*grace
, int is_my_bug
, char *msg
)
244 * Since we got so far, memory is probably corrupted so it's better to use
247 static char buf
[GR_MAXPATHLEN
];
249 if (grace
->rt
->emergency_save
!= FALSE
) {
250 /* don't mind signals anymore: we're in emergency save mode already */
251 grace
->rt
->interrupts
++;
252 if (grace
->rt
->interrupts
> 10) {
253 fprintf(stderr
, "oh, no luck :-(\n");
254 please_report_the_bug();
259 grace
->rt
->emergency_save
= TRUE
;
260 grace
->rt
->interrupts
= 0;
261 fprintf(stderr
, "\a\nOops! %s\n", msg
);
262 if (quark_dirtystate_get(grace
->project
)) {
263 strcpy(buf
, project_get_docname(grace
->project
));
265 fprintf(stderr
, "Trying to save your work into file \"%s\"... ", buf
);
267 grace
->gui
->noask
= TRUE
;
268 if (save_project(grace
->project
, buf
) == RETURN_SUCCESS
) {
269 fprintf(stderr
, "ok!\n");
271 fprintf(stderr
, "oh, no luck :-(\n");
275 please_report_the_bug();
282 * Signal-handling routines
285 static RETSIGTYPE
actOnSignal(int signo
)
287 char *signame
, buf
[32];
328 sprintf(buf
, "Got fatal signal %s!", signame
);
329 emergency_exit(grace
, TRUE
, buf
);
332 /* ignore the rest */
337 void installSignal(void){
339 signal(SIGHUP
, actOnSignal
); /* hangup */
342 signal(SIGINT
, actOnSignal
); /* interrupt */
345 signal(SIGQUIT
, actOnSignal
); /* quit */
348 signal(SIGILL
, actOnSignal
); /* illegal instruction */
351 signal(SIGFPE
, actOnSignal
); /* floating point exception */
354 signal(SIGBUS
, actOnSignal
); /* bus error */
357 signal(SIGSEGV
, actOnSignal
); /* segmentation violation */
360 signal(SIGSYS
, actOnSignal
); /* bad argument to system call */
363 signal(SIGTERM
, actOnSignal
); /* software termination signal */
366 signal(SIGALRM
, actOnSignal
); /* timer */
369 signal(SIGIO
, actOnSignal
); /* input/output ready */
373 /* create format string */
374 char *create_fstring(const Quark
*q
, int form
, int prec
, double loc
, int type
)
376 char format
[64], eng_prefix
[6];
377 static char s
[MAX_STRING_LENGTH
];
379 int m
, d
, y
, h
, mm
, sec
;
380 double arcmin
, arcsec
;
384 Project
*pr
= project_get_data(q
);
386 if (pr
->two_digits_years
) {
392 /* for locale decimal points */
393 set_locale_num(TRUE
);
395 strcpy(format
, "%.*lf");
398 sprintf(s
, format
, prec
, loc
);
399 tmp
= atof(s
); /* fix reverse axes problem when loc == -0.0 */
401 strcpy(format
, "%.*lf");
403 sprintf(s
, format
, prec
, loc
);
406 case FORMAT_EXPONENTIAL
:
407 strcpy(format
, "%.*le");
408 sprintf(s
, format
, prec
, loc
);
409 tmp
= atof(s
); /* fix reverse axes problem when loc == -0.0 */
411 strcpy(format
, "%.*le");
413 sprintf(s
, format
, prec
, loc
);
416 case FORMAT_SCIENTIFIC
:
418 exponent
= (int) floor(log10(fabs(loc
)));
419 mantissa
= loc
/pow(10.0, (double) exponent
);
420 if (type
== LFORMAT_TYPE_EXTENDED
) {
421 strcpy(format
, "%.*f\\x\\c4\\C\\f{}10\\S%d\\N");
423 strcpy(format
, "%.*fx10(%d)");
425 sprintf(s
, format
, prec
, mantissa
, exponent
);
427 strcpy(format
, "%.*f");
428 sprintf(s
, format
, prec
, 0.0);
431 case FORMAT_ENGINEERING
:
433 exponent
= (int) floor(log10(fabs(loc
)));
434 if (exponent
< -18) {
436 } else if (exponent
> 18) {
439 exponent
= (int) floor((double) exponent
/3)*3;
446 strcpy(eng_prefix
, "a");
448 case -15: /* fempto */
449 strcpy(eng_prefix
, "f");
452 strcpy(eng_prefix
, "p");
455 strcpy(eng_prefix
, "n");
458 if (type
== LFORMAT_TYPE_EXTENDED
) {
459 strcpy(eng_prefix
, "\\xm\\f{}");
461 strcpy(eng_prefix
, "mk");
465 strcpy(eng_prefix
, "m");
468 strcpy(eng_prefix
, "k");
471 strcpy(eng_prefix
, "M");
474 strcpy(eng_prefix
, "G");
477 strcpy(eng_prefix
, "T");
480 strcpy(eng_prefix
, "P");
482 case 18: /* Exza (spelling?) */
483 strcpy(eng_prefix
, "E");
486 strcpy(eng_prefix
, "");
489 strcpy(format
, "%.*f %s");
490 sprintf(s
, format
, prec
, loc
/(pow(10.0, exponent
)), eng_prefix
);
495 if (type
== LFORMAT_TYPE_EXTENDED
) {
496 strcpy(format
, "-10\\S%.*lf\\N");
498 strcpy(format
, "-10(%.*lf)\\N");
500 } else if (loc
== 0.0) {
501 sprintf(format
, "%.*f", prec
, 0.0);
504 if (type
== LFORMAT_TYPE_EXTENDED
) {
505 strcpy(format
, "10\\S%.*lf\\N");
507 strcpy(format
, "10(%.*lf)\\N");
510 sprintf(s
, format
, prec
, loc
);
513 strcpy(format
, "%.*lg");
514 sprintf(s
, format
, prec
, loc
);
517 strcpy(format
, "%lg");
519 sprintf(s
, format
, loc
);
523 strcpy(format
, "%02d-%02d-%0*d");
524 jul_to_cal_and_time(q
, loc
, ROUND_DAY
, &y
, &m
, &d
, &h
, &mm
, &sec
);
525 sprintf(s
, format
, d
, m
, yprec
, y
);
528 strcpy(format
, "%02d-%02d-%0*d");
529 jul_to_cal_and_time(q
, loc
, ROUND_DAY
, &y
, &m
, &d
, &h
, &mm
, &sec
);
530 sprintf(s
, format
, m
, d
, yprec
, y
);
533 strcpy(format
, "%0*d-%02d-%02d");
534 jul_to_cal_and_time(q
, loc
, ROUND_DAY
, &y
, &m
, &d
, &h
, &mm
, &sec
);
535 sprintf(s
, format
, yprec
, y
, m
, d
);
538 strcpy(format
, "%02d-%0*d");
539 jul_to_cal_and_time(q
, loc
, ROUND_MONTH
, &y
, &m
, &d
, &h
, &mm
, &sec
);
540 sprintf(s
, format
, m
, yprec
, y
);
543 strcpy(format
, "%02d-%02d");
544 jul_to_cal_and_time(q
, loc
, ROUND_DAY
, &y
, &m
, &d
, &h
, &mm
, &sec
);
545 sprintf(s
, format
, m
, d
);
547 case FORMAT_MONTHDAY
:
548 strcpy(format
, "%s-%02d");
549 jul_to_cal_and_time(q
, loc
, ROUND_DAY
, &y
, &m
, &d
, &h
, &mm
, &sec
);
550 if (m
- 1 < 0 || m
- 1 > 11) {
551 sprintf(s
, format
, "???");
553 sprintf(s
, format
, months
[m
- 1], d
);
556 case FORMAT_DAYMONTH
:
557 strcpy(format
, "%02d-%s");
558 jul_to_cal_and_time(q
, loc
, ROUND_DAY
, &y
, &m
, &d
, &h
, &mm
, &sec
);
559 if (m
- 1 < 0 || m
- 1 > 11) {
560 sprintf(s
, format
, "???");
562 sprintf(s
, format
, d
, months
[m
- 1]);
566 strcpy(format
, "%s");
567 jul_to_cal_and_time(q
, loc
, ROUND_MONTH
, &y
, &m
, &d
, &h
, &mm
, &sec
);
568 if (m
- 1 < 0 || m
- 1 > 11) {
569 sprintf(s
, format
, "???");
571 sprintf(s
, format
, months
[m
- 1]);
575 strcpy(format
, "%s-%0*d");
576 jul_to_cal_and_time(q
, loc
, ROUND_MONTH
, &y
, &m
, &d
, &h
, &mm
, &sec
);
577 if (m
- 1 < 0 || m
- 1 > 11) {
578 sprintf(s
, format
, "???");
580 sprintf(s
, format
, months
[m
- 1], yprec
, y
);
584 strcpy(format
, "%s");
585 jul_to_cal_and_time(q
, loc
, ROUND_MONTH
, &y
, &m
, &d
, &h
, &mm
, &sec
);
586 if (m
- 1 < 0 || m
- 1 > 11) {
587 sprintf(s
, format
, "???");
589 sprintf(s
, format
, monthl
[m
- 1]);
592 case FORMAT_DAYOFWEEKS
:
593 strcpy(format
, "%s");
594 sprintf(s
, format
, dayofweekstrs
[dayofweek(loc
+ pr
->ref_date
)]);
596 case FORMAT_DAYOFWEEKL
:
597 strcpy(format
, "%s");
598 sprintf(s
, format
, dayofweekstrl
[dayofweek(loc
+ pr
->ref_date
)]);
600 case FORMAT_DAYOFYEAR
:
601 strcpy(format
, "%d");
602 jul_to_cal_and_time(q
, loc
, ROUND_DAY
, &y
, &m
, &d
, &h
, &mm
, &sec
);
604 1 + (int) (cal_to_jul(y
, m
, d
) - cal_to_jul(y
, 1, 1)));
607 strcpy(format
, "%02d:%02d:%02d");
608 jul_to_cal_and_time(q
, loc
, ROUND_SECOND
, &y
, &m
, &d
, &h
, &mm
, &sec
);
609 sprintf(s
, format
, h
, mm
, sec
);
612 strcpy(format
, "%02d-%02d %02d:%02d:%02d");
613 jul_to_cal_and_time(q
, loc
, ROUND_SECOND
, &y
, &m
, &d
, &h
, &mm
, &sec
);
614 sprintf(s
, format
, m
, d
, h
, mm
, sec
);
616 case FORMAT_MMDDYYHMS
:
617 strcpy(format
, "%02d-%02d-%d %02d:%02d:%02d");
618 jul_to_cal_and_time(q
, loc
, ROUND_SECOND
, &y
, &m
, &d
, &h
, &mm
, &sec
);
619 sprintf(s
, format
, m
, d
, y
, h
, mm
, sec
);
621 case FORMAT_YYMMDDHMS
:
622 strcpy(format
, "%0*d-%02d-%02d %02d:%02d:%02d");
623 jul_to_cal_and_time(q
, loc
, ROUND_SECOND
, &y
, &m
, &d
, &h
, &mm
, &sec
);
624 sprintf(s
, format
, yprec
, y
, m
, d
, h
, mm
, sec
);
626 case FORMAT_DEGREESLON
:
629 strcpy(format
, "%.*lfW");
630 } else if (loc
> 0.0) {
631 strcpy(format
, "%.*lfE");
635 sprintf(s
, format
, prec
, loc
);
637 case FORMAT_DEGREESMMLON
:
640 strcpy(format
, "%d %.*lf' W");
641 } else if (loc
> 0.0) {
642 strcpy(format
, "%d %.*lf' E");
644 strcpy(format
, "0 0'");
647 arcmin
= (loc
- y
) * 60.0;
648 sprintf(s
, format
, y
, prec
, arcmin
);
650 case FORMAT_DEGREESMMSSLON
:
653 strcpy(format
, "%d %d' %.*lf\" W");
654 } else if (loc
> 0.0) {
655 strcpy(format
, "%d %d' %.*lf\" E");
657 strcpy(format
, "0 0' 0\"");
660 arcsec
= (loc
- y
) * 3600.0;
662 arcsec
= (arcsec
- m
* 60);
663 sprintf(s
, format
, y
, m
, prec
, arcsec
);
668 strcpy(format
, "%d' %.*lf\" W");
669 } else if (loc
> 0.0) {
670 strcpy(format
, "%d' %.*lf\" E");
672 strcpy(format
, "0 0' 0\"");
675 arcsec
= (loc
- y
) * 3600.0;
677 arcsec
= (arcsec
- m
* 60);
678 sprintf(s
, format
, m
, prec
, arcsec
);
680 case FORMAT_DEGREESLAT
:
683 strcpy(format
, "%.*lfS");
684 } else if (loc
> 0.0) {
685 strcpy(format
, "%.*lfN");
689 sprintf(s
, format
, prec
, loc
);
691 case FORMAT_DEGREESMMLAT
:
694 strcpy(format
, "%d %.*lf' S");
695 } else if (loc
> 0.0) {
696 strcpy(format
, "%d %.*lf' N");
698 strcpy(format
, "0 0'");
701 arcsec
= (loc
- y
) * 60.0;
702 sprintf(s
, format
, y
, prec
, arcsec
);
704 case FORMAT_DEGREESMMSSLAT
:
707 strcpy(format
, "%d %d' %.*lf\" S");
708 } else if (loc
> 0.0) {
709 strcpy(format
, "%d %d' %.*lf\" N");
711 strcpy(format
, "0 0' 0\"");
714 arcsec
= (loc
- y
) * 3600.0;
716 arcsec
= (arcsec
- m
* 60);
717 sprintf(s
, format
, y
, m
, prec
, arcsec
);
722 strcpy(format
, "%d' %.*lf\" S");
723 } else if (loc
> 0.0) {
724 strcpy(format
, "%d' %.*lf\" N");
726 strcpy(format
, "0 0' 0\"");
729 arcsec
= (loc
- y
) * 3600.0;
731 arcsec
= (arcsec
- m
* 60);
732 sprintf(s
, format
, m
, prec
, arcsec
);
735 sprintf(s
, format
, prec
, loc
);
739 /* revert to POSIX */
740 set_locale_num(FALSE
);
745 char *get_grace_home(const Grace
*grace
)
747 return grace
->rt
->grace_home
;
750 char *get_print_cmd(const Grace
*grace
)
752 return grace
->rt
->print_cmd
;
755 void set_print_cmd(Grace
*grace
, const char *cmd
)
757 grace
->rt
->print_cmd
= copy_string(grace
->rt
->print_cmd
, cmd
);
760 char *get_editor(const Grace
*grace
)
762 return grace
->rt
->grace_editor
;
765 void set_editor(Grace
*grace
, const char *cmd
)
767 grace
->rt
->grace_editor
= copy_string(grace
->rt
->grace_editor
, cmd
);
770 char *get_help_viewer(const Grace
*grace
)
772 return grace
->rt
->help_viewer
;
775 void set_help_viewer(Grace
*grace
, const char *dir
)
777 grace
->rt
->help_viewer
= copy_string(grace
->rt
->help_viewer
, dir
);
780 char *get_docbname(const Quark
*q
)
786 void errmsg(const char *buf
)
789 fprintf(stderr
, "%s\n", buf
);
791 if (grace
->gui
->inwin
) {
794 fprintf(stderr
, "%s\n", buf
);
799 int yesnoterm(char *msg
)
804 int yesno(char *msg
, char *s1
, char *s2
, char *help_anchor
)
806 if (grace
->gui
->noask
) {
810 return (yesnoterm(msg
));
812 if (grace
->gui
->inwin
) {
813 return (yesnowin(msg
, s1
, s2
, help_anchor
));
815 return (yesnoterm(msg
));
820 void stufftext(char *s
)
825 if (grace
->gui
->inwin
) {
831 /* log results to file */
832 if (grace
->rt
->resfp
!= NULL
) {
833 fprintf(grace
->rt
->resfp
, s
);
838 char *mybasename(const char *s
)
841 static char basename
[GR_MAXPATHLEN
];
843 s
= path_translate(s
);
845 errmsg("Could not translate basename:");
851 /* root is a special case */
852 if (end
== 0 && *s
== '/'){
857 /* strip trailing white space and slashes */
858 while (s
[end
] == '/' || s
[end
] == ' ' || s
[end
] == '\t') {
861 /* find start of basename */
865 } while (start
>= 0 && s
[start
] != '/');
867 strncpy(basename
, s
+ (start
+ 1), end
- start
);
868 basename
[end
- start
] = '\0';
872 int set_workingdir(Grace
*grace
, const char *wd
)
874 char buf
[GR_MAXPATHLEN
];
876 strncpy(buf
, wd
, GR_MAXPATHLEN
- 1);
878 expand_tilde(grace
, buf
);
880 if (chdir(buf
) >= 0) {
881 grace
->rt
->workingdir
= copy_string(grace
->rt
->workingdir
, buf
);
882 if (grace
->rt
->workingdir
[strlen(grace
->rt
->workingdir
) - 1] != '/') {
883 grace
->rt
->workingdir
= concat_strings(grace
->rt
->workingdir
, "/");
885 return RETURN_SUCCESS
;
887 return RETURN_FAILURE
;
891 char *get_workingdir(const Grace
*grace
)
893 return grace
->rt
->workingdir
;
896 char *get_username(const Grace
*grace
)
898 return grace
->rt
->username
;
901 char *get_userhome(const Grace
*grace
)
903 return grace
->rt
->userhome
;
906 /* TODO this needs some work */
907 void expand_tilde(const Grace
*grace
, char *buf
)
909 char buf2
[GR_MAXPATHLEN
];
912 if (strlen(buf
) == 1) {
913 strcpy(buf
, get_userhome(grace
));
914 } else if (buf
[1] == '/') {
915 if (strlen(buf
) > 2) {
916 strcpy(buf2
, get_userhome(grace
));
917 strcat(buf2
, buf
+ 1);
920 strcpy(buf
, get_userhome(grace
));
923 char tmp
[128], *pp
= tmp
, *q
= buf
+ 1;
926 while (*q
&& (*q
!= '/')) {
930 if ((pent
= getpwnam(tmp
)) != NULL
) {
931 strcpy(buf2
, pent
->pw_dir
);
936 errmsg("No user by that name");
942 void echomsg(char *msg
)
948 int system_wrap(const char *string
)
950 return system(string
);
953 void msleep_wrap(unsigned int msec
)
955 struct timeval timeout
;
956 timeout
.tv_sec
= msec
/ 1000;
957 timeout
.tv_usec
= 1000 * (msec
% 1000);
958 select(0, NULL
, NULL
, NULL
, &timeout
);
961 #ifdef HAVE_SETLOCALE
962 static int need_locale
= FALSE
;
963 static char *system_locale_string
, *posix_locale_string
;
966 int init_locale(void)
968 #ifdef HAVE_SETLOCALE
970 s
= setlocale(LC_NUMERIC
, "");
972 /* invalid/unsupported locale */
973 return RETURN_FAILURE
;
974 } else if (!strcmp(s
, "C")) {
975 /* don't enable need_locale, since the system locale is C */
976 return RETURN_SUCCESS
;
978 system_locale_string
= copy_string(NULL
, s
);
979 s
= setlocale(LC_NUMERIC
, "C");
980 posix_locale_string
= copy_string(NULL
, s
);
982 return RETURN_SUCCESS
;
985 return RETURN_SUCCESS
;
989 void set_locale_num(int flag
)
991 #ifdef HAVE_SETLOCALE
994 setlocale(LC_NUMERIC
, system_locale_string
);
996 setlocale(LC_NUMERIC
, posix_locale_string
);
1003 void set_debuglevel(Grace
*grace
, int level
)
1005 grace
->rt
->debuglevel
= level
;
1008 int get_debuglevel(Grace
*grace
)
1010 return grace
->rt
->debuglevel
;
1014 char *q_labeling(Quark
*q
)
1016 RunTime
*rt
= rt_from_quark(q
);
1022 buf
= xmalloc(strlen(QIDSTR(q
)) + 128);
1027 switch (quark_fid_get(q
)) {
1028 case QFlavorProject
:
1029 sprintf(buf
, "Project \"%s%s\" (%d graphs)", QIDSTR(q
),
1030 quark_dirtystate_get(q
) ? "*":"" , number_of_graphs(q
));
1034 sprintf(buf
, "Frame \"%s%s\"", QIDSTR(q
),
1035 quark_dirtystate_get(q
) ? "*":"");
1039 sprintf(buf
, "Graph \"%s%s\" (type: %s, sets: %d)",
1041 quark_dirtystate_get(q
) ? "*":"",
1042 graph_types(rt
, graph_get_type(q
)), number_of_sets(q
));
1046 sprintf(buf
, "Set \"%s%s\" (%s)",
1047 QIDSTR(q
), quark_dirtystate_get(q
) ? "*":"",
1048 set_types(rt
, set_get_type(q
)));
1052 t
= axis_get_data(q
);
1054 sprintf(buf
, "%c Axis \"%s%s\"",
1055 t
->type
== AXIS_TYPE_X
? 'X':'Y', QIDSTR(q
),
1056 quark_dirtystate_get(q
) ? "*":"");
1059 case QFlavorDObject
:
1060 o
= object_get_data(q
);
1062 sprintf(buf
, "DObject \"%s%s\" (%s)",
1063 QIDSTR(q
), quark_dirtystate_get(q
) ? "*":"",
1064 object_types(o
->type
));
1068 sprintf(buf
, "AText \"%s%s\"",
1069 QIDSTR(q
), quark_dirtystate_get(q
) ? "*":"");
1073 r
= region_get_data(q
);
1075 sprintf(buf
, "Region \"%s%s\" (%d pts)",
1076 QIDSTR(q
), quark_dirtystate_get(q
) ? "*":"",
1081 sprintf(buf
, "??? \"%s%s\"", QIDSTR(q
),
1082 quark_dirtystate_get(q
) ? "*":"");