void createWords(vector<string> &bag, vector<int> &repetitions, const string &str,int* size) { string word=""; bool lastChar=false; for(string::const_iterator iter=str.begin(); iter!=str.end(); ++iter) { char letter=*iter; if (isValid(letter)) { word+=tolower(letter); lastChar=true; } else if (lastChar) { addToBag(bag, repetitions, word); word.erase(); (*size)++; lastChar=false; } } if (lastChar) { addToBag(bag, repetitions, word); (*size)++; } }
int main(int argc, char* argv[]){ if(argc==2) { struct bag* b = (struct bag*)malloc(sizeof(struct bag));/*Create new bag*/ initBag(b);/*Initialize*/ char* s=argv[1]; int n = atoi(s);/*number of elements to add*/ int i; for( i = 1; i < n; ++i) { addFrontList(b->l, (TYPE)(i));/*Add elements*/ } addToBag(b, (TYPE)9); addToBag(b, (TYPE)3); addToBag(b, (TYPE)9); double t1 = getMilliseconds();/*Time before contains()*/ printf("Found? %d\n", bagContains(b, (TYPE)20)); double t2 = getMilliseconds();/*Time after contains()*/ printf("Size: %d\n", b->l->size); removeFromBag(b, (TYPE)9); printf("Size: %d\n", b->l->size); addFrontList(b->l, 10.0); printf("Front: %f\n", frontList(b->l)); printf("%d %g\n", n, t2-t1); freeBag(b); } else { printf("Please enter the number of elements to add.\n"); } return 0; }
int main(int argc, char* argv[]) { if( argc != 2 ) return 0; struct bag* b = createBag(); int n = atoi(argv[1]);/*number of elements to add*/ int i; for( i = 0 ; i < n; i++) addToBag(b, (TYPE)i);/*Add elements*/ double t1 = getMilliseconds();/*Time before contains()*/ for(i=0; i<n; i++) containsBag(b, i); double t2 = getMilliseconds();/*Time after contains()*/ printf("%d %g\n", n, t2-t1); return 0; }
int main(){ struct bag* b = (struct bag*)malloc(sizeof(struct bag));/*Create new bag*/ initBag(b);/*Initialize*/ printf("size of list = %d \n", b->lst->size); printf("\n"); addFrontList(b->lst, 3); addFrontList(b->lst, 2); addBackList(b->lst, 4); addBackList(b->lst, 5); addBackList(b->lst, 6); addFrontList(b->lst, 1); int i; struct DLink *currentlink = b->lst->head->next; for(i = 1; i <= b->lst->size; i++){ printf("index %d = %d \n", i, currentlink->value); currentlink = currentlink->next; } printf("\n"); printf("front = %d \n", frontList(b->lst)); printf("back = %d \n", backList(b->lst)); printf("is list empty? = %d \n", isEmptyList(b->lst)); printf("size of list = %d \n", b->lst->size); printf("list contains = %d \n", listContains(b->lst, 12)); printf("\n"); addToBag(b, 10); removeFromBag(b, 1); struct DLink *link = b->lst->head->next; for(i = 1; i <= b->lst->size; i++){ printf("index %d = %d \n", i, link->value); link = link->next; } printf("list contains = %d \n", bagContains(b, 100)); return 0; }
int main(int argc, char *argv[]) { uint32_t i, j, k; uint32_t m; uint32_t byte, bit; struct sigaction msa; struct sigaction csa; uint64_t object_size = BYTES + 1024*1024; int opt; /* child variables */ uint32_t nmult; uint32_t mpert; uint32_t temp; uint32_t a; uint32_t cbyte, cbit; uint32_t start, end; uint32_t prime; if (argc < 2) { printf("Indicate the number of threads.\n"); exit(EXIT_FAILURE); } /* map shared memory object, allocate into it */ nproc = atoi(argv[1]); if (nproc > MAX_PROC) { printf("The process limit is 8.\n"); exit(EXIT_FAILURE); } path = "/hari_primes"; pstruct = mount_shmem(path, object_size); cfinder = (struct compFinder *) pstruct; bzero(cfinder, sizeof(struct compFinder)); cfinder->nlist = (unsigned char *) (&cfinder[1]); find = &cfinder->find[0]; complete = &cfinder->complete[0]; getid = (sem_t *) (&cfinder->nlist[BYTES]); /* initialize composite finder struct and number list */ bzero(cfinder->nlist, BYTES); cfinder->nproc = nproc; /* initialize semaphores */ for (i = 0; i < nproc; i++) { sem_init(&find[i], 1, 0); sem_init(&complete[i], 1, 0); } sem_init(getid, 1, 1); /* install signal handler */ sigemptyset(&msa.sa_mask); msa.sa_flags = 0; msa.sa_handler = mhandler; if (sigaction(SIGINT, &msa, NULL) == -1) { int j; for (j = 0; j < cfinder->nproc; j++) { sem_destroy(&find[j]); sem_destroy(&complete[j]); } sem_destroy(getid); for (j = 0; j < nproc; j++) wait(NULL); if (shm_unlink(path) == -1) { perror("unlink shared memory\n"); exit(EXIT_FAILURE); } exit(EXIT_FAILURE); } /* initialize mask */ for (i = 0; i < 8; i++) { cfinder->mask[i] = 1 << (8-i-1); } cfinder->total = (uint32_t) ((unsigned long)(BYTES) * 8 - 1); /* mark the number 1 as special */ cfinder->nlist[0] = cfinder->nlist[0] | cfinder->mask[1]; cfinder->done = 0; /* create composite marking processes */ for (i = 0; i < nproc; i++) { switch(fork()) { case -1: for (j = 0; j < nproc; j++) { sem_destroy(&find[j]); sem_destroy(&complete[j]); } sem_destroy(getid); if (shm_unlink(path) == -1) { perror("unlink pstruct\n"); exit(EXIT_FAILURE); perror("forking"); } exit(EXIT_FAILURE); break; case 0: /* child */ /* install child signal handler */ sigemptyset(&csa.sa_mask); csa.sa_flags = 0; csa.sa_handler = chandler; if (sigaction(SIGINT, &csa, NULL) == -1) { exit(EXIT_FAILURE); } /* get process number */ sem_wait(getid); temp = cfinder->procNo; cfinder->procNo++; sem_post(getid); /* wait for signal and get prime */ while(1) { sem_wait(&cfinder->find[temp]); if (cfinder->done) break; prime = cfinder->prime; nmult = cfinder->total / prime; mpert = nmult / cfinder->nproc; if (!mpert) { /* multiples per thread greater than the number of threads */ for (a = 0; a < nmult - 1; a++) { if (temp == a) { start = (a + 2) * prime; end = (a + 2) * prime; } } for (a = nmult - 1; a < cfinder->nproc; a++) { /* for inactive threads just make start arbitrarily greater than end */ if (temp == a) { start = 4; end = 2; } } } else { /* set start composite number */ if (!temp) start = 2 * prime; else { start = (temp * mpert + 2) * prime; /* set start to first multiple in byte */ while (1) { if ( (start / 8) != ((start - prime) / 8)) { /* first multiple in byte */ break; } start += prime; } } /* set end composite number */ if (temp == (cfinder->nproc - 1)) { end = nmult * prime; } else { end = ((temp + 1) * mpert + 1) * prime; while(1) { /* set end to last multiple of byte */ if ( ((end + prime) / 8) != (end / 8)) { /* last multiple of byte */ break; } end += prime; } } } for (a = start; a <= end; a += prime) { if (!(a % 2) && prime != 2) { if ( (cfinder->total - a) < prime) break; continue; } cbyte = a / 8; cbit = a % 8; cfinder->nlist[cbyte] = cfinder->nlist[cbyte] | cfinder->mask[cbit]; if ( (cfinder->total - a) < prime) break; } sem_post(&cfinder->complete[temp]); } sem_post(&cfinder->complete[temp]); /* happy/sad determination */ sem_wait(&cfinder->find[temp]); if (cfinder->happy | cfinder->sad) { /* divide up list of numbers */ struct bag *hcheck = (struct bag *) malloc(sizeof(struct bag)); char buf[33]; if (!temp) start = 0; else start = temp * (BYTES / cfinder->nproc); if (temp == (cfinder->nproc - 1)) end = BYTES - 1; else end = (temp + 1) * (BYTES / cfinder->nproc) - 1; /* iterate through prime numbers in region */ for (cbyte = start; cbyte <= end; cbyte++) { for (cbit = 0; cbit < 8; cbit++) { i = 8 * cbyte + cbit; /* algorithm similar to that shown in wikipedia page on happy/sad primes */ if (!(cfinder->nlist[cbyte] & cfinder->mask[cbit])) { prime = i; initBag(hcheck); addToBag(hcheck, 0); while ((i > 1) && (!bagContains(hcheck,i))) { addToBag(hcheck, i); sprintf(&buf[0], "%u", i); i = calcInterm(&buf[0]); } if (i == 1 && cfinder->phappy) { printf("happy: %u\n", prime); } else if (i != 1 && cfinder->psad) { if (i) /* i != 0 */ printf("sad: %u\n", prime); } else { } freeBag(hcheck); } } } free(hcheck); } exit(EXIT_SUCCESS); break; default: break; } } /* perform sieve, mark off composites */ for (i = 2; i <= sqrt(cfinder->total);) { /* find first unmarked number */ j = i; while(j < cfinder->total) { byte = j / 8; bit = j % 8; if (!(cfinder->nlist[byte] & cfinder->mask[bit])) { break; } j++; } if (j >= cfinder->total) break; cfinder->prime = j; /* allowing threads now to cross off composites */ for(k = 0; k < nproc; k++) sem_post(&find[k]); /* waiting for all threads to finish before getting next prime */ for (k = 0; k < nproc; k++) { if (sem_wait(&complete[k])==-1) perror("error\n"); } i = ++j; } cfinder->done = 1; /* telling processes to terminate */ for(k = 0; k < nproc; k++) sem_post(&find[k]); for (k = 0; k < nproc; k++) sem_wait(&complete[k]); /* check what to do next */ while ((opt = getopt(argc, argv, "phs")) == 'p') { printBitMap(cfinder, 1, cfinder->total); } /* set the proper flags */ while (opt != -1) { if (opt == 'h') { printf("happy primes will be found\n"); cfinder->happy = 1; if (getopt(argc, argv, "phs") == 'p') { printf("happy primes will be printed \n"); cfinder->phappy = 1; } } else if (opt == 's') { printf("sad primes will be found\n"); cfinder->sad = 1; if (getopt(argc, argv, "phs") == 'p') { printf("sad primes will be printed\n"); cfinder->psad = 1; } } else { printf("we're done \n"); } opt = getopt(argc, argv, "phs"); } /* start up processes again after setting flags */ for(k = 0; k < nproc; k++) sem_post(&find[k]); for (k = 0; k < nproc; k++) wait(NULL); /* destroy semaphores, delete shared memory object */ for (j = 0; j < nproc; j++) { sem_destroy(&find[j]); sem_destroy(&complete[j]); } sem_destroy(getid); if (shm_unlink(path) == -1) { perror("unlink pstruct\n"); exit(EXIT_FAILURE); } return 0; }