// Посчитать, сколько памяти требуется для упаковки заданным методом MemSize REP_METHOD::GetCompressionMem (void) { // Скопировано из rep_compress int L = roundup_to_power_of (mymin(SmallestLen,MinMatchLen)/2, 2); // Размер блоков, КС которых заносится в хеш int k = sqrtb(L*2); int HashSize = CalcHashSize (HashSizeLog, BlockSize, k); return BlockSize + HashSize*sizeof(int); }
// Посчитать, сколько памяти требуется для упаковки заданным методом void REP_METHOD::SetCompressionMem (MemSize mem) { if (mem>0) { // Скопировано из rep_compress int L = roundup_to_power_of (mymin(SmallestLen,MinMatchLen)/2, 2); // Размер блоков, КС которых заносится в хеш int k = sqrtb(L*2); int HashSize = CalcHashSize (HashSizeLog, mem/5*4, k); BlockSize = mem - HashSize*sizeof(int); } }
int main (int argc, char *argv[]) { int i; /* * Parse command line arguments conforming with getopt_long syntax * Note: we have to support "xboard" and "post" as bare strings * for backward compatibility. */ int c; int opt_help = 0, opt_version = 0, opt_post = 0, opt_xboard = 0, opt_hash = 0, opt_memory = 0, opt_easy = 0, opt_manual = 0; char *endptr; progname = argv[0]; /* Save in global for cmd_usage */ while (1) { static struct option long_options[] = { {"hashsize", 1, 0, 's'}, {"memory", 1, 0, 'M'}, {"version", 0, 0, 'v'}, {"help", 0, 0, 'h'}, {"xboard", 0, 0, 'x'}, {"post", 0, 0, 'p'}, {"easy", 0, 0, 'e'}, {"manual", 0, 0, 'm'}, {0, 0, 0, 0} }; /* getopt_long stores the option index here. */ int option_index = 0; c = getopt_long (argc, argv, "ehmpvxs:M:", long_options, &option_index); /* Detect the end of the options. */ if (c == -1) break; /* * Options with a straight flag, could use getoopt_long * flag setting but this is more "obvious" and easier to * modify. */ switch (c) { case 'v': opt_version = 1; break; case 'h': opt_help = 1; break; case 'x': opt_xboard = 1; break; case 'p': opt_post = 1; break; case 'e': opt_easy = 1; break; case 'm': opt_manual = 1; break; case 's': if ( optarg == NULL ){ /* we have error such as two -s */ opt_help = 1; break; } errno = 0; /* zero error indicator */ opt_hash = strtol (optarg, &endptr, 10); if ( errno != 0 || *endptr != '\0' ){ printf("Hashsize out of Range or Invalid\n"); return(1); } break; case 'M': if ( optarg == NULL ){ /* we have error such as two -s */ opt_help = 1; break; } errno = 0; /* zero error indicator */ opt_memory = strtol (optarg, &endptr, 10); if ( errno != 0 || *endptr != '\0' ){ printf("Memory size invalid\n"); return(1); } break; case '?': /* On error give help - getopt does a basic message. */ opt_help = 1; break; default: puts ("Option Processing Failed\n"); abort(); } } /* end of getopt_long style parsing */ /* Initialize random number generator */ srand((unsigned int) time(NULL)); /* initialize control flags */ flags = ULL(0); /* output for thinking */ ofp = stdout; /* Handle old style command line options */ if (argc > 1) { for (i = 0; i < argc; i++) { if (strcmp(argv[i],"xboard") == 0) { SET (flags, XBOARD); } else if (strcmp(argv[i],"post") == 0) { SET (flags, POST); } } } if (opt_xboard == 1) SET (flags, XBOARD); if (opt_post == 1) SET (flags, POST); if (opt_manual ==1) SET (flags, MANUAL); cmd_version(); /* If the version option was specified we can exit here */ if (opt_version == 1) return(0); /* If a usage statement is required output it here */ if (opt_help == 1){ cmd_usage(); return (1); /* Maybe an error if due to bad arguments. */ } if (opt_memory != 0 && opt_hash != 0 ){ cmd_usage(); return (1); /* only one or the other */ } HashSize = 0 ; /* Set HashSize zero */ if ( opt_hash != 0) CalcHashSize(opt_hash); if ( opt_memory > 0 ){ int tablesize=(1048576*opt_memory)/(2*sizeof(HashSlot)); CalcHashSize(tablesize); } Initialize (); if ( opt_easy == 0) SET (flags, HARD); if (argc > 1) { for (i = 0; i < argc; i++) { if (strcmp(argv[i],"xboard") == 0) { SET (flags, XBOARD); } else if (strcmp(argv[i],"post") == 0) { SET (flags, POST); } } } bookmode = BOOKPREFER; bookfirstlast = 3; while (!(flags & QUIT)) { wait_for_input(); parse_input(); if ((flags & THINK) && !(flags & MANUAL) && !(flags & ENDED)) { if (!(flags & XBOARD)) printf("Thinking...\n"); Iterate (); CLEAR (flags, THINK); } RealGameCnt = GameCnt; RealSide = board.side; input_wakeup(); /* Ponder only after first move */ /* Ponder or (if pondering disabled) just wait for input */ if ((flags & HARD) && !(flags & QUIT) ) { ponder(); } } CleanupInput(); /* Some cleaning up */ free (HashTab[0]); free (HashTab[1]); return (0); }