/* * rules are of the form: * <reg exp> <String> <repl exp> [<repl exp>] */ extern int getrules(void) { Biobuf *rfp; String *line; String *type; String *file; file = abspath("rewrite", UPASLIB, (String *)0); rfp = sysopen(s_to_c(file), "r", 0); if(rfp == 0) { rulep = 0; return -1; } rlastp = 0; line = s_new(); type = s_new(); while(s_getline(rfp, s_restart(line))) if(getrule(line, type, thissys) && altthissys) getrule(s_restart(line), type, altthissys); s_free(type); s_free(line); s_free(file); sysclose(rfp); return 0; }
int run_script(const char script[], int fd, unsigned int flags){ scmd_t *cmd_list = NULL; int result = parse_script(script, &cmd_list, flags); if( result != 0 ){ return result; } sspace_t pspace, hspace; memset(&pspace, 0, sizeof(sspace_t)); memset(&hspace, 0, sizeof(sspace_t)); enum cmd_result code = RNONE; int line = 1, nflag = flags & NFLAG; TRY_REALLOC(outbuff, MIN_CHUNK); TRY_REALLOC(sub_buff, MIN_CHUNK); outbuff[0] = '\0'; sub_buff[0] = '\0'; while( (result = s_getline(&pspace, fd) > 0 ) ){ if( code != RNONE ){ result = print_space(&pspace); if( result < 0 ){ goto exit; } switch(code){ case RQUIT: return SUCCESS; default: if( code < 0 ){ result = code; goto exit; } break; } } pspace.is_deleted = nflag; code = run_line(cmd_list, &pspace, &hspace, line, flags); line++; } result = print_space(&pspace); exit: /* TODO: clean */ scmd_list_free(cmd_list); free(outbuff); free(sub_buff); if( pspace.space != NULL ){ free(pspace.space); } if( pspace.text != NULL ){ free(pspace.text); } return result; }