From 08607c3e0ce5fa5c43b236ca379ed5aaa66ed858 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 14 Mar 2000 22:04:35 +0000 Subject: Fixed parsing issue with HP printer defs reported by HP. Jeremy. (This used to be commit 035272e6bcc8c43bf4521e4a20b0c35b0901e904) --- source3/utils/make_printerdef.c | 88 +++++++++++++++++++++++++++++------------ 1 file changed, 62 insertions(+), 26 deletions(-) diff --git a/source3/utils/make_printerdef.c b/source3/utils/make_printerdef.c index 33aec325c2..f403ee79bb 100644 --- a/source3/utils/make_printerdef.c +++ b/source3/utils/make_printerdef.c @@ -338,8 +338,8 @@ static void scan_copyfiles(FILE *fichier, char *chaine) fprintf(stderr,"\tsubdir %s:%s\n",sub_dir[i][0],sub_dir[i][1]); #endif if (strcmp(sub_dir[i][0],part)==0) - pstrcpy(direc,sub_dir[i][1]); - i++; + pstrcpy(direc,sub_dir[i][1]); + i++; } i=0; while (*buffer[i]!='\0') { @@ -350,48 +350,84 @@ static void scan_copyfiles(FILE *fichier, char *chaine) * * pscript.hlp = pscript.hl_ * hpdcmon.dll,hpdcmon.dl_ + * MSVCRT.DLL,MSVCRT.DL_,,32 * ctl3dv2.dll,ctl3dv2.dl_,ctl3dv2.tmp * * In the first 2 cases you want the first file name - in the last case * you only want the last file name (at least that is what a Win95 - * machine sent). This may still be wrong but at least I get the same list + * machine sent). In the third case you also want the first file name + * (detect by the last component being just a number ?). + * This may still be wrong but at least I get the same list * of files as seen on a printer test page. */ part = strchr(buffer[i],'='); if (part) { + /* + * Case (1) eg. pscript.hlp = pscript.hl_ - chop after the first name. + */ + *part = '\0'; - while (--part > buffer[i]) - if ((*part == ' ') || (*part =='\t')) *part = '\0'; - else break; - } else { - part = strchr(buffer[i],','); - if (part) { - if ((mpart = strrchr(part+1,','))!=NULL) { - pstrcpy(buffer[i],mpart+1); - } else - *part = '\0'; + + /* + * Now move back to the start and print that. + */ + + while (--part > buffer[i]) { + if ((*part == ' ') || (*part =='\t')) + *part = '\0'; + else + break; + } + } else { + part = strchr(buffer[i],','); + if (part) { + /* + * Cases (2-4) + */ + + if ((mpart = strrchr(part+1,','))!=NULL) { + /* + * Second ',' - case 3 or 4. + * Check if the last part is just a number, + * if so we need the first part. + */ + + char *endptr = NULL; + BOOL isnumber = False; + + mpart++; + (void)strtol(mpart, &endptr, 10); + + isnumber = ((endptr > mpart) && isdigit(*mpart)); + if(!isnumber) + pstrcpy(buffer[i],mpart+1); + else + *part = '\0'; + } else { + *part = '\0'; + } while (--part > buffer[i]) if ((*part == ' ') || (*part =='\t')) *part = '\0'; else break; - } - } - if (*buffer[i] != ';') { + } + } + if (*buffer[i] != ';') { if (strlen(files_to_copy) != 0) pstrcat(files_to_copy,","); - pstrcat(files_to_copy,direc); - pstrcat(files_to_copy,buffer[i]); - fprintf(stderr,"%s%s\n",direc,buffer[i]); - } - i++; - } + pstrcat(files_to_copy,direc); + pstrcat(files_to_copy,buffer[i]); + fprintf(stderr,"%s%s\n",direc,buffer[i]); + } + i++; + } /* end while */ } part=strtok(NULL,","); - if (part) + if (part) { while( *part ==' ' && *part != '\0') { - part++; + part++; } - } - while (part!=NULL); + } + } while (part!=NULL); fprintf(stderr,"\n"); } -- cgit