long sieve_next(sieve *sp) { long out; int ix = 0; long val; if(sp->next > sp->nbits) return -1; out = S_VAL(sp, sp->next); #ifdef DEBUG fprintf(stderr, "Sieving %ld\n", out); #endif /* Sieve out all multiples of the current prime */ val = out; while(ix < sp->nbits) { val += out; ix = S_BIT(sp, val); if((val & 1) && ix < sp->nbits) { /* && S_ISSET(sp, ix)) { */ S_CLR(sp, ix); #ifdef DEBUG fprintf(stderr, "Crossing out %ld (bit %d)\n", val, ix); #endif } } /* Scan ahead to the next prime */ ++sp->next; while(sp->next < sp->nbits && !S_ISSET(sp, sp->next)) ++sp->next; return out; }
int main(int argc, char *argv[]) { sieve s; long pr, *p; int c, ix, cur = 0; if(argc < 2) { fprintf(stderr, "Usage: %s <width>\n", argv[0]); return 1; } c = atoi(argv[1]); if(c < 0) c = -c; fprintf(stderr, "%s: sieving to %d positions\n", argv[0], c); sieve_init(&s, 3, c); c = 0; while((pr = sieve_next(&s)) > 0) { ++c; } p = calloc(c, sizeof(long)); if(!p) { fprintf(stderr, "%s: out of memory after first half\n", argv[0]); sieve_clear(&s); exit(1); } fprintf(stderr, "%s: half done ... \n", argv[0]); for(ix = 0; ix < s.nbits; ix++) { if(S_ISSET(&s, ix)) { p[cur] = S_VAL(&s, ix); printf("%ld\n", p[cur]); ++cur; } } sieve_reset(&s, p[cur - 1]); fprintf(stderr, "%s: crossing off %d found primes ... \n", argv[0], cur); for(ix = 0; ix < cur; ix++) { sieve_cross(&s, p[ix]); if(!(ix % 1000)) fputc('.', stderr); } fputc('\n', stderr); free(p); fprintf(stderr, "%s: sieving again from %ld ... \n", argv[0], p[cur - 1]); c = 0; while((pr = sieve_next(&s)) > 0) { ++c; } fprintf(stderr, "%s: done!\n", argv[0]); for(ix = 0; ix < s.nbits; ix++) { if(S_ISSET(&s, ix)) { printf("%ld\n", S_VAL(&s, ix)); } } sieve_clear(&s); return 0; }
void print_player(char *name, char flags) { creature *player; int breakout, j; if(!isupper(name[0])) return; if(load_ply_from_file(name, &player) < 0){ printf("Player Load Error (%s).\n", name); return; } if(spl) { /* Check for certain spell */ if(!S_ISSET(player, Spellnum)) { free_crt(player); return; } } /* not lvl check or player = lvl */ if( !lvl || player->level == lvl){ printf("%s%s",(!is_fset(flags,1)) ? "Name: " : "", player->name); /*print password */ if (is_fset(flags,2)) printf(" (%s)\n",player->password); else printf("\n"); /* if not name only display */ if(!is_fset(flags,1)) printf("Class: %s (%d) %s\n",get_class_string(player->class), player->level, get_race_string(player->race)); /* print players inventory */ if(is_fset(flags,0)){ otag *obj, *cnt; int len = 0; printf("Inventory:\n"); obj = player->first_obj; if(!obj) printf("none"); while(obj){ printf("%s%s",obj->obj->name, (obj->next_tag) ? (F_ISSET(obj->obj,OCONTN)) ? ":" :", " : "."); len += strlen(obj->obj->name); if(F_ISSET(obj->obj,OCONTN)){ cnt = obj->obj->first_obj; printf("("); if (!cnt) printf("empty"); while(cnt){ printf("%s%s",cnt->obj->name, (cnt->next_tag) ? ", " : ""); len += strlen(cnt->obj->name); if (len > 50){ printf("\n"); len = 0; } cnt = cnt->next_tag; } printf(")%s",(obj->next_tag) ? ", " : "."); } if (len > 50){ printf("\n"); len = 0; } obj = obj->next_tag; } printf("\n"); } }