You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1235 lines
34 KiB

--- gv-3.5.8.orig/source/ps.c
+++ gv-3.5.8/source/ps.c
@@ -93,6 +93,8 @@
#define memset(a,b,c) bzero(a,c)
#endif
+extern int sec_scanf(const char *, const char *, ...);
+
/* length calculates string length at compile time */
/* can only be used with character constants */
#define length(a) (sizeof((a))-1)
@@ -417,10 +419,15 @@
struct document *retval = NULL;
FILE *tmpfile = (FILE*)NULL;
char *filename_unc;
+ char *quoted_filename, *quoted_filename_unc;
char cmd[512];
char s[512];
filename_unc=file_getTmpFilename(NULL,filename_raw);
- sprintf(cmd,cmd_uncompress,filename,filename_unc);
+ quoted_filename = quote_filename(filename);
+ quoted_filename_unc = quote_filename(filename_unc);
+ sprintf(cmd,cmd_uncompress,quoted_filename,quoted_filename_unc);
+ GV_XtFree(quoted_filename);
+ GV_XtFree(quoted_filename_unc);
INFMESSAGE(is compressed)
INFSMESSAGE(uncompress command,cmd)
if (ps_system(cmd) || file_fileIsNotUseful(filename_unc)) {
@@ -478,7 +485,7 @@
doc = (struct document *) PS_malloc(sizeof(struct document));
CHECK_MALLOCED(doc);
memset(doc, 0, sizeof(struct document));
- sscanf(line, "%*s %s", text);
+ sec_sscanf(line, "%*s %s", text, sizeof(text));
/*###jp###*/
/*doc->epsf = iscomment(text, "EPSF-");*/
doc->epsf = iscomment(text, "EPSF");
@@ -488,10 +495,35 @@
struct document *retval = NULL;
FILE *tmpfile = (FILE*)NULL;
char *filename_dsc;
+ char *quoted_filename, *quoted_filename_dsc;
+ char *pdfpos;
+ char *dscpos;
char cmd[512];
char s[512];
- filename_dsc=file_getTmpFilename(NULL,filename_raw);
- sprintf(cmd,cmd_scan_pdf,filename,filename_dsc);
+ filename_dsc=file_getTmpFilename(NULL,filename_raw);
+ quoted_filename = quote_filename(filename);
+ quoted_filename_dsc = quote_filename(filename_dsc);
+ if ((pdfpos = strstr(cmd_scan_pdf,"%pdf")) &&
+ (dscpos = strstr(cmd_scan_pdf,"%dsc"))) {
+ cmd[0] = '\0';
+ if (pdfpos < dscpos) {
+ strncat(cmd,cmd_scan_pdf,(pdfpos-cmd_scan_pdf));
+ strcat(cmd,quoted_filename);
+ strncat(cmd,pdfpos+4,(dscpos-pdfpos-4));
+ strcat(cmd,quoted_filename_dsc);
+ strcat(cmd,dscpos+4);
+ } else {
+ strncat(cmd,cmd_scan_pdf,(dscpos-cmd_scan_pdf));
+ strcat(cmd,quoted_filename_dsc);
+ strncat(cmd,dscpos+4,(pdfpos-dscpos-4));
+ strcat(cmd,quoted_filename);
+ strcat(cmd,pdfpos+4);
+ }
+ } else {
+ sprintf(cmd,cmd_scan_pdf,quoted_filename,quoted_filename_dsc);
+ }
+ GV_XtFree(quoted_filename);
+ GV_XtFree(quoted_filename_dsc);
INFMESSAGE(is PDF)
INFSMESSAGE(scan command,cmd)
#ifdef VMS
@@ -546,7 +578,7 @@
} else if (doc->date == NULL && iscomment(line+2, "CreationDate:")) {
doc->date = gettextline(line+length("%%CreationDate:"));
} else if (bb_set == NONE && iscomment(line+2, "BoundingBox:")) {
- sscanf(line+length("%%BoundingBox:"), "%s", text);
+ sec_sscanf(line+length("%%BoundingBox:"), "%s", text, sizeof(text));
if (strcmp(text, "(atend)") == 0) {
bb_set = ATEND;
} else {
@@ -578,7 +610,7 @@
}
} else if (orientation_set == NONE &&
iscomment(line+2, "Orientation:")) {
- sscanf(line+length("%%Orientation:"), "%s", text);
+ sec_sscanf(line+length("%%Orientation:"), "%s", text, sizeof(text));
if (strcmp(text, "(atend)") == 0) {
orientation_set = ATEND;
} else if (strcmp(text, "Portrait") == 0) {
@@ -589,7 +621,7 @@
orientation_set = 1;
}
} else if (page_order_set == NONE && iscomment(line+2, "PageOrder:")) {
- sscanf(line+length("%%PageOrder:"), "%s", text);
+ sec_sscanf(line+length("%%PageOrder:"), "%s", text, sizeof(text));
if (strcmp(text, "(atend)") == 0) {
page_order_set = ATEND;
} else if (strcmp(text, "Ascend") == 0) {
@@ -603,7 +635,7 @@
page_order_set = 1;
}
} else if (pages_set == NONE && iscomment(line+2, "Pages:")) {
- sscanf(line+length("%%Pages:"), "%s", text);
+ sec_sscanf(line+length("%%Pages:"), "%s", text, sizeof(text));
if (strcmp(text, "(atend)") == 0) {
pages_set = ATEND;
} else {
@@ -823,7 +855,7 @@
/* Do nothing */
} else if (doc->default_page_orientation == NONE &&
iscomment(line+2, "PageOrientation:")) {
- sscanf(line+length("%%PageOrientation:"), "%s", text);
+ sec_sscanf(line+length("%%PageOrientation:"), "%s", text, sizeof(text));
if (strcmp(text, "Portrait") == 0) {
doc->default_page_orientation = PORTRAIT;
} else if (strcmp(text, "Landscape") == 0) {
@@ -945,7 +977,7 @@
/* Do nothing */
} else if (doc->default_page_orientation == NONE &&
iscomment(line+2, "PageOrientation:")) {
- sscanf(line+length("%%PageOrientation:"), "%s", text);
+ sec_sscanf(line+length("%%PageOrientation:"), "%s", text, sizeof(text));
if (strcmp(text, "Portrait") == 0) {
doc->default_page_orientation = PORTRAIT;
} else if (strcmp(text, "Landscape") == 0) {
@@ -1082,7 +1114,7 @@
/* Do nothing */
} else if (doc->pages[doc->numpages].orientation == NONE &&
iscomment(line+2, "PageOrientation:")) {
- sscanf(line+length("%%PageOrientation:"), "%s", text);
+ sec_sscanf(line+length("%%PageOrientation:"), "%s", text, sizeof(text));
if (strcmp(text, "Portrait") == 0) {
doc->pages[doc->numpages].orientation = PORTRAIT;
} else if (strcmp(text, "Landscape") == 0) {
@@ -1114,7 +1146,7 @@
PS_free(cp);
} else if ((page_bb_set == NONE || page_bb_set == ATEND) &&
iscomment(line+2, "PageBoundingBox:")) {
- sscanf(line+length("%%PageBoundingBox:"), "%s", text);
+ sec_sscanf(line+length("%%PageBoundingBox:"), "%s", text, sizeof(text));
if (strcmp(text, "(atend)") == 0) {
page_bb_set = ATEND;
} else {
@@ -1228,14 +1260,14 @@
}
} else if (orientation_set == ATEND &&
iscomment(line+2, "Orientation:")) {
- sscanf(line+length("%%Orientation:"), "%s", text);
+ sec_sscanf(line+length("%%Orientation:"), "%s", text, sizeof(text));
if (strcmp(text, "Portrait") == 0) {
doc->orientation = PORTRAIT;
} else if (strcmp(text, "Landscape") == 0) {
doc->orientation = LANDSCAPE;
}
} else if (page_order_set == ATEND && iscomment(line+2, "PageOrder:")) {
- sscanf(line+length("%%PageOrder:"), "%s", text);
+ sec_sscanf(line+length("%%PageOrder:"), "%s", text, sizeof(text));
if (strcmp(text, "Ascend") == 0) {
doc->pageorder = ASCEND;
} else if (strcmp(text, "Descend") == 0) {
@@ -1738,6 +1770,8 @@
(DSCcomment(line) && iscomment(line+2,(comment)))
#define IS_BEGIN(comment) \
(iscomment(line+7,(comment)))
+#define IS_END(comment) \
+ (iscomment(line+5,(comment)))
#define SKIP_WHILE(cond) \
while (readline(fd, &line, NULL, &nbytes) && (cond)) *line_lenP += nbytes;\
skipped=1;
@@ -1773,7 +1807,12 @@
else
#endif
if (!IS_COMMENT("Begin")) {} /* Do nothing */
- else if IS_BEGIN("Document:") SKIP_UNTIL_1("EndDocument")
+ else if IS_BEGIN("Document:") { /* Skip the EPS without handling its content */
+ while (line && !IS_END("Document")) {
+ line = ps_io_fgetchars(fd,-1);
+ if (line) *line_lenP += FD_LINE_LEN;
+ }
+ }
else if IS_BEGIN("Feature:") SKIP_UNTIL_1("EndFeature")
#ifdef USE_ACROREAD_WORKAROUND
else if IS_BEGIN("File") SKIP_UNTIL_2("EndFile","EOF")
@@ -1789,7 +1828,7 @@
INFMESSAGE(encountered "BeginData:")
if (FD_LINE_LEN > 100) FD_BUF[100] = '\0';
text[0] = '\0';
- if (sscanf(line+length("%%BeginData:"), "%d %*s %s", &num, text) >= 1) {
+ if (sec_sscanf(line+length("%%BeginData:"), "%d %*s %s", &num, text, sizeof(text)) >= 1) {
if (strcmp(text, "Lines") == 0) {
INFIMESSAGE(number of lines to skip:,num)
while (num) {
@@ -1888,7 +1927,7 @@
INFMESSAGE(encountered "BeginData:")
if (FD_LINE_LEN > 100) FD_BUF[100] = '\0';
text[0] = '\0';
- if (sscanf(line+length("%%BeginData:"), "%d %*s %s", &num, text) >= 1) {
+ if (sec_sscanf(line+length("%%BeginData:"), "%d %*s %s", &num, text, sizeof(text)) >= 1) {
if (strcmp(text, "Lines") == 0) {
INFIMESSAGE(number of lines:,num)
while (num) {
@@ -1985,7 +2024,7 @@
PS_free(comment);
continue;
}
- sscanf(comment+length("%%Pages:"), "%s", text);
+ sec_sscanf(comment+length("%%Pages:"), "%s", text, sizeof(text));
if (strcmp(text, "(atend)") == 0) {
fputs(comment, dest_file);
pages_atend = True;
--- gv-3.5.8.orig/source/misc.c
+++ gv-3.5.8/source/misc.c
@@ -301,9 +301,10 @@
/*############################################################*/
void
-misc_setPageMarker(entry,kind)
+misc_setPageMarker(entry,kind,event)
int entry;
int kind; /* 0 = selected, 1 = highlighted , 2 = bring selected in sight*/
+ XEvent *event;
{
int x,y,yl,yu,ny=99999;
Boolean b = False;
@@ -330,9 +331,12 @@
ny = (int)newtocClip->core.height - ((int)newtoc->core.y + yl + 14);
if (y>ny) b = True;
}
- if (b) {
+ if (event && b) {
INFIMESSAGE(jumping to,ny)
ClipWidgetSetCoordinates(newtocClip,x,ny);
+ entry = VlistEntryOfPosition(newtoc,(int)event->xbutton.y+(y-ny));
+ if (entry != VlistHighlighted(newtoc))
+ VlistChangeHighlighted(newtoc,entry,XawVlistSet);
}
}
}
@@ -689,7 +693,7 @@
}
if (toc_text) {
INFMESSAGE(marking current_page as current)
- misc_setPageMarker(current_page,0);
+ misc_setPageMarker(current_page,0,NULL);
}
}
@@ -1131,7 +1135,10 @@
}
s[i] = '\0';
n=0;
- XtSetArg(args[n], XtNvlist, s); n++;
+ if ( (!gv_filename_old) ||
+ (strcmp(gv_filename_old, gv_filename)) ||
+ (doc->numpages != olddoc->numpages) )
+ XtSetArg(args[n], XtNvlist, s); n++;
XtSetArg(args[n], XtNlabel, toc_text); n++;
} else {
s = NULL;
@@ -1154,7 +1161,7 @@
misc_setSensitive(w_printAllPages , show_printAllPages , (gv_psfile != NULL));
misc_setSensitive(w_checkFile , show_checkFile , (gv_filename != NULL));
misc_setSensitive(w_updateFile , show_updateFile , (gv_filename != NULL));
- misc_setSensitive(w_showThisPage , show_showThisPage , (gv_filename != NULL));
+ misc_setSensitive(w_showThisPage , show_showThisPage , (gv_psfile != NULL));
misc_setSensitive(w_prevPage , show_prevPage , (toc_text != NULL));
misc_setSensitive(w_nextPage , show_nextPage , (gv_filename != NULL));
misc_setSensitive(w_toggleCurrentPage , show_toggleCurrentPage , (toc_text != NULL));
@@ -1168,7 +1175,7 @@
XtSetSensitive(saveAllEntry, (gv_psfile != NULL));
XtSetSensitive(saveMarkedEntry, (toc_text != NULL));
XtSetSensitive(nextEntry, (gv_filename != NULL));
- XtSetSensitive(redisplayEntry, (gv_filename != NULL));
+ XtSetSensitive(redisplayEntry, (gv_psfile != NULL));
XtSetSensitive(prevEntry, (toc_text != NULL));
XtSetSensitive(currentEntry, (toc_text != NULL));
XtSetSensitive(oddEntry, (toc_text != NULL));
@@ -1718,3 +1725,51 @@
ENDMESSAGE(catch_Xerror)
return 0;
}
+
+/*############################################################*/
+/* quote_filename */
+/* Quotes special characters in filenames */
+/* (taken from bash sources) */
+/*############################################################*/
+
+char *
+quote_filename (string)
+ char *string;
+{
+ int c;
+ char *result, *r, *s;
+
+ BEGINMESSAGE(quote_filename)
+
+ result = (char*) GV_XtMalloc((2 * strlen (string) + 1) * sizeof(char));
+
+ for (r = result, s = string; s && (c = *s); s++)
+ {
+ switch (c)
+ {
+ case ' ': case '\t': case '\n': /* IFS white space */
+ case '\'': case '"': case '\\': /* quoting chars */
+ case '|': case '&': case ';': /* shell metacharacters */
+ case '(': case ')': case '<': case '>':
+ case '!': case '{': case '}': /* reserved words */
+ case '*': case '[': case '?': case ']': /* globbing chars */
+ case '^':
+ case '$': case '`': /* expansion chars */
+ *r++ = '\\';
+ *r++ = c;
+ break;
+ case '#': /* comment char */
+ if (s == string)
+ *r++ = '\\';
+ /* FALLTHROUGH */
+ default:
+ *r++ = c;
+ break;
+ }
+ }
+ *r = '\0';
+
+ ENDMESSAGE(quote_filename)
+
+ return (result);
+}
--- gv-3.5.8.orig/source/actions.c
+++ gv-3.5.8/source/actions.c
@@ -94,7 +94,7 @@
}
if (new_width && new_height) {
if (width != new_width || height != new_height) {
- misc_setPageMarker(0,2); /* bring selected in sight */
+ misc_setPageMarker(0,2,event); /* bring selected in sight */
width = new_width;
height=new_height;
}
@@ -253,7 +253,7 @@
}
}
h = doc_putPageInRange(doc,h);
- misc_setPageMarker(h,1);
+ misc_setPageMarker(h,1,event);
}
nx = x = (int)aaa->core.x;
@@ -428,7 +428,7 @@
if (!scrolling && toc_text) {
entry = VlistEntryOfPosition(newtoc,(int)event->xbutton.y);
if (entry >=0 && entry < doc->numpages) {
- misc_setPageMarker(entry,0);
+ misc_setPageMarker(entry,0,event);
show_page(entry,NULL);
}
}
--- gv-3.5.8.orig/source/callbacks.c
+++ gv-3.5.8/source/callbacks.c
@@ -870,7 +870,7 @@
char *s;
BEGINMESSAGE(cb_page)
- if (gv_psfile && client_data) {
+ if (gv_filename && client_data) {
s = (char*)client_data;
if (*s=='-' || *s=='+') {
k = 1;
@@ -894,7 +894,7 @@
np = np + ((k==1) ? cp : 0);
np=doc_putPageInRange(doc,np);
IIMESSAGE(np,current_page)
- misc_setPageMarker(np,0);
+ misc_setPageMarker(np,0,NULL);
if (np != current_page) show_page(np,NULL);
} else {
if (k==1 && np > 0) show_page(np,NULL);
--- gv-3.5.8.orig/source/config.h
+++ gv-3.5.8/source/config.h
@@ -40,7 +40,7 @@
----------------------------------------------------------
*/
-/* #define GV_RESTART_IF_BUSY */
+/*#define GV_RESTART_IF_BUSY*/
/*
##########################################################
--- gv-3.5.8.orig/source/main.c
+++ gv-3.5.8/source/main.c
@@ -985,9 +985,9 @@
main_setInternResource(db,&gv_gs_x11_device,"gsX11Device");
main_setInternResource(db,&gv_gs_x11_alpha_device,"gsX11AlphaDevice");
main_setInternResource(db,&gv_gs_arguments,"gsArguments");
- s = resource_getResource(db,gv_class,gv_class,"gsSafer",NULL);
+ s = resource_getResource(db,gv_class,gv_name,"gsSafer",NULL);
if (!strcasecmp(s,"true")) gv_gs_safer = 1; else gv_gs_safer = 0;
- s = resource_getResource(db,gv_class,gv_class,"gsQuiet",NULL);
+ s = resource_getResource(db,gv_class,gv_name,"gsQuiet",NULL);
if (!strcasecmp(s,"true")) gv_gs_quiet = 1; else gv_gs_quiet = 0;
ENDMESSAGE(main_setGhostscriptResources)
}
--- gv-3.5.8.orig/source/misc.h
+++ gv-3.5.8/source/misc.h
@@ -57,7 +57,8 @@
extern void misc_setPageMarker (
#if NeedFunctionPrototypes
int, /* entry */
- int /* kind */
+ int, /* kind */
+ XEvent*
#endif
);
@@ -115,6 +116,12 @@
#endif
);
+extern char * quote_filename (
+#if NeedFunctionPrototypes
+ char*
+#endif
+);
+
#endif /* _GV_MISC_H_ */
--- gv-3.5.8.orig/source/gv_misc_res.dat
+++ gv-3.5.8/source/gv_misc_res.dat
@@ -525,9 +525,9 @@
<LeaveWindow>: GV_Toc(unhighlight) \n\
<Btn1Down>: GV_Toc(scrollon) \n\
<Btn1Motion>: GV_Toc(scroll) \n\
- <Btn1Up>: GV_Toc(select) \
+ <Btn1Up>: GV_Toc(highlight) \
GV_Toc(scrolloff) \
- GV_Toc(highlight) \n\
+ GV_Toc(select) \n\
<Btn2Down>: GV_Toc(toggleon) \n\
<Btn2Motion>: GV_Toc(toggleextend) \
GV_Toc(highlight) \n\
--- gv-3.5.8.orig/source/Vlist.c
+++ gv-3.5.8/source/Vlist.c
@@ -623,6 +623,8 @@
if (y < 0) entry = -1;
else entry = (vw->vlist.entries*y)/(int)vw->label.label_height;
}
+ if (entry >= vw->vlist.entries)
+ entry = vw->vlist.entries-1;
IMESSAGE(entry)
ENDMESSAGE(VlistEntryOfPosition)
return(entry);
--- gv-3.5.8.orig/source/file.c
+++ gv-3.5.8/source/file.c
@@ -145,6 +145,25 @@
}
/*############################################################*/
+/* file_assureDirectory */
+/*############################################################*/
+
+void
+file_assureDirectory(to,from)
+ char *to;
+ char *from;
+{
+ int len;
+ BEGINMESSAGE(file_assureDirectory)
+ strcpy(to,from);
+# ifndef VMS
+ len = strlen(to);
+ if (to[len-1] != '/') { to[len] = '/'; to[len+1] = '\0'; }
+# endif
+ ENDMESSAGE(file_assureDirectory)
+}
+
+/*############################################################*/
/* file_getTmpFilename */
/* provide some temporary file name */
/*############################################################*/
@@ -164,11 +183,13 @@
BEGINMESSAGE(file_getTmpFilename)
- if (!baseDirectory) baseDirectory = app_res.scratch_dir;
- strcpy(tmpDirBuf,baseDirectory);
- pos = file_locateFilename(tmpDirBuf);
- if (pos) { ++pos; *pos='\0'; }
- else strcpy(tmpDirBuf,app_res.scratch_dir);
+ pos = NULL;
+ if (baseDirectory) {
+ strcpy(tmpDirBuf,baseDirectory);
+ pos = file_locateFilename(tmpDirBuf);
+ }
+ if (pos) *pos='\0';
+ else file_assureDirectory(tmpDirBuf,app_res.scratch_dir);
if (!baseFilename) baseFilename= ".";
strcpy(tmpNameBuf,baseFilename);
--- gv-3.5.8.orig/source/save.c
+++ gv-3.5.8/source/save.c
@@ -112,17 +112,19 @@
String print_filename;
{
String error=NULL;
+ char *print_quoted_filename;
char *c,*p;
Cardinal m,n;
String printfail=GV_ERROR_PRINT_FAIL;
BEGINMESSAGE(print_file)
+ print_quoted_filename = quote_filename(print_filename);
p = GV_XtNewString(print_command);
n=0;
c=p;
while ((c=strstr(c,"%s"))) { c+=2; n++; }
- m = (strlen(p)+(n>0?n:1)*strlen(print_filename)+5)*sizeof(char);
+ m = (strlen(p)+(n>0?n:1)*strlen(print_quoted_filename)+5)*sizeof(char);
c = (char*) GV_XtMalloc(m);
if (n>0) {
char *e,*s;
@@ -133,13 +135,13 @@
if (s) *s='\0';
strcat(c,e);
if (s) {
- strcat(c,print_filename);
+ strcat(c,print_quoted_filename);
e=s+2;
}
else s=NULL;
}
} else {
- sprintf(c, "%s %s",p,print_filename);
+ sprintf(c, "%s %s",p,print_quoted_filename);
}
INFSMESSAGE(printing:,c)
if (SYSTEM_FAILED_ON(c)) {
@@ -149,6 +151,7 @@
}
GV_XtFree(c);
GV_XtFree(p);
+ GV_XtFree(print_quoted_filename);
ENDMESSAGE(print_file)
return(error);
}
@@ -198,6 +201,9 @@
char proc_name[256];
char *error=NULL;
char *pos;
+ char *pdfpos;
+ char *pspos;
+ char *quoted_src_fn, *quoted_conv_fn;
BEGINMESSAGE(save_forkPDFToPSConversion)
@@ -205,7 +211,30 @@
strcpy(proc_name,pos);
strcat(proc_name," conversion");
- sprintf(command,gv_gs_cmd_conv_pdf,sd->conv_fn,sd->src_fn);
+ quoted_src_fn = quote_filename(sd->src_fn);
+ quoted_conv_fn = quote_filename(sd->conv_fn);
+ if ((pdfpos = strstr(gv_gs_cmd_conv_pdf,"%pdf")) &&
+ (pspos = strstr(gv_gs_cmd_conv_pdf,"%ps"))) {
+ command[0] = '\0';
+ if (pdfpos < pspos) {
+ strncat(command,gv_gs_cmd_conv_pdf,(pdfpos-gv_gs_cmd_conv_pdf));
+ strcat(command,quoted_src_fn);
+ strncat(command,pdfpos+4,(pspos-pdfpos-4));
+ strcat(command,quoted_conv_fn);
+ strcat(command,pspos+3);
+ } else {
+ strncat(command,gv_gs_cmd_conv_pdf,(pspos-gv_gs_cmd_conv_pdf));
+ strcat(command,quoted_conv_fn);
+ strncat(command,pspos+3,(pdfpos-pspos-3));
+ strcat(command,quoted_src_fn);
+ strcat(command,pdfpos+4);
+ }
+ } else {
+ sprintf(command,gv_gs_cmd_conv_pdf,quoted_conv_fn,quoted_src_fn);
+ }
+ GV_XtFree(quoted_src_fn);
+ GV_XtFree(quoted_conv_fn);
+
INFSMESSAGE(starting conversion:,command)
process_fork(proc_name,command,save_forkPDFToPSConversionDone,(XtPointer)sd);
ENDMESSAGE(save_forkPDFToPSConversion)
--- gv-3.5.8.orig/source/main_resources.h
+++ gv-3.5.8/source/main_resources.h
@@ -285,10 +285,10 @@
{ "-spartan" , ".style" , XrmoptionNoArg , "gv_spartan.dat"},
{ "-pixmap" , ".useBackingPixmap" , XrmoptionNoArg , "True" },
{ "-nopixmap" , ".useBackingPixmap" , XrmoptionNoArg , "False" },
- { "-quiet" , ".quiet" , XrmoptionNoArg , "True" },
- { "-noquiet" , ".quiet" , XrmoptionNoArg , "False" },
- { "-safer" , ".safer" , XrmoptionNoArg , "True" },
- { "-nosafer" , ".safer" , XrmoptionNoArg , "False" },
+ { "-quiet" , ".gsQuiet" , XrmoptionNoArg , "True" },
+ { "-noquiet" , ".gsQuiet" , XrmoptionNoArg , "False" },
+ { "-safer" , ".gsSafer" , XrmoptionNoArg , "True" },
+ { "-nosafer" , ".gsSafer" , XrmoptionNoArg , "False" },
{ "-arguments" , ".arguments" , XrmoptionSepArg , NULL },
{ "-h" , ".help" , XrmoptionNoArg , "?" },
{ "-?" , ".help" , XrmoptionNoArg , "?" },
--- gv-3.5.8.orig/source/process.c
+++ gv-3.5.8/source/process.c
@@ -272,8 +272,7 @@
pid = fork();
if (pid == 0) { /* child */
- int argc=0;
- char *argv[20];
+ char *argv[3];
char *c;
INFMESSAGE(child process)
@@ -286,15 +285,10 @@
*/
system(c);
#else
- while (isspace(*c)) c++;
- while (*c) {
- argv[argc++] = c;
- while (*c && !isspace(*c)) c++;
- if (*c) *c++ = '\0';
- while (isspace(*c)) c++;
- SMESSAGE(argv[argc-1])
- }
- argv[argc] = NULL;
+ argv[0] = "sh";
+ argv[1] = "-c";
+ argv[2] = c;
+ argv[3] = NULL;
INFMESSAGE(spawning conversion process)
/*
--- gv-3.5.8.orig/source/miscmenu.c
+++ gv-3.5.8/source/miscmenu.c
@@ -60,7 +60,7 @@
static MiscMenuEntryStruct miscmenu_entries[] = {
{ "update",cb_checkFile,(XtPointer)CHECK_FILE_DATE,2 },
- { "redisplay",cb_redisplay,NULL,2 },
+ { "redisplay",cb_redisplay,NULL,3 },
{ "toggle_current" , cb_setPageMark, (XtPointer)(SPM_CURRENT|SPM_TOGGLE),1 },
{ "toggle_even" , cb_setPageMark, (XtPointer)(SPM_EVEN|SPM_TOGGLE),1 },
{ "toggle_odd" , cb_setPageMark, (XtPointer)(SPM_ODD|SPM_TOGGLE),1 },
--- gv-3.5.8.orig/source/gv_user_res.dat
+++ gv-3.5.8/source/gv_user_res.dat
@@ -8,7 +8,7 @@
GV.fallbackOrientation: portrait
GV.swapLandscape: False
GV.autoCenter: True
-GV.antialias: False
+GV.antialias: True
GV.respectDSC: True
GV.ignoreEOF: True
GV.confirmPrint: True
--- gv-3.5.8.orig/source/options_fs.c
+++ gv-3.5.8/source/options_fs.c
@@ -105,7 +105,6 @@
Widget w;
XtPointer client_data, call_data;
{
- BEGINMESSAGE(options_fs_cb_apply)
Arg args[5];
Cardinal n;
static Boolean s_scratch_dir = False;
--- gv-3.5.8.orig/source/secscanf.c
+++ gv-3.5.8/source/secscanf.c
@@ -0,0 +1,540 @@
+/*
+ * Secure sscanf - sscanf with an additional size argument for string
+ * arguments. All format specifiers should work as in the standard
+ * scanf - except for those writing to a string buffer provided by the
+ * caller. These specifiers take an additional argument of type size_t
+ * that specifies the size of the buffer.
+ *
+ * Copyright (C) 2002, Olaf Kirch <okir@suse.de>
+ */
+
+#define _GNU_SOURCE
+
+#include <sys/param.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <ctype.h>
+
+enum {
+ CONV_ANY,
+ CONV_STR,
+ CONV_NUM,
+ CONV_INTEGER,
+ CONV_FLOAT,
+ CONV_POINTER,
+};
+
+enum {
+ SIZE_ANY,
+ SIZE_SHORT,
+ SIZE_LONG,
+ SIZE_QUAD,
+};
+
+union scan_value {
+ const char * v_string;
+ long long v_signed;
+ unsigned long long v_integer;
+ long double v_double;
+ void * v_pointer;
+};
+
+
+static int process_number(union scan_value *vp, const char **sp, char fmt);
+static int process_char_class(const char **, const char **, int);
+
+static inline int
+set_conv_type(int *type, int new_type)
+{
+ switch (*type) {
+ case CONV_ANY:
+ break;
+ case CONV_NUM:
+ if (new_type == CONV_INTEGER
+ || new_type == CONV_FLOAT
+ || new_type == CONV_POINTER)
+ break;
+ /* fallthru */
+ default:
+ if (*type != new_type)
+ return 0;
+ break;
+ }
+
+ *type = new_type;
+ return 1;
+}
+
+int
+sec_sscanf(const char *s, const char *fmt, ...)
+{
+ const char *begin = s;
+ int num_fields = 0, fmt_empty = 1;
+ va_list ap;
+
+ va_start(ap, fmt);
+ while (*fmt) {
+ union scan_value value;
+ const char *pre_space_skip,
+ *value_begin;
+ int assign = 1, allocate = 0,
+ conv_type = CONV_ANY,
+ conv_size = SIZE_ANY,
+ field_width = -1,
+ nul_terminated = 1;
+ char c;
+
+ c = *fmt++;
+ if (isspace(c)) {
+ while (isspace(*s))
+ s++;
+ continue;
+ }
+
+ fmt_empty = 0;
+ if (c != '%') {
+ if (c != *s)
+ goto stop;
+ s++;
+ continue;
+ }
+
+ /* Each % directive implicitly skips white space
+ * except for the %c case */
+ pre_space_skip = s;
+ while (isspace(*s))
+ s++;
+
+ while (1) {
+ int type = CONV_ANY, size = SIZE_ANY;
+
+ switch (*fmt) {
+ case '*':
+ assign = 0;
+ break;
+ case 'a':
+ type = CONV_STR;
+ allocate = 1;
+ break;
+ case 'h':
+ type = CONV_INTEGER;
+ size = SIZE_SHORT;
+ break;
+ case 'l':
+ type = CONV_NUM;
+ size = SIZE_LONG;
+ break;
+ case 'L':
+ case 'q':
+ type = CONV_NUM;
+ size = SIZE_QUAD;
+ break;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ field_width = strtol(fmt, (char **) &fmt, 10);
+ fmt--;
+ break;
+ default:
+ goto flags_done;
+ }
+
+ if (!set_conv_type(&conv_type, type))
+ goto stop;
+
+ if (size != SIZE_ANY) {
+ if (size == SIZE_LONG && conv_size == SIZE_LONG)
+ conv_size = SIZE_QUAD;
+ else
+ conv_size = size;
+ }
+
+ fmt++;
+ }
+
+ flags_done:
+ value_begin = s;
+
+ switch (*fmt++) {
+ case '%':
+ if (*s == '\0')
+ goto eof;
+ if (*s != '%')
+ goto stop;
+ continue;
+ case '[':
+ value.v_string = s;
+ if (!set_conv_type(&conv_type, CONV_STR)
+ || !process_char_class(&fmt, &s, field_width))
+ goto stop;
+ break;
+ case 's':
+ value.v_string = s;
+ if (!set_conv_type(&conv_type, CONV_STR))
+ goto stop;
+ while (*s && !isspace(*s) && field_width-- != 0)
+ s++;
+ break;
+ case 'c':
+ if (!set_conv_type(&conv_type, CONV_STR))
+ goto stop;
+ value.v_string = s = value_begin = pre_space_skip;
+
+ if (field_width < 0)
+ s++;
+ else while (*s && field_width--)
+ s++;
+ nul_terminated = 0;
+ break;
+ case 'd':
+ case 'i':
+ case 'o':
+ case 'u':
+ case 'x':
+ case 'X':
+ if (!set_conv_type(&conv_type, CONV_INTEGER)
+ || !process_number(&value, &s, fmt[-1]))
+ goto stop;
+ break;
+ case 'p':
+ if (!set_conv_type(&conv_type, CONV_POINTER)
+ || !process_number(&value, &s, fmt[-1]))
+ goto stop;
+ break;
+ case 'f':
+ case 'g':
+ case 'e':
+ case 'E':
+ if (!set_conv_type(&conv_type, CONV_FLOAT)
+ || !process_number(&value, &s, fmt[-1]))
+ goto stop;
+ break;
+ case 'n':
+ if (!set_conv_type(&conv_type, CONV_INTEGER))
+ goto stop;
+ value.v_signed = (s - begin);
+ break;
+ default:
+ goto stop;
+ }
+
+ /* We've consumed what we need to consume. Now copy */
+ if (!assign)
+ continue;
+
+ /* Make sure we've consumed at least *something* */
+ if (s == value_begin)
+ goto eof;
+
+ /* Deal with a conversion flag */
+ if (conv_type == CONV_STR && allocate) {
+ value.v_pointer = strdup(value.v_string); ((char *)value.v_pointer)[s - value.v_string] = '\0';
+ conv_type = CONV_POINTER;
+ allocate = 0;
+ }
+
+ switch (conv_type) {
+ case CONV_STR:
+ {
+ const char *string = value.v_string;
+ char *buf;
+ size_t size;
+
+ if (string == NULL)
+ goto stop;
+ buf = va_arg(ap, char *);
+ size = va_arg(ap, size_t) - nul_terminated;
+ if (size > s - string)
+ size = s - string;
+ strncpy(buf, string, size);
+ if (nul_terminated)
+ buf[size] = '\0';
+ }
+ break;
+
+ case CONV_POINTER:
+ {
+ void **ptr;
+
+ ptr = va_arg(ap, void **);
+ *ptr = value.v_pointer;
+ }
+ break;
+ case CONV_INTEGER:
+ {
+ void *ptr;
+
+ ptr = va_arg(ap, void *);
+ switch (conv_size) {
+ case SIZE_SHORT:
+ *(short *) ptr = value.v_integer;
+ break;
+ case SIZE_ANY:
+ *(int *) ptr = value.v_integer;
+ break;
+ case SIZE_LONG:
+ *(long *) ptr = value.v_integer;
+ break;
+ case SIZE_QUAD:
+ *(long long *) ptr = value.v_integer;
+ break;
+ default:
+ goto stop;
+ }
+ }
+ break;
+ case CONV_FLOAT:
+ {
+ void *ptr;
+
+ ptr = va_arg(ap, void *);
+ switch (conv_size) {
+ case SIZE_ANY:
+ *(float *) ptr = value.v_double;
+ break;
+ case SIZE_LONG:
+ *(double *) ptr = value.v_double;
+ break;
+ case SIZE_QUAD:
+ *(long double *) ptr = value.v_double;
+ break;
+ default:
+ goto stop;
+ }
+ }
+ break;
+ default:
+ goto stop;
+ }
+
+ num_fields++;
+ }
+
+stop: return num_fields;
+
+eof: if (num_fields)
+ return num_fields;
+ return EOF;
+}
+
+static int
+process_number(union scan_value *vp, const char **sp, char fmt)
+{
+ const char *s = *sp;
+
+ switch (fmt) {
+ case 'd':
+ vp->v_signed = strtoll(s, (char **) sp, 10);
+ break;
+ case 'i':
+ vp->v_signed = strtoll(s, (char **) sp, 0);
+ break;
+ case 'o':
+ vp->v_integer = strtoull(s, (char **) sp, 8);
+ break;
+ case 'u':
+ vp->v_integer = strtoull(s, (char **) sp, 10);
+ break;
+ case 'x':
+ case 'X':
+ vp->v_integer = strtoull(s, (char **) sp, 16);
+ break;
+ case 'p':
+ vp->v_pointer = (void *) strtoull(s, (char **) sp, 0);
+ break;
+ case 'f':
+ case 'g':
+ case 'e':
+ case 'E':
+ vp->v_double = strtod(s, (char **) sp);
+ break;
+ default:
+ return 0;
+ }
+
+ return 1;
+}
+
+static int
+process_char_class(const char **fmt, const char **sp, int width)
+{
+ unsigned char *s, c, prev_char = 0;
+ unsigned char table[255];
+ int val = 1;
+
+ s = (unsigned char *) *fmt;
+ if (*s == '^') {
+ memset(table, 1, sizeof(table));
+ val = 0;
+ s++;
+ } else {
+ memset(table, 0, sizeof(table));
+ val = 1;
+ }
+ /* First character in set is closing bracket means add it to the
+ * set of characters */
+ if ((c = *s) == ']') {
+ table[c] = val;
+ prev_char = c;
+ s++;
+ }
+
+ /* Any other closing bracket finishes off the set */
+ while ((c = *s++) != ']') {
+ if (prev_char) {
+ if (c == '-' && *s != '\0' && *s != ']') {
+ c = *s++;
+ } else {
+ //table[prev_char] = val;
+ prev_char = '\0';
+ }
+ }
+
+ if (c == '\0')
+ return 0;
+
+ if (prev_char) {
+ while (prev_char < c)
+ table[prev_char++] = val;
+ }
+ table[c] = val;
+ prev_char = c;
+ }
+ *fmt = (char *) s;
+
+#if 0
+ {
+ int n;
+
+ printf("char class=");
+ for (n = 0; n < 255; n++)
+ if (table[n])
+ printf(isprint(n)? "%c" : "\\%03o", n);
+ printf("\n");
+ }
+#endif
+
+ s = (unsigned char *) *sp;
+ while ((c = *s) != '\0' && table[c] && width--)
+ s++;
+
+ *sp = (char *) s;
+ return 1;
+}
+
+#ifdef TEST
+static int verify(const char *fmt, const char *s);
+static int verify_s(const char *fmt, const char *s);
+
+
+
+int
+main(int argc, char **argv)
+{
+ verify("%d %d", "12 13");
+ verify("%d-%d", "12 13");
+ verify("%d-%d", "12-13");
+ verify("%u %u", "12 13");
+ verify("%o %o", "12 13");
+ verify("%x %x", "12 13");
+ verify("%X %X", "12 13");
+ verify("%hd %hd", "12 13");
+ verify("%ld %ld", "12 13");
+ verify("%lld %lld", "12 13");
+ verify("%Ld %Ld", "12 13");
+ verify("%qd %qd", "12 13");
+ verify("%f %f", "12 13");
+ verify("%lf %lf", "12 13");
+ verify("%Lf %Lf", "12 13");
+ verify("%qf %qf", "12 13");
+ verify("%*d-%d", "12-13");
+ verify("%*s %d", "12 13");
+ verify("%p", "0xdeadbeef");
+ verify("%*[a-e] %x", "deadbeef feeb");
+ verify("%*[a-f] %x", "deadbeef feeb");
+ verify("%*[^g-z] %x", "deadbeef feeb");
+ verify("%*[^ g-z] %x", "deadbeef feeb");
+ verify("%*[^ g-z-] %x", "dead-beef feeb");
+ verify("%*5s %d", "toast123 456");
+ verify("", "lalla");
+ verify("%u", "");
+
+ verify_s("%s", "aa bb");
+ verify_s("%s %s", "aa bb");
+ verify_s("%[a-z] %s", "aa bb");
+ verify_s("%c %s", "aa bb");
+ verify_s("%2c %s", " aa bb");
+ verify_s("%20c %s", " aa bb");
+
+ return 0;
+}
+
+static int
+verify(const char *fmt, const char *s)
+{
+ union scan_value vals[5], vals_ref[5], *v;
+ int n, m;
+
+ memset(vals, 0xe5, sizeof(vals));
+ memset(vals_ref, 0xe5, sizeof(vals_ref));
+
+ v = vals;
+ n = sec_sscanf(s, fmt, v + 0, v + 1, v + 2, v + 3, v + 4);
+
+ v = vals_ref;
+ m = sscanf(s, fmt, v + 0, v + 1, v + 2, v + 3, v + 4);
+
+ if (m != n) {
+ printf("FAILED: fmt=\"%s\"\n"
+ " str=\"%s\"\n"
+ " sec_scanf returns %d, sscanf returns %d\n",
+ fmt, s, n, m);
+ return 0;
+ }
+
+ if (memcmp(vals, vals_ref, sizeof(vals))) {
+ printf("FAILED: fmt=\"%s\"\n"
+ " str=\"%s\"\n"
+ " data differs!\n",
+ fmt, s);
+ printf("0x%Lx != 0x%Lx\n", vals[0].v_integer, vals_ref[0].v_integer);
+ return 0;
+ }
+
+ return 1;
+}
+
+static int
+verify_s(const char *fmt, const char *s)
+{
+ char buf[3][256], buf_ref[3][256];
+ int n, m;
+
+ memset(buf, 0xe5, sizeof(buf));
+ memset(buf_ref, 0xe5, sizeof(buf_ref));
+
+ n = sec_sscanf(s, fmt, buf, sizeof(buf[0]), buf + 1, sizeof(buf[1]), buf + 2, sizeof(buf[2]));
+
+ m = sscanf(s, fmt, buf_ref, buf_ref + 1, buf_ref + 2);
+
+ if (m != n) {
+ printf("FAILED: fmt=\"%s\"\n"
+ " str=\"%s\"\n"
+ " sec_scanf returns %d, sscanf returns %d\n",
+ fmt, s, n, m);
+ return 0;
+ }
+
+ if (memcmp(buf, buf_ref, sizeof(buf))) {
+ printf("FAILED: fmt=\"%s\"\n"
+ " str=\"%s\"\n"
+ " data differs!\n",
+ fmt, s);
+ printf("%s != %s\n", buf[0], buf_ref[0]);
+ return 0;
+ }
+
+ return 1;
+}
+#endif
--- gv-3.5.8.orig/source/Imakefile
+++ gv-3.5.8/source/Imakefile
@@ -63,6 +63,7 @@
resource.c\
save.c\
scale.c\
+ secscanf.c\
signal.c\
version.c\
widgets_misc.c\
@@ -106,6 +107,7 @@
resource.o\
save.o\
scale.o\
+ secscanf.o\
signal.o\
version.o\
widgets_misc.o\