Font* Renderer::loadFont(const std::string &fname, unsigned int size, unsigned sizew) { Font *font = new Font(); font->fontFileName = fname; font->fontSize = size; if (FT_New_Face(ft, font->fontFileName.c_str(), 0, &font->face)) { prn("Could not open font\n"); return 0; } FT_Set_Char_Size(font->face, sizew * 16, font->fontSize * 16, 300, 300); FT_GlyphSlot g = font->face->glyph; font->w = 0; font->h = 0; for (int i = 0; i < 128; i++) font->c[i].exists = false; for (int i = 32; i < 128; i++) { if (FT_Load_Char(font->face, i, FT_LOAD_RENDER)) { prn("Loading character %c failed!\n", i); continue; } font->w += g->bitmap.width; font->h = std::max(font->h, g->bitmap.rows); } glActiveTexture(GL_TEXTURE0); glGenTextures(1, &font->tex); glBindTexture(GL_TEXTURE_2D, font->tex); glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, font->w, font->h, 0, GL_RED, GL_UNSIGNED_BYTE, 0); int x = 0, n = 0; for (int i = 32; i < 128; i++) { if (FT_Load_Char(font->face, i, FT_LOAD_RENDER)) continue; n++; glTexSubImage2D(GL_TEXTURE_2D, 0, x, 0, g->bitmap.width, g->bitmap.rows, GL_RED, GL_UNSIGNED_BYTE, g->bitmap.buffer); //prn("Cache %c %i %i", i, g->bitmap.width, g->bitmap.rows); font->c[i].exists = true; font->c[i].ax = g->advance.x >> 6; font->c[i].ay = g->advance.y >> 6; font->c[i].bw = g->bitmap.width; font->c[i].bh = g->bitmap.rows; font->c[i].bl = g->bitmap_left; font->c[i].bt = g->bitmap_top; font->c[i].tx = (float)x / font->w; x += g->bitmap.width; } prn("Cached %i characters for font %s", n, font->fontFileName.c_str()); return font; }
integer ServiceApp::onStartError(SeqFileOutput output) { PrintTextA prn(output); try { throw; } catch (LightSpeed::Exception &e) { prn("FATAL ERROR: %1\n") << e.getMessageWithReason(); } catch (std::exception &e) { prn("FATAL ERROR: %1\n") << e.what(); } catch (...) { prn("FATAL ERROR: unknown reason\n"); } return 100; }
void Renderer::init() { int c = 0; glutInit(&c, 0); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(800, 600); glutInitWindowPosition(100, 100); glutCreateWindow("vxc"); glewInit(); prn("OpenGL version: %s\n", (char*)glGetString(GL_VERSION)); prn("OpenGL renderer: %s\n", (char*)glGetString(GL_RENDERER)); ilInit(); iluInit(); ilutInit(); }
// --------------------------------------------------------------------------- // // ----------- OSStatus bPrintMgr::set_page_format(PMPageFormat pf, const char* name){ OSStatus status; char path[PATH_MAX]; map_doc->location(path); bStdDirectory root(path); if(root.status()){ return(root.status()); } bStdDirectory rsrc("Contents/Resources/"); if(rsrc.status()){ return(rsrc.status()); } char nm[256]; int sgn=kPrintSignature; sprintf(nm,"%.4s/",(char*)&sgn); bStdDirectory prn(nm); if(prn.status()){ return(prn.status()); } bStdFile f(name,"w"); if(f.status()){ return(f.status()); } CFDataRef dt; status=PMPageFormatCreateDataRepresentation(pf,&dt,kPMDataFormatXMLDefault); if(status){ return(status); } f.write((void*)CFDataGetBytePtr(dt),CFDataGetLength(dt)); CFRelease(dt); return(noErr); }
/* * 父进程等待子进程终止 * i为子进程pid,-1表示等待所有子进程 * t为语法树节点 */ void pwait(int i, int *t) { int p, e; int s; if(i != 0) for(;;) { times(&timeb); time(timeb.proct); p = wait(&s); if(p == -1) /* 等待失败 */ break; e = s&0177; /* 保留状态环境 */ if(mesg[e] != 0) { /* 子进程异常终止 */ if(p != i) { prn(p); prs(": "); } prs(mesg[e]); /* 打印对应的消息 */ if(s&0200) /* 内核奔溃 */ prs(" -- Core dumped"); } if(e != 0) err(""); /* 等待正常终止 */ if(i == p) { acct(t); break; } else acct(0); } }
TEST_F(SCDGTest2, testPageRankNibble) { METISGraphReader reader; Graph G = reader.read("input/hep-th.graph"); // parameters node seed = 50; std::set<unsigned int> seeds = {(unsigned int) seed}; double alpha = 0.1; // loop (or teleport) probability, changed due to DGleich from: // phi * phi / (225.0 * log(100.0 * sqrt(m))); double epsilon = 1e-5; // changed due to DGleich from: pow(2, exponent) / (48.0 * B); PageRankNibble prn(G, alpha, epsilon); count idBound = G.upperNodeIdBound(); // run PageRank-Nibble and partition the graph accordingly DEBUG("Call PageRank-Nibble(", seed, ")"); auto result = prn.run(seeds); auto cluster = result[seed]; // prepare result EXPECT_GT(cluster.size(), 0u); Partition partition(idBound); partition.allToOnePartition(); partition.toSingleton(50); index id = partition[seed]; for (auto entry: cluster) { partition.moveToSubset(id, entry); } // evaluate result Conductance conductance; double targetCond = 0.4; double cond = conductance.getQuality(partition, G); EXPECT_LT(cond, targetCond); INFO("Conductance of PR-Nibble: ", cond, "; cluster size: ", cluster.size()); }
/* itoa */ void prn(int n) { int a; if(a=n/10) prn(a); put(n%10+'0'); }
int main() { int number; int right; printf("输入你想练题的题数:"); scanf("%d",&number); right=data(number); prn(number,right); system("pause"); return 0; }
void update_screen(void) { char buf[32]; rb->lcd_clear_display(); #ifdef HAVE_REMOTE_LCD rb->lcd_remote_clear_display(); #endif #ifdef HAVE_LCD_BITMAP rb->snprintf(buf, sizeof(buf), "Files: %d", files); prn(buf,0); rb->snprintf(buf, sizeof(buf), "Music: %d", musicfiles); prn(buf,1); rb->snprintf(buf, sizeof(buf), "Dirs: %d", dirs); prn(buf,2); rb->snprintf(buf, sizeof(buf), "Max files in Dir: %d", largestdir); prn(buf,3); #else rb->snprintf(buf, sizeof(buf), "Files:%5d", files); prn(buf,0); rb->snprintf(buf, sizeof(buf), "Dirs: %5d", dirs); prn(buf,1); #endif rb->lcd_update(); #ifdef HAVE_REMOTE_LCD rb->lcd_remote_update(); #endif }
/** * print() * * Initiates the actual printing of the list. */ void PrintTreeWidget::print() { QPrinter prn(QPrinter::PrinterResolution); QPainter *p; QBrush bbrush; int pageNo = 1; int totPages = 1; int totLines = 0; prn.setPageSize(QPrinter::Letter); prn.setDocName("List Print"); prn.setCreator("Total Accountability"); // Initialize the printer device. if (!prn.setup()) return; // prn.setOutputFileName("/tmp/Report.ps"); // prn.setOutputToFile(TRUE); QApplication::setOverrideCursor(Qt::waitCursor); p = new QPainter(); p->begin(&prn); // Count the children. totLines = myTree->topLevelItemCount(); for (int i = 0; i < myTree->topLevelItemCount(); ++i) { totLines += countChildren(myTree->topLevelItem(i)); } totPages = (totLines / 50) + 1; // fprintf(stderr, "The total number of pages is: %d\n", totPages); // Print the report... // FIXME: This should print children as well, but it doesn't. for (pageNo = 1; pageNo < totPages + 1; pageNo++) { int sItem = ((pageNo -1) * 50); int eItem = sItem + 50; if (eItem > myTree->topLevelItemCount()) eItem = myTree->topLevelItemCount(); printHeader(p); printRows(p, sItem, eItem); printFooter(p, pageNo, totPages); if (pageNo < totPages) prn.newPage(); //progress.setProgress(pageNo); //if (progress.wasCancelled()) pageNo = totPages + 1; } //progress.setProgress(totPages); // We're all done. Close the printer device. p->end(); delete(p); QApplication::restoreOverrideCursor(); }
void Renderer::load() { glClearColor(0, 0, 0, 1.0); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glPixelStorei(GL_PACK_ALIGNMENT, 1); textShader = loadProgram("text", "text"); quadShader = loadProgram("quad", "quad"); demoShader = loadProgram("demo", "demo"); texture = loadTexture("textures/demo512.png"); uniform_coord = glGetAttribLocation(textShader->shaderProgram, "coord"); uniform_atr = glGetAttribLocation(textShader->shaderProgram, "atr"); GLfloat black[4] = { 0, 0, 0, 1 }; textShader->setUniform4fv("color", 1, black); textShader->setUniform1i("texture1", 0); quadShader->setUniform1i("texture1", 0); demoShader->setUniform1i("texture1", 0); textVertexBufferSize = 6 * 1024; textVertexBuffer = new TextVertex[textVertexBufferSize]; currentTextVertexBufferPos = 0; vboSize = sizeof(TextVertex)* textVertexBufferSize; glGenBuffersARB(1, &vbo); glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo); glBufferDataARB(GL_ARRAY_BUFFER_ARB, vboSize, 0, GL_DYNAMIC_DRAW_ARB); struct { vec2 pos; } quad[4] = { vec2(-1, 1), vec2(1, 1), vec2(-1, -1), vec2(1, -1) }; glGenBuffersARB(1, &vboQuad); glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboQuad); glBufferDataARB(GL_ARRAY_BUFFER_ARB, 4 * sizeof(vec2), quad, GL_DYNAMIC_DRAW_ARB); if (FT_Init_FreeType(&ft)) { prn("Could not init freetype library\n"); } currentFont = 0; defaultFont = loadFont("fonts/lucon.ttf", 16, 17); }
void prn(int x) { if (x < 0) x = -x; assert(1 <= x && x <= n); if (L[x] >= 0 && R[x] >= 0) { printf("%d%c%d", L[x], op[x], R[x]); } else if (L[x] >= 0) { printf("%d%c(", L[x], op[x]); prn(R[x]); printf(")"); } else { if (op[x] == '*' && op[-L[x]] == '+') printf("("), prn(L[x]), printf(")"); else prn(L[x]); if (R[x] >= 0) printf("%c%d", op[x], R[x]); else if (op[x] == '+' && op[-L[x]] == '*') printf("%c", op[x]), prn(R[x]); else printf("%c(", op[x]), prn(R[x]), printf(")"); } }
static int random(const struct wordlist * const wl, int argc, char * argv[]) { const long int count = argc >= 3 ? atol(argv[2]) : 1; struct timespec tv; clock_gettime(CLOCK_REALTIME, &tv); srand(tv.tv_sec ^ tv.tv_nsec); for (long int i = 0; i < count; i++) { const int n = rand() % wl->nwords; if (prn(wl->words_counts[n].str + wl->strbase, wl->words_counts[n].len, stdout)) return 1; } return 0; }
char* getstr(char in[],int len=100) { char s[1],ch; int n=strlen(in); if(bufi==47) bufi=0; if(gy>=48) scroll(); gx=0; strcpy(buf[bufi],in); ti=n; outtextxy(gx*6,gy*10,buf[bufi]); gx=n; s[1]=0; setfillstyle(1,13); bar(gx*6, gy*10+2,(gx+1)*6-3, (gy+1)*10-1); while( (ch=getch())!=13) { if( ch==8 && gx<=n || (!valid(ch)) || ti>=(len+n) && ch!=8 ) { beep(); continue; } s[0]=ch; setfillstyle(0,0); bar(gx*6, gy*10+2,(gx+1)*6, (gy+2)*10); prn(s); setfillstyle(1,13); bar(gx*6, gy*10+2,(gx+1)*6-3, (gy+1)*10-1); } setfillstyle(0,0); bar(gx*6, gy*10+2,(gx+1)*6, (gy+2)*10); char *t1; t1=new char[ti-n+1]; for(int i=0;i<len&&t;i++) t1[i]=t[i+n]; t1[ti-n]=0; strcat(buf[bufi],t1); bufi++; if(bufi==47) bufi=0; gy++; if(gy>=48) scroll(); return t1; }
void CSkEventDocDialog::on_pushButton_2_clicked() { QPrinter prn(QPrinter::ScreenResolution); QPrintDialog dlg(&prn, this); prn.setOrientation(QPrinter::Portrait); prn.setPageMargins(10, 10, 10, 10, QPrinter::Millimeter); if (dlg.exec() == DL_CANCEL) { return; } m_event->create(&prn, ui->checkBox->isChecked()); }
// --------------------------------------------------------------------------- // // ----------- OSStatus bPrintMgr::get_page_format(PMPageFormat* pf, const char* name){ *pf=kPMNoPageFormat; OSStatus status; char path[PATH_MAX]; map_doc->location(path); bStdDirectory root(path); if(root.status()){ return(root.status()); } bStdDirectory rsrc("Contents/Resources/"); if(rsrc.status()){ return(rsrc.status()); } char nm[256]; int sgn=kPrintSignature; sprintf(nm,"%.4s/",(char*)&sgn); bStdDirectory prn(nm); if(prn.status()){ return(prn.status()); } bStdFile f(name,"r"); if(f.status()){ return(f.status()); } void* buf; int sz; f.mount((char**)&buf,&sz); if(f.status()){ return(f.status()); } CFDataRef dt=CFDataCreate(kCFAllocatorDefault,(UInt8*)buf,sz); free(buf); if(!dt){ return(-1); } status=PMPageFormatCreateWithDataRepresentation(dt,pf); CFRelease(dt); if(status){ *pf=kPMNoPageFormat; return(status); } return(noErr); }
static void synbad(void) { prp(); prs(synmsg); if ((flags & ttyflg) == 0) { prs(atline); prn(standin->flin); } prs(colon); prc(LQ); if (wdval) prsym(wdval); else prs(wdarg->argval); prc(RQ); prs(unexpected); newline(); exitsh(SYNBAD); }
void prn(char s[]) { if( s[0]==8 ) { if(gx) { t[--ti]=0; gx--; setfillstyle(0,0); bar(gx*6, gy*10+2,(gx+1)*6, (gy+2)*10); return; } beep(); ti=0; return; } if(s[0]=='\t') { for(int i=0;i<8;i++) prn(" "); } if(s[0]==13) { gy++,gx=-1; t[ti]=0; strcpy(buf[bufi++],t); buf[bufi-1][ti]=0; if(bufi==47)bufi=0; setcmd(); ti=0; } else outtextxy(gx*6,gy*10,s),t[ti++]=s[0]; gx++; if(gx>=105) { gy++;gx=0; t[ti]=0; strcpy(buf[bufi++],t); if(bufi==47)bufi=0; ti=0; } if(gy>=48) scroll(); }
int main() { static char s[256], sl[64][64], sr[64][64]; int i, j, t, T; for (scanf("%d", &T), t = 1; t <= T && scanf("%d", &n) == 1; t++) { assert(n <= 60); for (i = 1; i <= n; i++) { j = scanf(" %[A-Za-z] = %[A-Za-z0-9] %[+*] %[A-Za-z0-9]", name[i], sl[i], s, sr[i]); assert(j == 4 && (s[0] == '+' || s[0] == '*')); op[i] = s[0]; } for (i = 1; i <= n; i++) L[i] = get(sl[i]), R[i] = get(sr[i]); printf("Expression #%d: ", t); prn(n); printf("\n"); } return 0; }
extern "C" void NPP_Print(NPP instance, NPPrint* printInfo) { if(printInfo == NULL) return; if (instance != NULL) { _NPInstance* This = (_NPInstance*) instance->pdata; if (printInfo->mode == NP_FULL) { printInfo->print.fullPrint.pluginPrinted = This->instance->printFullPage(); } else if (printInfo->mode == NP_EMBED) { #ifdef _WS_X11_ void* platformPrint = printInfo->print.embedPrint.platformPrint; FILE* outfile = ((NPPrintCallbackStruct*)platformPrint)->fp; if (ftell(outfile)) { NPWindow* w = &(printInfo->print.embedPrint.window); QNPPrinter prn(outfile); QPainter painter(&prn); // #### config viewport with w->{x,y,width,height} This->instance->print(&painter); prn.end(); } else { // Why does the browser make spurious NPP_Print calls? } #endif #ifdef _WS_WIN_ NPWindow* printWindow = &(printInfo->print.embedPrint.window); void* platformPrint = printInfo->print.embedPrint.platformPrint; // #### Nothing yet. #endif } } }
void in() { char s[1],ch; s[1]=0; setfillstyle(1,13); bar(gx*6, gy*10+2,(gx+1)*6-3, (gy+1)*10-1); while(1) { ch=getch(); if(! valid(ch) ) { beep(); continue; } s[0]=ch; setfillstyle(0,0); bar(gx*6, gy*10+2,(gx+1)*6, (gy+2)*10); prn(s); setfillstyle(1,13); bar(gx*6, gy*10+2,(gx+1)*6-3, (gy+1)*10-1); } }
Budgie::Budgie(const char* name, const char* wordsKnown ):Bird(name){ prn("Creating ", this->name(), " Budgie"); }
bool Shader::rebuild() { errors = ""; std::string VertexShaderCode; std::string FragmentShaderCode; // Create the shaders GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER); GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); // Read the Vertex Shader code from the file VertexShaderCode = ""; std::ifstream VertexShaderStream(vertFile.c_str(), std::ios::in); if (VertexShaderStream.is_open()) { std::string Line = ""; while (getline(VertexShaderStream, Line)) VertexShaderCode += "\n" + Line; VertexShaderStream.close(); } else { errors = "Shader rebuild failed! Couldn't open file " + vertFile; prn("Shader rebuild failed! Couldn't open file %s", vertFile.c_str()); return false; } // Read the Fragment Shader code from the file fragBuff = FragmentShaderCode = ""; std::ifstream FragmentShaderStream(fragFile.c_str(), std::ios::in); if (FragmentShaderStream.is_open()){ std::string Line = ""; while (getline(FragmentShaderStream, Line)) FragmentShaderCode += "\n" + Line; FragmentShaderStream.close(); } else { errors = "Shader rebuild failed! Couldn't open file " + fragFile; prn("Shader rebuild failed! Couldn't open file %s", fragFile.c_str()); return false; } GLint result = GL_FALSE; int InfoLogLength; // Compile Vertex Shader prn("Compiling shader : %s\n", vertFile.c_str()); char const * VertexSourcePointer = VertexShaderCode.c_str(); glShaderSource(VertexShaderID, 1, &VertexSourcePointer, NULL); glCompileShader(VertexShaderID); // Check Vertex Shader glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &result); if (!result) { glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); std::vector<char> VertexShaderErrorMessage(InfoLogLength); glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]); prn("%s\n", &VertexShaderErrorMessage[0]); errors = "Shader rebuild failed!\n" + std::string(&VertexShaderErrorMessage[0]); return false; } // Compile Fragment Shader prn("Compiling shader : %s\n", fragFile.c_str()); char const * FragmentSourcePointer = FragmentShaderCode.c_str(); glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer, NULL); glCompileShader(FragmentShaderID); // Check Fragment Shader glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &result); if (!result) { glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); std::vector<char> FragmentShaderErrorMessage(InfoLogLength); glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]); prn("%s\n", &FragmentShaderErrorMessage[0]); errors = "Shader rebuild failed!\n" + std::string(&FragmentShaderErrorMessage[0]); return false; } // Link the program prn("Linking program\n"); GLuint ProgramID = glCreateProgram(); glAttachShader(ProgramID, VertexShaderID); glAttachShader(ProgramID, FragmentShaderID); glLinkProgram(ProgramID); // Check the program glGetProgramiv(ProgramID, GL_LINK_STATUS, &result); if (!result) { glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength); std::vector<char> ProgramErrorMessage(std::max(InfoLogLength, int(1))); glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]); prn("%s\n", &ProgramErrorMessage[0]); errors = "Shader rebuild failed!\n" + std::string(&ProgramErrorMessage[0]); return false; } release(); vertBuff = VertexShaderCode; fragBuff = FragmentShaderCode; vertexShader = VertexShaderID; fragmentShader = FragmentShaderID; shaderProgram = ProgramID; return vertexShader && fragmentShader && shaderProgram; }
GoldFish::GoldFish(const char* name) :Pet(name){ prn("Creating ", this->name(), " the GoldFish"); }
Budgie::~Budgie(){ prn("Remove ", name(), " the Budgie"); }
GoldFish::~GoldFish(){ prn("Killing ", name(), " the GoldFish"); }
void printres(std::ostream& os, Value val){ BacktracePrinter prn(-1,-1); prn.print(os, val); }
Cat::~Cat(){ prn("Remove ", name(), " the Cat"); }
/* * 该函数从根节点开始深度优先遍历整个语法树,为每个命令创建进程并执行 * pf1和pf2是管道线I/O句柄,pf1表示命令输入端,pf2表示命令输出端 * pf1[0]: 管道线输入端句柄 * pf1[1]: 闲置 * pf2[0]: 闲置 * pf2[1]: 管道线输出端句柄 */ void execute(int *t, int *pf1, int *pf2) { int i, f, pv[2]; int *t1; char *cp1, *cp2; extern int errno; if(t != 0) switch(t[DTYP]) { case TCOM: cp1 = (char *)t[DCOM]; /* 以下为内置命令*/ if(equal(cp1, "chdir")) { if(t[DCOM+1] != 0) { if(chdir(t[DCOM+1]) < 0) err("chdir: bad directory"); } else err("chdir: arg count"); return; } if(equal(cp1, "shift")) { if(dolc < 1) { prs("shift: no args\n"); return; } dolv[1] = dolv[0]; dolv++; dolc--; return; } if(equal(cp1, "login")) { if(promp != 0) { close(acctf); execv("/bin/login", t+DCOM); } prs("login: cannot execute\n"); return; } if(equal(cp1, "newgrp")) { if(promp != 0) { close(acctf); execv("/bin/newgrp", t+DCOM); } prs("newgrp: cannot execute\n"); return; } if(equal(cp1, "wait")) { pwait(-1, 0); return; } if(equal(cp1, ":")) return; /* 注意,这里没有break,筛选掉内置命令后,外部命令会继续往下走*/ case TPAR: f = t[DFLG]; i = 0; if((f&FPAR) == 0) /* 除了复合命令中最后一个子命令,其它一律fork子进程*/ i = fork(); if(i == -1) { err("try again"); return; } if(i != 0) { /* 父进程代码*/ if((f&FPIN) != 0) { close(pf1[0]); /* fork之后,子进程获得父进程的管道线句柄拷贝,我们要在父进程中关闭它,以免资源泄漏*/ close(pf1[1]); /* 注意,这里只关闭pf1,因为pf1、pf2都是pv的镜像,因此关闭pf1就是关闭pf2 */ } if((f&FPRS) != 0) {/* 打印子进程pid */ prn(i); prs("\n"); } if((f&FAND) != 0) /* 后台异步进程无需等待*/ return; if((f&FPOU) == 0) /* 节点为管道线末端,等待子进程终止*/ pwait(i, t); return; } /* 以下为子进程代码,或者FPAR属性节点命令进程*/ if(t[DLEF] != 0) { close(0); i = open(t[DLEF], 0); /* 重定向stdin到左子树节点*/ if(i < 0) { prs((char *)t[DLEF]); err(": cannot open"); exit(-1); } } if(t[DRIT] != 0) { if((f&FCAT) != 0) { i = open(t[DRIT], 1); if(i >= 0) { seek(i, 0, 2); /* 追加模式*/ goto f1; } } i = creat(t[DRIT], 0666); /* 创建新的文件句柄*/ if(i < 0) { prs((char *)t[DRIT]); err(": cannot create"); exit(-1); } f1: close(1); dup(i); /* 重定向stdout到右子树节点*/ close(i); } if((f&FPIN) != 0) { close(0); dup(pf1[0]); /* 重定向stdin到管道线输入端*/ close(pf1[0]); close(pf1[1]); /* 子进程关闭管道线句柄*/ } if((f&FPOU) != 0) { close(1); dup(pf2[1]); /* 重定向stdout 到管道线输出*/ close(pf2[0]); close(pf2[1]); /* 子进程关闭管道线句柄*/ } if((f&FINT)!=0 && t[DLEF]==0 && (f&FPIN)==0) { close(0); /* 若忽略中断,且不存在管道线输入,则关闭stdin并重定向到位桶*/ open("/dev/null", 0); /* 以免来自其它进程stdin干扰,但stdout是保留的*/ } if((f&FINT) == 0 && setintr) { signal(INTR, 0); /* 无FINT标识,则恢复中断信号响应(默认是忽略的) */ signal(QUIT, 0); } if(t[DTYP] == TPAR) { /* 如果是复合类型,则执行子命令,同时下推FINT标识*/ if(t1 = (int *)t[DSPR]) t1[DFLG] |= f&FINT; execute(t1, NULL, NULL); exit(0); } close(acctf); gflg = 0; scan(t, &tglob); /* 扫描通配符*/ if(gflg) { t[DSPR] = (int)"/etc/glob"; execv(t[DSPR], t+DSPR); /* 包含通配符的命令在/etc/glob中执行*/ prs("glob: cannot execute\n"); exit(-1); } scan(t, &trim); /* 解除引用标识*/ *linep = 0; texec((char *)t[DCOM], t); /* 最先执行当前目录下的命令*/ cp1 = linep; cp2 = "/usr/bin/"; while(*cp1 = *cp2++) /* strcpy,cp1停在'\0'位置 */ cp1++; cp2 = (char *)t[DCOM]; while(*cp1++ = *cp2++); /* strcpy,'\0'结束 */ texec(linep+4, t); /* 接着执行/bin目录下的命令*/ texec(linep, t); /* 最后执行/usr/bin目录下的命令*/ prs((char *)t[DCOM]); /* 若进程异常退出,表示找不到命令,退出shell */ err(": not found"); exit(-1); case TFIL: f = t[DFLG]; pipe(pv); /* 创建管道线,pv[0]为输入句柄,pv[1]为输出句柄*/ t1 = (int *)t[DLEF]; t1[DFLG] |= FPOU | (f&(FPIN|FINT|FPRS)); execute(t1, pf1, pv); /* 对于左子树节点,pv[1]作为管道线输出句柄传入,pv[0]闲置*/ t1 = (int *)t[DRIT]; t1[DFLG] |= FPIN | (f&(FPOU|FINT|FAND|FPRS)); /* 只有管道线末端命令才能继承FAND属性,与FPOU排斥*/ execute(t1, pv, pf2); /* 对于右子树节点,pv[0]作为管道线输入句柄传入,pv[1]闲置*/ return; case TLST: f = t[DFLG]&FINT; /* 对于命令序列节点,下推FINT属性到左右子树*/ if(t1 = (int *)t[DLEF]) t1[DFLG] |= f; execute(t1, NULL, NULL); /* 先左后右依次执行 */ if(t1 = (int *)t[DRIT]) t1[DFLG] |= f; execute(t1, NULL, NULL); return; } }
Cat::Cat(const char* name, int numOfLives):Pet(name){ _numOfLives = numOfLives; prn("Creating ", this->name(), " the Cat"); }