Advertisement
Guest User

Untitled

a guest
Nov 26th, 2014
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.94 KB | None | 0 0
  1. struct argsInfo
  2. setFlags(int argc, char*argv[]){
  3.  
  4. int ptrError = EINVAL;
  5. struct argsInfo info;
  6. char *saveptr1; // for the strtok
  7. char *strtokens;
  8. char *iArgStr; // i optarg
  9. char *oArgStr; // o optarg
  10. char *fArgStr; // f optarg
  11. char buf[BUFSIZ];
  12. char c;
  13. int i_mode = 0;
  14. int o_mode = 0;
  15. int f_mode = 0;
  16. int BASE_10 = 10; // Base for default base
  17. int minRange = 2;
  18. int maxRange = 36;
  19. long iLong =0; // the long value for input base
  20. long oLong = 0; // the long value for output base
  21. int error = 0;
  22.  
  23. memset(&info,0,sizeof(info) );
  24.  
  25.  
  26. while((c = getopt(argc,argv,STR_GETOPT_OPTIONS))!=-1){
  27. switch(c){
  28. case 'h':
  29. info.mode|= H_FLAG;
  30. error = 1;
  31. break;
  32.  
  33. case 'e':
  34. info.mode|=E_FLAG;
  35. break;
  36.  
  37. case 'b':
  38. info.mode|=B_FLAG;
  39. break;
  40.  
  41. case 'i':
  42. info.mode |=I_FLAG;
  43. i_mode = 1;
  44. iArgStr = optarg;
  45. break;
  46.  
  47. case 'o':
  48. info.mode|= O_FLAG;
  49. o_mode = 1;
  50. oArgStr = optarg;
  51. break;
  52.  
  53. case 'f':
  54. info.mode|= F_FLAG;
  55. fArgStr = optarg;
  56. f_mode = 1;
  57. info.inFileStr = fArgStr;
  58.  
  59. break;
  60.  
  61. default:
  62. info.mode|=H_FLAG;
  63. error=1;
  64. break;
  65.  
  66. }
  67. }
  68.  
  69. /* If the i flag was specified*/
  70. if(i_mode ==1)
  71. {
  72. iLong = strToLong(iArgStr,BASE_10); // get the long representation of the
  73. // input base
  74.  
  75. /*Check if the value passed in is an int*/
  76. if(errno==ptrError)
  77. {
  78. info.mode|= H_FLAG;
  79. (void)fprintf(stderr,STR_INBASE_ENDPTR_ERR,iArgStr);
  80. error = 1;
  81. }
  82.  
  83. /*Check if the argument is a valid int using perror*/
  84. else if(errno!=0)
  85. {
  86. info.mode|= H_FLAG;
  87. (void) snprintf(buf, BUFSIZ,"%s%s",STR_TAB,iArgStr);
  88. perror(buf);
  89. error = 1;
  90.  
  91. }
  92. /* Check if the argument is in range*/
  93. else if(checkRange(iLong,minRange,maxRange)==0)
  94. {
  95. info.mode|= H_FLAG;
  96. (void)fprintf(stderr,STR_INBASE_BAD_RANGE,iLong,minRange,maxRange);
  97. error = 1;
  98.  
  99. }
  100. else
  101. {
  102. // Set the default base if i is not specified
  103. info.inputBase = iLong;
  104. }
  105.  
  106. }
  107. else
  108. {
  109. // set default input base if not set
  110. info.inputBase = BASE_10;
  111. }
  112.  
  113.  
  114.  
  115. /* If the o flag was specified*/
  116. if(o_mode == 1)
  117. {
  118. errno = 0; // reset errno
  119.  
  120.  
  121. //tokenize, parse and error check the str
  122. while((strtokens = strtok_r(oArgStr,STR_OUTBASE_TOK_SEPARATOR,
  123. &saveptr1))!=NULL)
  124. {
  125. oLong = strToLong(strtokens,0); // convert to strToLong
  126.  
  127. /*Check if the value passed in is an int*/
  128. if(errno==ptrError)
  129. {
  130. error = 1;
  131. info.mode|= H_FLAG;
  132. (void)fprintf(stderr,STR_OUTBASE_ENDPTR_ERR,oArgStr);
  133. break;
  134. }
  135.  
  136. /*Check if the argument is a valid int using perror*/
  137. if(errno!=0)
  138. {
  139. error = 1;
  140. info.mode|= H_FLAG;
  141. (void) snprintf(buf, BUFSIZ,"%s%s",STR_TAB,oArgStr);
  142. perror(buf);
  143. break;
  144. }
  145.  
  146. /* Check if the argument is in range*/
  147. if(checkRange(oLong,minRange,maxRange)==0)
  148. {
  149. error = 1;
  150. info.mode|= H_FLAG;
  151. (void)fprintf(stderr,STR_OUTBASE_BAD_RANGE,oLong,minRange,maxRange);
  152. break;
  153. }
  154.  
  155.  
  156. /* update the output base*/
  157. info.outputBases |=BASE_MASK(oLong);
  158.  
  159. oArgStr = NULL;
  160. }
  161.  
  162. }
  163.  
  164. /*Check if the f flag was specified*/
  165. if(f_mode == 1)
  166. {
  167. if(optind != argc)
  168. {
  169. error = 1;
  170. info.mode|= H_FLAG;
  171. (void)fprintf(stderr,STR_FILE_AND_ARGS_ERR );
  172.  
  173. }
  174.  
  175. }
  176.  
  177. /* If there were no errors, check if a number was passed to be converted*/
  178. if((f_mode !=1)&& (argc == optind) && !error)
  179. {
  180. info.mode |= H_FLAG;
  181. (void)fprintf(stderr,STR_NO_INPUT_ERR);
  182.  
  183. }
  184.  
  185.  
  186.  
  187. return info;
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement