📄 build_in.c
字号:
onechar[1] = (x&0x0000ff00)>>8; onechar[2] = x&0x000000ff; write(f_out, onechar, 3);#endif } x = ip->index[j]; /* for next round */#if 0 printf("#######x=%d ", x);#endif /*0*/ y = 0; } diff = ip->offset[j] - y; y = ip->offset[j]; if (diff < MaxNum1BPartition) { temp = encode8b(diff);#if !CRAZYSEGV putc(temp, f_out);#else onechar[0] = temp; write(f_out, onechar, 1);#endif } else if (diff < MaxNum2BPartition) { temp = encode8b((diff/MaxNum8bPartition) | 0x40);#if !CRAZYSEGV putc(temp, f_out);#else onechar[0] = temp; write(f_out, onechar, 1);#endif temp = encode8b(diff % MaxNum8bPartition);#if !CRAZYSEGV putc(temp, f_out);#else onechar[0] = temp; write(f_out, onechar, 1);#endif } else if (diff < MaxNum3BPartition) { temp = encode8b((diff/MaxNum16bPartition) | 0x80);#if !CRAZYSEGV putc(temp, f_out);#else onechar[0] = temp; write(f_out, onechar, 1);#endif temp = encode16b(diff % MaxNum16bPartition);#if !CRAZYSEGV putc((temp & 0x0000ff00) >> 8, f_out); putc(temp & 0x000000ff, f_out);#else onechar[0] = (temp & 0x0000ff00) >> 8; onechar[1] = temp & 0x000000ff; write(f_out, onechar, 2);#endif } else { temp = encode8b((diff/MaxNum24bPartition) | 0xc0);#if !CRAZYSEGV putc(temp, f_out);#else onechar[0] = temp; write(f_out, onechar, 1);#endif temp = encode24b(diff % MaxNum24bPartition);#if !CRAZYSEGV putc((temp & 0x00ff0000) >> 16, f_out); putc((temp & 0x0000ff00) >> 8, f_out); putc(temp & 0x000000ff, f_out);#else onechar[0] = (temp & 0x00ff0000) >> 16; onechar[1] = (temp & 0x0000ff00) >> 8; onechar[2] = temp & 0x000000ff; write(f_out, onechar, 3);#endif } numonline ++; } } /* ByteLevelIndex */ else if (OneFilePerBlock) { if (file_num <= MaxNum8bPartition) { for(j=0; j < INDEX_SET_SIZE; j++) { if (ip->index[j] == INDEX_ELEM_FREE) continue;#if !CRAZYSEGV putc(encode8b(ip->index[j]), f_out);#else onechar[0] = encode8b(ip->index[j]); write(f_out, onechar, 1);#endif } } else if (file_num <= MaxNum12bPartition) { for(j=0; j < INDEX_SET_SIZE; j++) { if (ip->index[j] == INDEX_ELEM_FREE) continue; x = encode12b(ip->index[j]); if (even_words) {#if !CRAZYSEGV putc(x & 0x000000ff, f_out); /* lsb */#else onechar[0] = x & 0x000000ff; write(f_out, onechar, 1);#endif y = (x & 0x00000f00)>>8; /* msb */ even_words = 0; } else { /* odd number of words so far */ y |= (x&0x00000f00)>>4; /* msb of x into msb of y */#if !CRAZYSEGV putc(y, f_out); putc(x&0x000000ff, f_out);#else onechar[0] = y; onechar[1] = x&0x000000ff; write(f_out, onechar, 2);#endif even_words = 1; } } } else if (file_num <= MaxNum16bPartition) { for(j=0; j < INDEX_SET_SIZE; j++) { if (ip->index[j] == INDEX_ELEM_FREE) continue; x = encode16b(ip->index[j]);#if !CRAZYSEGV putc((x&0x0000ff00)>>8, f_out); putc(x&0x000000ff, f_out);#else onechar[0] = (x&0x0000ff00)>>8; onechar[1] = x&0x000000ff; write(f_out, onechar, 2);#endif } } else { for(j=0; j < INDEX_SET_SIZE; j++) { if (ip->index[j] == INDEX_ELEM_FREE) continue; x = encode24b(ip->index[j]);#if !CRAZYSEGV putc((x&0x00ff0000)>>16, f_out); putc((x&0x0000ff00)>>8, f_out); putc(x&0x000000ff, f_out);#else onechar[0] = (x&0x00ff0000)>>16; onechar[1] = (x&0x0000ff00)>>8; onechar[2] = x&0x000000ff; write(f_out, onechar, 3);#endif } } } /* OneFilePerBlock */ else { /* normal partitions */ for(j=0; j < INDEX_SET_SIZE; j++) { if (ip->index[j] == INDEX_ELEM_FREE) continue;#if !CRAZYSEGV putc(ip->index[j], f_out);#else onechar[0] = ip->index[j]; write(f_out, onechar, 1);#endif } } } ip = ip->next_i; /* go to next indices */ indicesfree(ip_old, sizeof(struct indices)); ip_old = ip; } if (!ByteLevelIndex && OneFilePerBlock && !even_words && (file_num > MaxNum8bPartition) && (file_num <= MaxNum12bPartition)) {#if !CRAZYSEGV putc(y, f_out);#else onechar[0] = y; write(f_out, onechar, 1);#endif }next_token:#if !CRAZYSEGV if (putc('\n', f_out) == EOF) {#else onechar[0] = '\n'; if (write(f_out, onechar, 1) <= 0) {#endif fprintf(stderr, "Error: write failed at %s:%d\n", __FILE__, __LINE__); exit(2); } tp = tp->next_t; /* go to next token */#if 0 fprintf(stderr, "numelements=%d\n", numelements);#endif /*0*/#if BG_DEBUG memory_usage -= (strlen(tp_old->word) + 1);#endif /*BG_DEBUG*/ wordfree(tp_old->word, 0); tokenfree(tp_old, sizeof(struct token)); tp_old = tp; numseencount ++; } } tokenallfree(); indicesallfree(); wordallfree();#if BG_DEBUG fprintf(stderr, "out of traverse(): saved/freed %d tokens: new usage: %d\n", numseencount, memory_usage);#endif#if !CRAZYSEGV fflush(f_out); fclose(f_out);#else close(f_out);#endif}traverse1(){ FILE *i1, *i2, *i3; int ret; char s[MAX_LINE_LEN], es1[MAX_LINE_LEN], es2[MAX_LINE_LEN], es3[MAX_LINE_LEN]; char s1[MAX_LINE_LEN]; extern int errno; static int maxsortlinelen = 0; int i; if (maxsortlinelen <= 0) { if (file_num < MaxNum8bPartition) maxsortlinelen = round((MaxNum8bPartition * sizeof(int) + MAX_NAME_SIZE), MAX_LINE_LEN) * MAX_LINE_LEN; else if (file_num < MaxNum12bPartition) maxsortlinelen = round((MaxNum12bPartition * sizeof(int) + MAX_NAME_SIZE), MAX_LINE_LEN) * MAX_LINE_LEN; else maxsortlinelen = MAX_SORTLINE_LEN; } traverse(); /* will produce .i2 and my_free allocated memory */#if USESORT_Z_OPTION#if DONTUSESORT_T_OPTION || SFS_COMPAT sprintf(s, "exec %s -z %d '%s/%s' > '%s/%s'\n", SYSTEM_SORT, maxsortlinelen, escapesinglequote(INDEX_DIR, es1), I2, escapesinglequote(INDEX_DIR, es2), O2);#else sprintf(s, "exec %s -T '%s' -z %d '%s/%s' > '%s/%s'\n", SYSTEM_SORT, escapesinglequote(INDEX_DIR, es1), maxsortlinelen, escapesinglequote(INDEX_DIR, es2), I2, escapesinglequote(INDEX_DIR, es3), O2);#endif#else#if DONTUSESORT_T_OPTION || SFS_COMPAT sprintf(s, "exec %s '%s/%s' > '%s/%s'\n", SYSTEM_SORT, escapesinglequote(INDEX_DIR, es1), I2, escapesinglequote(INDEX_DIR, es2), O2);#else sprintf(s, "exec %s -T '%s' '%s/%s' > '%s/%s'\n", SYSTEM_SORT, escapesinglequote(INDEX_DIR, es1), escapesinglequote(INDEX_DIR, es2), I2, escapesinglequote(INDEX_DIR, es3), O2);#endif#endif#ifdef SW_DEBUG printf("%s", s);#endif if((ret=system(s)) != 0) { sprintf(s1, "system('%s') failed at:\n\t File=%s, Line=%d, Errno=%d", s, __FILE__, __LINE__, errno); perror(s1); fprintf(stderr, "Please try to run the program again\n(If there's no memory, increase the swap area / don't use -M and -B options)\n"); exit(2); }#ifdef SW_DEBUG printf("mv .o2 .i2\n"); fflush(stdout);#endif#if SFS_COMPAT sprintf(s, "%s/%s", INDEX_DIR, O2); sprintf(s1, "%s/%s", INDEX_DIR, I2); rename(s, s1);#else sprintf(s, "exec %s '%s/%s' '%s/%s'\n", SYSTEM_MV, escapesinglequote(INDEX_DIR, es1), O2, escapesinglequote(INDEX_DIR, es2), I2); system(s);#endif system(sync_path); /* sync() has a bug */#if 0 printf("traversed\n"); sprintf(s, "exec %s -10 '%s/%s'\n", SYSTEM_HEAD, escapesinglequote(INDEX_DIR, es1), I2); system(s);#endif /*0*/ /* * This flag is set from outside iff build-fast | build-addto option is set. */ if(FirstTraverse1) { /* Mention whether numbers are indexed */ if(IndexNumber) sprintf(s, "exec %s %%1234567890 > '%s/%s'\n", SYSTEM_ECHO, escapesinglequote(INDEX_DIR, es1), INDEX_FILE); else sprintf(s, "exec %s %% > '%s/%s'\n", SYSTEM_ECHO, escapesinglequote(INDEX_DIR,es1), INDEX_FILE); system(s); /* Put the magic number: 0 if not 1file/blk, numfiles otherwise */ if (OneFilePerBlock) { if (ByteLevelIndex) sprintf(s, "exec %s %%-%d >> '%s/%s'\n", SYSTEM_ECHO, file_num, escapesinglequote(INDEX_DIR, es1), INDEX_FILE); else sprintf(s, "exec %s %%%d >> '%s/%s'\n", SYSTEM_ECHO, file_num, escapesinglequote(INDEX_DIR, es1), INDEX_FILE); } else sprintf(s, "exec %s %%0 >> '%s/%s'\n", SYSTEM_ECHO, escapesinglequote(INDEX_DIR, es1), INDEX_FILE); system(s); /* Put the magic number: 0 if not structured index, 1 if so */ if (StructuredIndex) sprintf(s, "exec %s %%%d >> '%s/%s'\n", SYSTEM_ECHO, attr_num, escapesinglequote(INDEX_DIR, es1), INDEX_FILE); else if (RecordLevelIndex) sprintf(s, "exec %s %%-2 %s >> '%s/%s'\n", SYSTEM_ECHO, old_rdelim, escapesinglequote(INDEX_DIR, es1), INDEX_FILE); else sprintf(s, "exec %s %%0 >> '%s/%s'\n", SYSTEM_ECHO, escapesinglequote(INDEX_DIR, es1), INDEX_FILE); system(s);#ifdef SW_DEBUG sprintf(s, "exec %s -l %s/.glimpse*\n", SYSTEM_LS, escapesinglequote(INDEX_DIR, es1)); system(s);#endif sprintf(s, "exec %s '%s/%s' >> '%s/%s'\n", SYSTEM_CAT, escapesinglequote(INDEX_DIR, es1), I2, escapesinglequote(INDEX_DIR, es2), INDEX_FILE); system(s);#if SFS_COMPAT sprintf(s, "%s/%s", INDEX_DIR, I2); unlink(s);#else sprintf(s, "exec %s '%s/%s'\n", SYSTEM_RM, escapesinglequote(INDEX_DIR, es1), I2); system(s);#endif#ifdef SW_DEBUG sprintf(s, "exec %s -l %s/.glimpse*\n", SYSTEM_LS, escapesinglequote(INDEX_DIR, es1)); system(s);#endif#if 0 printf("catted\n"); sprintf(s, "exec %s -10 '%s/%s'\n", SYSTEM_HEAD, escapesinglequote(INDEX_DIR, es1), INDEX_FILE); system(s);#endif /*0*/ FirstTraverse1 = 0; system(sync_path); /* sync() has a bug */ return; } /* else not first-traverse */ sprintf(s, "%s/%s", INDEX_DIR, INDEX_FILE); if((i1 = fopen(s, "r")) == NULL) { /* new stuff */ fprintf(stderr, "can't open %s for reading\n", s); exit(2); } sprintf(s, "%s/%s", INDEX_DIR, I2); if((i2 = fopen(s, "r")) == NULL) { /* old stuff */ fprintf(stderr, "can't open %s for reading\n", s); exit(2); } sprintf(s, "%s/%s", INDEX_DIR, I3); if((i3 = fopen(s, "w")) == NULL) { /* result */ fprintf(stderr, "can't open %s for writing\n", s); exit(2); } /* Copy the 3 option fields (indexnumber, onefileperblock, structuredqueries) */ fgets(s, 256, i1); s[255] = '\0'; fputs(s, i3); fgets(s, 256, i1); s[255] = '\0'; fputs(s, i3); fgets(s, 256, i1); s[255] = '\0'; fputs(s, i3); merge_in(i2, i1, i3); /* merge_in(i1, i2, i3); */#ifdef BG_DEBUG fprintf(stderr, "out of merge_in()\n");#endif /*BG_DEBUG*/ fclose(i1); fflush(i2); fclose(i2); fflush(i3); fclose(i3); system(sync_path); /* sync() has a bug */#ifdef SW_DEBUG printf("mv .i3 %s\n", INDEX_FILE); fflush(stdout);#endif#if SFS_COMPAT sprintf(s, "%s/%s", INDEX_DIR, I3); sprintf(s1, "%s/%s", INDEX_DIR, INDEX_FILE); rename(s, s1);#else sprintf(s, "exec %s '%s/%s' '%s/%s'", SYSTEM_MV, escapesinglequote(INDEX_DIR, es1), I3, escapesinglequote(INDEX_DIR, es2), INDEX_FILE); system(s);#endif/* #ifdef SW_DEBUG */#if 0 printf("ls -l .i2 %s\n", INDEX_FILE); fflush(stdout); sprintf(s, "exec %s -l %s/.glimpse*", SYSTEM_LS, escapesinglequote(INDEX_DIR, es1)); printf("%d\n", system(s));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -