void append_arg(char *& buf, char const *arg, bool last) { bool quote = contains_whitespace(arg); if (quote) *buf++ = '"'; while (*arg) append_first_char(buf, arg++); if (quote) *buf++ = '"'; if (! last) { *buf++ = ' '; } else { *buf++ = '\0'; } }
DictionaryWord * dictionary_get_word (const char *word) { char *normalized_word; DictionaryWord *dword; g_return_val_if_fail (word != NULL, NULL); g_static_rec_mutex_lock (&dict_mutex); if (dictionary == NULL) { dictionary_load_pronunciation (NULL); /* try default */ } normalized_word = g_ascii_strdown (word, -1); g_strstrip (normalized_word); dword = g_hash_table_lookup (dictionary, normalized_word); if (dword != NULL) goto finished; dword = synthesize_XXXer_from_XXX (normalized_word); if (dword != NULL) goto finished; if (contains_whitespace (normalized_word)) { dword = synthesize_multi_word (normalized_word); if (dword != NULL) goto finished; } finished: g_static_rec_mutex_unlock (&dict_mutex); g_free (normalized_word); return dword; }
int myexecve(const char *filename, char *argv[], char *envp[]) { FILE *fh; char buffer[1000]; int size = 0; char **cur; char *interpreter = 0; char *interpreter_args = 0; char *full = 0; char *filename_conv = 0; char *interpreter_conv = 0; // char *tmp = 0; char *fname; // int tmpint; // struct Task *thisTask = IExec->FindTask(0); int result = -1; StdioStore store; dTHX; if(aTHX) // I hope this is NULL when not on a interpreteer thread nor to level. { /* Save away our stdio */ amigaos_stdio_save(aTHX_ & store); } // adebug("%s %ld %s\n",__FUNCTION__,__LINE__,filename?filename:"NULL"); /* Calculate the size of filename and all args, including spaces and * quotes */ size = 0; // strlen(filename) + 1; for (cur = (char **)argv /* +1 */; *cur; cur++) { size += strlen(*cur) + 1 + (contains_whitespace(*cur) ? (2 + no_of_escapes(*cur)) : 0); } /* Check if it's a script file */ fh = fopen(filename, "r"); if (fh) { if (fgetc(fh) == '#' && fgetc(fh) == '!') { char *p; char *q; fgets(buffer, 999, fh); p = buffer; while (*p == ' ' || *p == '\t') p++; if (buffer[strlen(buffer) - 1] == '\n') buffer[strlen(buffer) - 1] = '\0'; if ((q = strchr(p, ' '))) { *q++ = '\0'; if (*q != '\0') { interpreter_args = mystrdup(q); } } else interpreter_args = mystrdup(""); interpreter = mystrdup(p); size += strlen(interpreter) + 1; size += strlen(interpreter_args) + 1; } fclose(fh); } else { /* We couldn't open this why not? */ if (errno == ENOENT) { /* file didn't exist! */ goto out; } } /* Allocate the command line */ filename_conv = convert_path_u2a(filename); if (filename_conv) size += strlen(filename_conv); size += 1; full = (char *)IExec->AllocVec(size + 10, MEMF_ANY | MEMF_CLEAR); if (full) { if (interpreter) { interpreter_conv = convert_path_u2a(interpreter); #if !defined(__USE_RUNCOMMAND__) #warning(using system!) sprintf(full, "%s %s %s ", interpreter_conv, interpreter_args, filename_conv); #else sprintf(full, "%s %s ", interpreter_args, filename_conv); #endif IExec->FreeVec(interpreter); IExec->FreeVec(interpreter_args); if (filename_conv) IExec->FreeVec(filename_conv); fname = mystrdup(interpreter_conv); if (interpreter_conv) IExec->FreeVec(interpreter_conv); } else { #ifndef __USE_RUNCOMMAND__ sprintf(full, "%s ", filename_conv); #else sprintf(full, ""); #endif fname = mystrdup(filename_conv); if (filename_conv) IExec->FreeVec(filename_conv); } for (cur = (char **)(argv + 1); *cur != 0; cur++) { if (contains_whitespace(*cur)) { int esc = no_of_escapes(*cur); if (esc > 0) { char *buff = IExec->AllocVec( strlen(*cur) + 4 + esc, MEMF_ANY | MEMF_CLEAR); char *p = *cur; char *q = buff; *q++ = '"'; while (*p != '\0') { if (*p == '\n') { *q++ = '*'; *q++ = 'N'; p++; continue; } else if (*p == '"') { *q++ = '*'; *q++ = '"'; p++; continue; } else if (*p == '*') { *q++ = '*'; } *q++ = *p++; } *q++ = '"'; *q++ = ' '; *q = '\0'; strcat(full, buff); IExec->FreeVec(buff); } else { strcat(full, "\""); strcat(full, *cur); strcat(full, "\" "); } } else { strcat(full, *cur); strcat(full, " "); } } strcat(full, "\n"); // if(envp) // createvars(envp); #ifndef __USE_RUNCOMMAND__ result = IDOS->SystemTags( full, SYS_UserShell, TRUE, NP_StackSize, ((struct Process *)thisTask)->pr_StackSize, SYS_Input, ((struct Process *)thisTask)->pr_CIS, SYS_Output, ((struct Process *)thisTask)->pr_COS, SYS_Error, ((struct Process *)thisTask)->pr_CES, TAG_DONE); #else if (fname) { BPTR seglist = IDOS->LoadSeg(fname); if (seglist) { /* check if we have an executable! */ struct PseudoSegList *ps = NULL; if (!IDOS->GetSegListInfoTags( seglist, GSLI_Native, &ps, TAG_DONE)) { IDOS->GetSegListInfoTags( seglist, GSLI_68KPS, &ps, TAG_DONE); } if (ps != NULL) { // adebug("%s %ld %s // %s\n",__FUNCTION__,__LINE__,fname,full); IDOS->SetCliProgramName(fname); // result=RunCommand(seglist,8*1024,full,strlen(full)); // result=myruncommand(seglist,8*1024,full,strlen(full),envp); result = myruncommand(seglist, 8 * 1024, full, -1, envp); errno = 0; } else { errno = ENOEXEC; } IDOS->UnLoadSeg(seglist); } else { errno = ENOEXEC; } IExec->FreeVec(fname); } #endif /* USE_RUNCOMMAND */ IExec->FreeVec(full); if (errno == ENOEXEC) { result = -1; } goto out; } if (interpreter) IExec->FreeVec(interpreter); if (filename_conv) IExec->FreeVec(filename_conv); errno = ENOMEM; out: amigaos_stdio_restore(aTHX_ &store); STATUS_NATIVE_CHILD_SET(result); PL_exit_flags |= PERL_EXIT_EXPECTED; if (result != -1) my_exit(result); return(result); }