daily pastebin goal
78%
SHARE
TWEET

Untitled

a guest Feb 11th, 2018 252 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <ctype.h>
  4.  
  5. struct substr {
  6.     char *str;
  7.     unsigned len;
  8. };
  9.  
  10. struct substr substr_from_str(char *s) {
  11.     return (struct substr){.str = s, .len = strlen(s)};
  12. }
  13.  
  14. int substr_to_int(struct substr s, int *num) {
  15.     int ret = 0;
  16.     int sign = (s.str[0] == '-');
  17.     int start = sign ? 1 : 0;
  18.     for(int i = start; i < s.len; i ++) {
  19.         char c = s.str[i];
  20.         if(!isdigit(c)) {
  21.             return 0;
  22.         }
  23.         ret *= 10;
  24.         ret += c - '0';
  25.     }
  26.     *num = sign ? - ret : ret;
  27.     return 1;
  28. }
  29.  
  30. struct substr trim_spaces_back(struct substr s) {
  31.     for(int i = s.len-1; i >= 0; i --) {
  32.         if(s.str[i] != ' ') {
  33.             s.len = i + 1;
  34.             return s;
  35.         }
  36.     }
  37.     return (struct substr){.str = s.str, .len = 0};
  38. }
  39. struct substr cut_number_back(struct substr *s) {
  40.     for(int i = s->len-1; i >= 0; i --) {
  41.         if(!isdigit(s->str[i]) && s->str[i] != '-') {
  42.             struct substr ret = {
  43.                 .str = s->str + i + 1,
  44.                 .len = s->len - i - 1
  45.             };
  46.             s->len = i + 1;
  47.             return ret;
  48.         }
  49.     }
  50.     return (struct substr){NULL, 0};
  51. }
  52. struct substr parse_int_back(struct substr *s) {
  53.     *s = trim_spaces_back(*s);
  54.     return cut_number_back(s);
  55. }
  56.  
  57. int parse_line(char *str, int *uid, int *gid) {
  58.     struct substr line = substr_from_str(str);
  59.     struct substr gid_str = parse_int_back(&line);
  60.     if(gid_str.str == NULL || gid_str.len == 0) {
  61.         goto SPOOL_READ_ERROR;
  62.     }
  63.     struct substr uid_str = parse_int_back(&line);
  64.     if(uid_str.str == NULL || uid_str.len == 0) {
  65.         goto SPOOL_READ_ERROR;
  66.     }
  67.     return substr_to_int(uid_str, uid) && substr_to_int(gid_str, gid);
  68. SPOOL_READ_ERROR:
  69.     return 0;
  70. }
  71.  
  72. int main() {
  73.     int uid, gid;
  74.     if(parse_line("asdf 1234 5678", &uid, &gid)) {
  75.         printf("%d, %d\n", uid, gid);
  76.     } else {
  77.         printf("error\n");
  78.     }
  79.     return 0;
  80. }
RAW Paste Data
Top