void help(char *file) { if(file){ char* p_file = copy(file); char* p_uri = p_file; char* p_param = strrchr(p_file,'#'); if(p_param){ *p_param = '\0'; } if(! GFileIsAbsolute(p_file)){ p_uri = (char*) galloc( 256 + strlen(GResourceProgramDir) + strlen(p_file) ); strcpy(p_uri, GResourceProgramDir); /* doc/fontforge/ja/file */ strcat(p_uri, "/doc/fontforge/"); AppendSupportedLocale(p_uri); strcat(p_uri, p_file); if(!GFileReadable(p_uri)){ strcpy(p_uri, GResourceProgramDir);/* doc/fontforge/file */ strcat(p_uri, "/doc/fontforge/"); strcat(p_uri, p_file); if(!GFileReadable(p_uri)){ strcpy(p_uri, "http://fontforge.sourceforge.net/"); /* http://host/ja/file */ AppendSupportedLocale(p_uri); strcat(p_uri, p_file); } } } if(p_param){ if(p_uri != p_file) strcat(p_uri, p_param); else *p_param = '#'; } /* using default browser */ ShellExecute(NULL, "open", p_uri, NULL, NULL, SW_SHOWDEFAULT); if(p_uri != p_file) gfree(p_uri); } }
/* by LoadSplineFont (which does) and by RevertFile (which knows what it's doing) */ SplineFont *_ReadSplineFont(FILE *file,char *filename,enum openflags openflags) { SplineFont *sf; char ubuf[250], *temp; int fromsfd = false; int i; char *pt, *strippedname, *oldstrippedname, *tmpfile=NULL, *paren=NULL, *fullname=filename, *rparen; int len; int checked; int compression=0; int wasurl = false, nowlocal = true; if ( filename==NULL ) return( NULL ); strippedname = filename; pt = strrchr(filename,'/'); if ( pt==NULL ) pt = filename; /* Someone gave me a font "Nafees Nastaleeq(Updated).ttf" and complained */ /* that ff wouldn't open it */ /* Now someone will complain about "Nafees(Updated).ttc(fo(ob)ar)" */ if ( (paren = strrchr(pt,'('))!=NULL && (rparen = strrchr(paren,')'))!=NULL && rparen[1]=='\0' ) { strippedname = copy(filename); strippedname[paren-filename] = '\0'; } pt = strrchr(strippedname,'.'); i = -1; if ( pt!=NULL ) for ( i=0; compressors[i].ext!=NULL; ++i ) if ( strcmp(compressors[i].ext,pt)==0 ) break; oldstrippedname = strippedname; if ( i==-1 || compressors[i].ext==NULL ) i=-1; else { if ( file!=NULL ) { char *spuriousname = ForceFileToHaveName(file,compressors[i].ext); tmpfile = Decompress(spuriousname,i); fclose(file); file = NULL; unlink(spuriousname); free(spuriousname); } else tmpfile = Decompress(strippedname,i); if ( tmpfile!=NULL ) { strippedname = tmpfile; } else { ff_post_error(_("Decompress Failed!"),_("Decompress Failed!")); return( NULL ); } compression = i+1; if ( strippedname!=filename && paren!=NULL ) { fullname = galloc(strlen(strippedname)+strlen(paren)+1); strcpy(fullname,strippedname); strcat(fullname,paren); } else fullname = strippedname; } /* If there are no pfaedit windows, give them something to look at */ /* immediately. Otherwise delay a bit */ strcpy(ubuf,_("Loading font from ")); len = strlen(ubuf); if ( !wasurl || i==-1 ) /* If it wasn't compressed, or it wasn't an url, then the fullname is reasonable, else use the original name */ strncat(ubuf,temp = copy(GFileNameTail(fullname)),100); else strncat(ubuf,temp = copy(GFileNameTail(filename)),100); free(temp); ubuf[100+len] = '\0'; ff_progress_start_indicator(FontViewFirst()==NULL?0:10,_("Loading..."),ubuf,_("Reading Glyphs"),0,1); ff_progress_enable_stop(0); if ( file==NULL ) { file = fopen(strippedname,"rb"); nowlocal = true; } sf = NULL; checked = false; /* checked == false => not checked */ /* checked == 'u' => UFO */ /* checked == 't' => TTF/OTF */ /* checked == 'p' => pfb/general postscript */ /* checked == 'P' => pdf */ /* checked == 'c' => cff */ /* checked == 'S' => svg */ /* checked == 'f' => sfd */ /* checked == 'F' => sfdir */ /* checked == 'b' => bdf */ /* checked == 'i' => ikarus */ if ( file!=NULL ) { /* Try to guess the file type from the first few characters... */ int ch1 = getc(file); int ch2 = getc(file); int ch3 = getc(file); int ch4 = getc(file); int ch9, ch10; fseek(file, 98, SEEK_SET); ch9 = getc(file); ch10 = getc(file); rewind(file); if (( ch1==0 && ch2==1 && ch3==0 && ch4==0 ) || (ch1=='O' && ch2=='T' && ch3=='T' && ch4=='O') || (ch1=='t' && ch2=='r' && ch3=='u' && ch4=='e') || (ch1=='t' && ch2=='t' && ch3=='c' && ch4=='f') ) { sf = _SFReadTTF(file,0,openflags,fullname,NULL); checked = 't'; } else if (( ch1=='%' && ch2=='!' ) || ( ch1==0x80 && ch2=='\01' ) ) { /* PFB header */ sf = _SFReadPostscript(file,fullname); checked = 'p'; } else if ( ch1==1 && ch2==0 && ch3==4 ) { int len; fseek(file,0,SEEK_END); len = ftell(file); fseek(file,0,SEEK_SET); sf = _CFFParse(file,len,NULL); checked = 'c'; } /* Too hard to figure out a valid mark for a mac resource file */ if ( file!=NULL ) fclose(file); } if ( sf!=NULL ) /* good */; else if (( strmatch(fullname+strlen(fullname)-4, ".ttf")==0 || strmatch(fullname+strlen(strippedname)-4, ".ttc")==0 || strmatch(fullname+strlen(fullname)-4, ".gai")==0 || strmatch(fullname+strlen(fullname)-4, ".otf")==0 || strmatch(fullname+strlen(fullname)-4, ".otb")==0 ) && checked!='t') { sf = SFReadTTF(fullname,0,openflags); } else if ( strmatch(fullname+strlen(strippedname)-4, ".bin")==0 || strmatch(fullname+strlen(strippedname)-4, ".hqx")==0 || strmatch(fullname+strlen(strippedname)-6, ".dfont")==0 ) { sf = SFReadMacBinary(fullname,0,openflags); } else if ( (strmatch(fullname+strlen(fullname)-4, ".pfa")==0 || strmatch(fullname+strlen(fullname)-4, ".pfb")==0 || strmatch(fullname+strlen(fullname)-4, ".pf3")==0 || strmatch(fullname+strlen(fullname)-4, ".cid")==0 || strmatch(fullname+strlen(fullname)-4, ".gsf")==0 || strmatch(fullname+strlen(fullname)-4, ".pt3")==0 || strmatch(fullname+strlen(fullname)-3, ".ps")==0 ) && checked!='p' ) { sf = SFReadPostscript(fullname); } else if ( strmatch(fullname+strlen(fullname)-4, ".cff")==0 && checked!='c' ) { sf = CFFParse(fullname); } else { sf = SFReadMacBinary(fullname,0,openflags); } ff_progress_end_indicator(); if ( sf!=NULL ) { SplineFont *norm = sf->mm!=NULL ? sf->mm->normal : sf; if ( compression!=0 ) { free(sf->filename); *strrchr(oldstrippedname,'.') = '\0'; sf->filename = copy( oldstrippedname ); } if ( fromsfd ) sf->compression = compression; free( norm->origname ); if ( sf->chosenname!=NULL && strippedname==filename ) { norm->origname = galloc(strlen(filename)+strlen(sf->chosenname)+8); strcpy(norm->origname,filename); strcat(norm->origname,"("); strcat(norm->origname,sf->chosenname); strcat(norm->origname,")"); } else norm->origname = copy(filename); free( norm->chosenname ); norm->chosenname = NULL; if ( sf->mm!=NULL ) { int j; for ( j=0; j<sf->mm->instance_count; ++j ) { free(sf->mm->instances[j]->origname); sf->mm->instances[j]->origname = copy(norm->origname); } } } else if ( !GFileExists(filename) ) ff_post_error(_("Couldn't open font"),_("The requested file, %.100s, does not exist"),GFileNameTail(filename)); else if ( !GFileReadable(filename) ) ff_post_error(_("Couldn't open font"),_("You do not have permission to read %.100s"),GFileNameTail(filename)); else ff_post_error(_("Couldn't open font"),_("%.100s is not in a known format (or is so badly corrupted as to be unreadable)"),GFileNameTail(filename)); if ( oldstrippedname!=filename ) free(oldstrippedname); if ( fullname!=filename && fullname!=strippedname ) free(fullname); if ( tmpfile!=NULL ) { unlink(tmpfile); free(tmpfile); } if ( (openflags&of_fstypepermitted) && sf!=NULL && (sf->pfminfo.fstype&0xff)==0x0002 ) { /* Ok, they have told us from a script they have access to the font */ } else if ( !fromsfd && sf!=NULL && (sf->pfminfo.fstype&0xff)==0x0002 ) { char *buts[3]; buts[0] = _("_Yes"); buts[1] = _("_No"); buts[2] = NULL; if ( ff_ask(_("Restricted Font"),(const char **) buts,1,1,_("This font is marked with an FSType of 2 (Restricted\nLicense). That means it is not editable without the\npermission of the legal owner.\n\nDo you have such permission?"))==1 ) { SplineFontFree(sf); return( NULL ); } } return( sf ); }
void help(char *file) { char fullspec[1024], *temp, *pt; if ( browser[0]=='\0' ) findbrowser(); #ifndef __CygWin if ( browser[0]=='\0' ) { gwwv_post_error(_("No Browser"),_("Could not find a browser. Set the BROWSER environment variable to point to one")); return; } #endif if ( strstr(file,"http://")==NULL ) { fullspec[0] = 0; if ( ! GFileIsAbsolute(file) ) { if ( helpdir==NULL || *helpdir=='\0' ) { #ifdef DOCDIR strcpy(fullspec,DOCDIR "/"); #elif defined(SHAREDIR) strcpy(fullspec,SHAREDIR "/doc/fontforge/"); #else strcpy(fullspec,"/usr/local/share/doc/fontforge/"); #endif } else { strcpy(fullspec,helpdir); } } strcat(fullspec,file); if (( pt = strrchr(fullspec,'#') )!=NULL ) *pt ='\0'; if ( !GFileReadable( fullspec )) { if ( *file!='/' ) { strcpy(fullspec,"/usr/share/doc/fontforge/"); strcat(fullspec,file); if (( pt = strrchr(fullspec,'#') )!=NULL ) *pt ='\0'; } } if ( !GFileReadable( fullspec )) { strcpy(fullspec,"http://fontforge.sf.net/"); AppendSupportedLocale(fullspec); strcat(fullspec,file); } else if ( pt!=NULL ) *pt = '#'; } else strcpy(fullspec,file); #if __CygWin if ( (strstrmatch(browser,"/cygdrive")!=NULL || browser[0]=='\0') && strstr(fullspec,":/")==NULL ) { /* It looks as though the browser is a windows application, so we */ /* should give it a windows file name */ char *pt, *tpt; temp = galloc(1024); cygwin_conv_to_full_win32_path(fullspec,temp); for ( pt = fullspec, tpt = temp; *tpt && pt<fullspec+sizeof(fullspec)-3; *pt++ = *tpt++ ) if ( *tpt=='\\' ) *pt++ = '\\'; *pt = '\0'; free(temp); } #endif #if __Mac if ( strcmp(browser,"open")==0 ) /* open doesn't want "file:" prepended */; else #endif if ( strstr(fullspec,":/")==NULL ) { char *t1 = galloc(strlen(fullspec)+strlen("file:")+20); #if __CygWin sprintf( t1, "file:\\\\\\%s", fullspec ); #else sprintf( t1, "file:%s", fullspec); #endif strcpy(fullspec,t1); free(t1); } #if 0 && __Mac /* Starting a Mac application is weird... system() can't do it */ /* Thanks to Edward H. Trager giving me an example... */ if ( strstr(browser,".app")!=NULL ) { *strstr(browser,".app") = '\0'; pt = strrchr(browser,'/'); if ( pt==NULL ) pt = browser-1; ++pt; temp = galloc(strlen(pt)+strlen(fullspec) + strlen( "osascript -l AppleScript -e \"Tell application \"\" to getURL \"\"\"" )+ 20); /* this doesn't work on Max OS X.0 (osascript does not support -e) */ sprintf( temp, "osascript -l AppleScript -e \"Tell application \"%s\" to getURL \"%s\"\"", pt, fullspec); system(temp); ff_post_notice(_("Leave X"),_("A browser is probably running in the native Mac windowing system. You must leave the X environment to view it. Try Cmd-Opt-A")); } else { #elif __Mac /* This seems a bit easier... Thanks to riggle */ if ( strcmp(browser,"open")==0 ) { char *str = "DYLD_LIBRARY_PATH=\"\"; open "; temp = galloc(strlen(str) + strlen(fullspec) + 20); sprintf( temp, "%s \"%s\" &", str, fullspec ); system(temp); } else { #elif __CygWin if ( browser[0]=='\0' ) { do_windows_browser(fullspec); temp = NULL; } else { #else { #endif temp = galloc(strlen(browser) + strlen(fullspec) + 20); sprintf( temp, strcmp(browser,"kfmclient openURL")==0 ? "%s \"%s\" &" : "\"%s\" \"%s\" &", browser, fullspec ); system(temp); } free(temp); } #endif static void UI_IError(const char *format,...) { va_list ap; char buffer[300]; va_start(ap,format); vsnprintf(buffer,sizeof(buffer),format,ap); GDrawIError("%s",buffer); va_end(ap); } #define MAX_ERR_LINES 400 static struct errordata { char *errlines[MAX_ERR_LINES]; GFont *font; int fh, as; GGadget *vsb; GWindow gw, v; int cnt, linecnt; int offtop; int showing; int start_l, start_c, end_l, end_c; int down; } errdata; static void ErrHide(void) { GDrawSetVisible(errdata.gw,false); errdata.showing = false; } static void ErrScroll(struct sbevent *sb) { int newpos = errdata.offtop; switch( sb->type ) { case et_sb_top: newpos = 0; break; case et_sb_uppage: newpos -= errdata.linecnt; break; case et_sb_up: --newpos; break; case et_sb_down: ++newpos; break; case et_sb_downpage: newpos += errdata.linecnt; break; case et_sb_bottom: newpos = errdata.cnt-errdata.linecnt; break; case et_sb_thumb: case et_sb_thumbrelease: newpos = sb->pos; break; } if ( newpos>errdata.cnt-errdata.linecnt ) newpos = errdata.cnt-errdata.linecnt; if ( newpos<0 ) newpos =0; if ( newpos!=errdata.offtop ) { errdata.offtop = newpos; GScrollBarSetPos(errdata.vsb,errdata.offtop); GDrawRequestExpose(errdata.v,NULL,false); } }
void help(char *file) { char fullspec[1024], *temp, *pt; if ( browser[0]=='\0' ) findbrowser(); #ifndef __CygWin if ( browser[0]=='\0' ) { gwwv_post_error(_("No Browser"),_("Could not find a browser. Set the BROWSER environment variable to point to one")); return; } #endif if ( strstr(file,"http://")==NULL ) { fullspec[0] = 0; if ( *file!='/' ) { if ( helpdir==NULL || *helpdir=='\0' ) { #ifdef DOCDIR strcpy(fullspec,DOCDIR "/"); #elif defined(SHAREDIR) strcpy(fullspec,SHAREDIR "/doc/fontforge/"); #else strcpy(fullspec,"/usr/local/share/doc/fontforge/"); #endif } else strcpy(fullspec,helpdir); } strcat(fullspec,file); if (( pt = strrchr(fullspec,'#') )!=NULL ) *pt ='\0'; if ( !GFileReadable( fullspec )) { if ( *file!='/' ) { strcpy(fullspec,"/usr/share/doc/fontforge/"); strcat(fullspec,file); if (( pt = strrchr(fullspec,'#') )!=NULL ) *pt ='\0'; } } if ( !GFileReadable( fullspec )) { strcpy(fullspec,"http://fontforge.sf.net/"); AppendSupportedLocale(fullspec); strcat(fullspec,file); } else if ( pt!=NULL ) *pt = '#'; } else strcpy(fullspec,file); #if __CygWin if ( (strstrmatch(browser,"/cygdrive")!=NULL || browser[0]=='\0') && strstr(fullspec,":/")==NULL ) { /* It looks as though the browser is a windows application, so we */ /* should give it a windows file name */ char *pt, *tpt; temp = galloc(1024); cygwin_conv_to_full_win32_path(fullspec,temp); for ( pt = fullspec, tpt = temp; *tpt && pt<fullspec+sizeof(fullspec)-3; *pt++ = *tpt++ ) if ( *tpt=='\\' ) *pt++ = '\\'; *pt = '\0'; free(temp); } #endif #if __Mac if ( strcmp(browser,"open")==0 ) /* open doesn't want "file:" prepended */; else #endif if ( strstr(fullspec,":/")==NULL ) { char *t1 = galloc(strlen(fullspec)+strlen("file:")+20); #if __CygWin sprintf( t1, "file:\\\\\\%s", fullspec ); #else sprintf( t1, "file:%s", fullspec); #endif strcpy(fullspec,t1); free(t1); } #if 0 && __Mac /* Starting a Mac application is weird... system() can't do it */ /* Thanks to Edward H. Trager giving me an example... */ if ( strstr(browser,".app")!=NULL ) { *strstr(browser,".app") = '\0'; pt = strrchr(browser,'/'); if ( pt==NULL ) pt = browser-1; ++pt; temp = galloc(strlen(pt)+strlen(fullspec) + strlen( "osascript -l AppleScript -e \"Tell application \"\" to getURL \"\"\"" )+ 20); /* this doesn't work on Max OS X.0 (osascript does not support -e) */ sprintf( temp, "osascript -l AppleScript -e \"Tell application \"%s\" to getURL \"%s\"\"", pt, fullspec); system(temp); ff_post_notice(_("Leave X"),_("A browser is probably running in the native Mac windowing system. You must leave the X environment to view it. Try Cmd-Opt-A")); } else { #elif __Mac /* This seems a bit easier... Thanks to riggle */ if ( strcmp(browser,"open")==0 ) { temp = galloc(strlen(browser) + strlen(fullspec) + 20); sprintf( temp, "open \"%s\" &", fullspec ); system(temp); ff_post_notice(_("Leave X"),_("A browser is probably running in the native Mac windowing system. You must leave the X environment to view it. Try Cmd-Opt-A")); } else { #elif __CygWin if ( browser[0]=='\0' ) { do_windows_browser(fullspec); temp = NULL; } else { #else { #endif temp = galloc(strlen(browser) + strlen(fullspec) + 20); sprintf( temp, strcmp(browser,"kfmclient openURL")==0 ? "%s \"%s\" &" : "\"%s\" \"%s\" &", browser, fullspec ); system(temp); } free(temp); } #define MAX_ERR_LINES 200 static struct errordata { char *errlines[MAX_ERR_LINES]; int fh, as; GtkWidget *vsb; GtkWidget *gw, *v; PangoLayout *layout; int cnt, linecnt; int offtop; int showing; } errdata; static void Warning_Hide(void) { gdk_window_hide(errdata.gw->window); errdata.showing = false; } static void Warning_VScroll(GtkRange *vsb, gpointer user_data) { GtkAdjustment *sb; sb = gtk_range_get_adjustment(GTK_RANGE(vsb)); if ( sb->value!=errdata.offtop) { int diff = sb->value-errdata.offtop; errdata.offtop = sb->value; gdk_window_scroll(GDK_WINDOW(errdata.v->window),0,diff*errdata.fh); } } static gboolean Warning_Resize(GtkWidget *widget, GdkEventConfigure *event, gpointer user_data) { GtkAdjustment *sb; errdata.linecnt = widget->allocation.width/errdata.fh; sb = gtk_range_get_adjustment(GTK_RANGE(errdata.vsb)); sb->lower = 0; sb->upper = errdata.cnt; sb->page_size = errdata.linecnt; sb->step_increment = 1; sb->page_increment = errdata.linecnt; if ( errdata.offtop>=errdata.cnt-errdata.linecnt ) errdata.offtop = errdata.cnt-errdata.linecnt; if ( errdata.offtop<0 ) errdata.offtop =0; sb->value = errdata.offtop; gtk_range_set_adjustment(GTK_RANGE(errdata.vsb),sb); return 0; }
void help(char *file) { char fullspec[PATH_MAX], *temp, *pt; if ( browser[0]=='\0' ) findbrowser(); if ( browser[0]=='\0' ) { gwwv_post_error(_("No Browser"),_("Could not find a browser. Set the BROWSER environment variable to point to one")); return; } if ( strstr(file,"http://")==NULL ) { memset(fullspec,0,sizeof(fullspec)); if ( ! GFileIsAbsolute(file) ) snprintf(fullspec, PATH_MAX, "%s", getHelpDir()); strcat(fullspec,file); if (( pt = strrchr(fullspec,'#') )!=NULL ) *pt ='\0'; if ( !GFileReadable( fullspec )) { if ( *file!='/' ) { strcpy(fullspec,"/usr/share/doc/fontforge/"); strcat(fullspec,file); if (( pt = strrchr(fullspec,'#') )!=NULL ) *pt ='\0'; } } if ( !GFileReadable( fullspec )) { strcpy(fullspec,"http://fontforge.sf.net/"); AppendSupportedLocale(fullspec); strcat(fullspec,file); } else if ( pt!=NULL ) *pt = '#'; } else strncpy(fullspec,file,sizeof(fullspec)); #if __Mac if ( strcmp(browser,"open")==0 ) /* open doesn't want "file:" prepended */; else #endif if ( strstr(fullspec,":/")==NULL ) { if ( (temp=malloc(strlen(fullspec)+strlen("file:")+20))==NULL ) return; sprintf(temp,"file:%s",fullspec); strncpy(fullspec,temp,sizeof(fullspec)); fullspec[sizeof(fullspec)-1] = '\0'; free(temp); } #if __Mac /* This seems a bit easier... Thanks to riggle */ if ( strcmp(browser,"open")==0 ) { char *str = "DYLD_LIBRARY_PATH=\"\"; open "; if ( (temp=malloc(strlen(str) + strlen(fullspec) + 20))==NULL ) return; sprintf( temp, "%s \"%s\" &", str, fullspec ); system(temp); free(temp); } else { #else { #endif if ( (temp=malloc(strlen(browser) + strlen(fullspec) + 20))==NULL ) return; sprintf( temp, strcmp(browser,"kfmclient openURL")==0 ? "%s \"%s\" &" : "\"%s\" \"%s\" &", browser, fullspec ); system(temp); free(temp); } } #endif static void UI_IError(const char *format,...) { va_list ap; char buffer[300]; va_start(ap,format); vsnprintf(buffer,sizeof(buffer),format,ap); GDrawIError("%s",buffer); va_end(ap); }
void help(char *file) { if(file) { int len = strlen(file); char* p_file = (char*) malloc(len+1); char* p_uri = (char*) malloc(len+1024); char* p_param = NULL; strcpy(p_file, file); { char* delim = strrchr(p_file, '#'); if(delim) { p_param = (char*) malloc(len+1); strcpy(p_param, delim); *delim = '\0'; } } strcpy(p_uri, p_file); if(! GFileIsAbsolute(p_uri)) { char* p_helpdir = (char*) malloc(1024); #if __CygWin { /* cygwin */ #if defined(DOCDIR) strncpy( p_helpdir, DOCDIR "/", 1024 ); #elif defined(SHAREDIR) strncpy( p_helpdir, SHAREDIR "/doc/fontforge/", 1024 ); #else strncpy( p_helpdir, "/usr/local/share/doc/fontforge/", 1024 ); #endif } #else { /* mingw */ strcpy( p_helpdir, GResourceProgramDir ); strcat( p_helpdir, "/doc/fontforge/"); } #endif /* /usr/share/fontforge/doc/ja/file */ strcpy(p_uri, p_helpdir); AppendSupportedLocale(p_uri); strcat(p_uri, p_file); if(!GFileReadable(p_uri)) { strcpy(p_uri, p_helpdir); strcat(p_uri, p_file); if(!GFileReadable(p_uri)) { strcpy(p_uri, "http://fontforge.org/"); /* AppendSupportedLocale(p_uri); */ strcat(p_uri, p_file); } } free(p_helpdir); } #if __CygWin if( strncmp(p_uri, "http:", 5) != 0 ) { char* temp = (char*) malloc(1024); cygwin_conv_to_full_win32_path(p_uri, temp); free(p_uri); p_uri = temp; } #endif if(p_param) { strcat(p_uri, p_param); free(p_param); } /* using default browser */ ShellExecute(NULL, "open", p_uri, NULL, NULL, SW_SHOWDEFAULT); free(p_uri); free(p_file); } }