static FILE * init_files(lame_global_flags * gf, char const *inPath, char const *outPath) { FILE *outf; /* Mostly it is not useful to use the same input and output name. This test is very easy and buggy and don't recognize different names assigning the same file */ if (0 != strcmp("-", outPath) && 0 == strcmp(inPath, outPath)) { error_printf("Input file and Output file are the same. Abort.\n"); return NULL; } /* open the wav/aiff/raw pcm or mp3 input file. This call will * open the file, try to parse the headers and * set gf.samplerate, gf.num_channels, gf.num_samples. * if you want to do your own file input, skip this call and set * samplerate, num_channels and num_samples yourself. */ if (init_infile(gf, inPath) < 0) { error_printf("Can't init infile '%s'\n", inPath); return NULL; } if ((outf = init_outfile(outPath, lame_get_decode_only(gf))) == NULL) { error_printf("Can't init outfile '%s'\n", outPath); return NULL; } return outf; }
/* generate function prolog of type 't' */ void gfunc_prolog(int t) { int addr, u, func_call; Sym *sym; char buf[1024]; init_outfile(); /* XXX: pass function name to gfunc_prolog */ il_type_to_str(buf, sizeof(buf), t, funcname); fprintf(il_outfile, ".method static %s il managed\n", buf); fprintf(il_outfile, "{\n"); /* XXX: cannot do better now */ fprintf(il_outfile, " .maxstack %d\n", NB_REGS); fprintf(il_outfile, " .locals (int32, int32, int32, int32, int32, int32, int32, int32)\n"); if (!strcmp(funcname, "main")) fprintf(il_outfile, " .entrypoint\n"); sym = sym_find((unsigned)t >> VT_STRUCT_SHIFT); func_call = sym->r; addr = ARG_BASE; /* if the function returns a structure, then add an implicit pointer parameter */ func_vt = sym->t; func_var = (sym->c == FUNC_ELLIPSIS); if ((func_vt & VT_BTYPE) == VT_STRUCT) { func_vc = addr; addr++; } /* define parameters */ while ((sym = sym->next) != NULL) { u = sym->t; sym_push(sym->v & ~SYM_FIELD, u, VT_LOCAL | lvalue_type(sym->type.t), addr); addr++; } }
int start() { /* This is the "starter process" for statistical profiling. * * Create output file for profiling data. Create named pipe to * synchronize with stopper process. Fork so the parent can exit. * Allocate memory for profiling data. Start profiling in kernel. * Complete detachment from terminal. Write known string to named * pipe, which blocks until read by stopper process. Redirect * stdout/stderr to the named pipe. Write profiling data to file. * Clean up. */ int log_fd; if (init_outfile() || create_named_pipe()) return 1; printf("Starting statistical profiling.\n"); if (fork() != 0) exit(0); if (alloc_mem()) return 1; if (sprofile(PROF_START, mem_size, freq, intr_type, &sprof_info, mem_ptr)) { perror("sprofile"); fprintf(stderr, "Error starting profiling.\n"); return 1; } detach(); /* Temporarily redirect to system log to catch errors. */ log_fd = open(DEV_LOG, O_WRONLY); dup2(log_fd, 1); dup2(log_fd, 2); if ((npipe_fd = open(NPIPE, O_WRONLY)) < 0) { fprintf(stderr, "Unable to open named pipe %s.\n", NPIPE); return 1; } else /* Synchronize with stopper process. */ write(npipe_fd, SYNCING, strlen(SYNCING)); /* Now redirect to named pipe. */ dup2(npipe_fd, 1); dup2(npipe_fd, 2); mem_used = sprof_info.mem_used; if (mem_used == -1) { fprintf(stderr, "WARNING: Profiling was stopped prematurely due to "); fprintf(stderr, "insufficient memory.\n"); fprintf(stderr, "Try increasing available memory using the -m switch.\n"); } if (write_outfile()) return 1; close(log_fd); close(npipe_fd); unlink(NPIPE); close(outfile_fd); free(mem_ptr); return 0; }