/[cvs]/joko/Uni/BSArch/01/prime.c
ViewVC logotype

Diff of /joko/Uni/BSArch/01/prime.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.2 by joko, Fri May 12 18:44:17 2006 UTC revision 1.9 by joko, Sat May 13 09:20:36 2006 UTC
# Line 1  Line 1 
1    /* $Id$ */
2    
3  #include <stdio.h>  #include <stdio.h>
4  #define PRINTPRIME(x) if(prime(x)) printf("%i\n", x)  #include <stdlib.h>
5  int prime(int number)  #include <limits.h>
6    #include <errno.h>
7    
8    #define BOOL int
9    #define TRUE 1
10    #define FALSE 0
11    
12    #define PRINTPRIME(x) if (is_prime(x)) printf("%i\n", x)
13    #define PRINTERROR(message) fprintf(stderr, "ERROR: %s\n", message)
14    
15    /* check for prime number */
16    BOOL is_prime(long int number)
17  {  {
18    int i;          int i;
19    for(i=2;i*i<=number;i++){          
20          if((number%i) == 0)          /* negative values, 0 and 1 are never prime numbers */
21            return 0;          if (number < 2) return FALSE;
22    }          
23    return 1;          /* check all numbers 2..sqrt(number) for being a prime number */
24            for (i=2; i*i <= number; i++) {
25                    if ((number % i) == 0)
26                            return FALSE;
27            }
28            return TRUE;
29  }  }
30    
31    /* convert from string to long int, with error checking */
32    long int convert_number(const char *nptr) {
33            
34            errno = 0;
35            char * endptr;
36            long int number = strtol(nptr, &endptr, 10);
37            
38            /* invalid characters? */
39            if (*endptr != '\0') {
40                    char message[254];
41                    snprintf(message, 256, "Could not convert '%s' to a valid number.", nptr);
42                    PRINTERROR(message);
43                    exit(EXIT_FAILURE);
44            }
45            
46            /* invalid range? */
47            /* if (number == LONG_MAX || number == LONG_MIN) { */
48            if (errno == ERANGE) {
49                    char message[254];
50                    snprintf(message, 256, "Number is not in range of 'long int': %s", nptr);
51                    PRINTERROR(message);
52                    exit(EXIT_FAILURE);
53            }
54            
55            return number;
56            
57    }
58    
59  int main(int argc, char * argv[])  int main(int argc, char * argv[])
60  {  {
61          int i, j;          
62          FILE * fp;          if (argc == 1) {
63          char num[11];                  PRINTERROR("No arguments given.");
64          if(argc > 2 ){                  exit(EXIT_FAILURE);
65                  j=atoi(argv[2]);          }
66                  for(i=atoi(argv[1]) ; i< j; i++){          
67            /* (3) range mode */
68            if (argc > 2) {
69                    long int i, j;
70                    i = convert_number(argv[1]);
71                    j = convert_number(argv[2]);
72                    for (i; i< j; i++) {
73                          PRINTPRIME(i);                          PRINTPRIME(i);
74                  }                  }
75          }else {          
76                  fp=fopen(argv[1], "r");          /* other modes */
77                  if(fp==NULL){          } else {
78                          PRINTPRIME(atoi(argv[1]));  
79                  }else{                  /* try to open file for reading */
80                          while(fgets(num, 11, fp))                  FILE * fp = fopen(argv[1], "r");
81                                  PRINTPRIME(atoi(num));                  
82                    /* (1) test-single-number mode: first argument is not a filename */
83                    if (fp == NULL) {
84                            long int number = convert_number(argv[1]);
85                            PRINTPRIME(number);
86                    
87                    /* (2) file mode: read numbers from file */
88                    } else {
89                            char entry[11];
90                            while (fgets(entry, 11, fp)) {
91                                    long int number = convert_number(entry);
92                                    PRINTPRIME(number);
93                            }
94                          fclose(fp);                          fclose(fp);
95                  }                  }
96          }          }

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.9

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed