亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sortformat.c

?? linux下獲取一些環境信息的代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * Copyright 1998-2004 by Albert Cahalan; all rights resered.          * This file may be used subject to the terms and conditions of the * GNU Library General Public License Version 2, or any later version   * at your option, as published by the Free Software Foundation. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. */                                 #include <stdlib.h>#include <stdio.h>#include <string.h>/* username lookups */#include <sys/types.h>#include <pwd.h>#include <grp.h>#include "../proc/readproc.h"#include "../proc/sysinfo.h"#include "common.h"static sf_node *sf_list = NULL;         /* deferred sorting and formatting */static int broken;                      /* use gross Unix98 parsing? */static int have_gnu_sort = 0;           /* if true, "O" must be format */static int already_parsed_sort = 0;     /* redundantly set in & out of fn */static int already_parsed_format = 0;/****************  Parse single format specifier *******************/static format_node *do_one_spec(const char *spec, const char *override){  const format_struct *fs;  const macro_struct *ms;  fs = search_format_array(spec);  if(fs){    int w1, w2;    format_node *thisnode;    thisnode = malloc(sizeof(format_node));    if(fs->flags & CF_PIDMAX){      w1 = (int)get_pid_digits();      w2 = strlen(fs->head);      if(w2>w1) w1=w2; // FIXME w/ separate header/body column sizing    }else{      w1 = fs->width;    }    if(override){      w2 = strlen(override);      thisnode->width = (w1>w2)?w1:w2;      thisnode->name = malloc(strlen(override)+1);      strcpy(thisnode->name, override);    }else{      thisnode->width = w1;      thisnode->name = malloc(strlen(fs->head)+1);      strcpy(thisnode->name, fs->head);    }    thisnode->pr = fs->pr;    thisnode->need = fs->need;    thisnode->vendor = fs->vendor;    thisnode->flags = fs->flags;    thisnode->next = NULL;    return thisnode;  }  /* That failed, so try it as a macro. */  ms = search_macro_array(spec);  if(ms){    format_node *list = NULL;    format_node *newnode;    const char *walk;    int dist;    char buf[16]; /* trust strings will be short (from above, not user) */    walk = ms->head;    while(*walk){      dist = strcspn(walk, ", ");      strncpy(buf,walk,dist);      buf[dist] = '\0';      newnode = do_one_spec(buf,override); /* call self, assume success */      newnode->next = list;      list = newnode;      walk += dist;      if(*walk) walk++;    }    return list;  }  return NULL;   /* bad, spec not found */}/************ must wrap user format in default *************/static void O_wrap(sf_node *sfn, int otype){  format_node *fnode;  format_node *endp;  const char *trailer;  trailer = (otype=='b') ? "END_BSD" : "END_SYS5" ;  fnode =  do_one_spec("pid",NULL);  if(!fnode)fprintf(stderr,"Seriously crashing. Goodbye cruel world.\n");  endp = sfn->f_cooked; while(endp->next) endp = endp->next;  /* find end */  endp->next = fnode;    fnode =  do_one_spec(trailer,NULL);  if(!fnode)fprintf(stderr,"Seriously crashing. Goodbye cruel world.\n");  endp = fnode; while(endp->next) endp = endp->next;  /* find end */  endp->next = sfn->f_cooked;  sfn->f_cooked = fnode;}/****************************************************************** * Used to parse option AIX field descriptors. * Put each completed format_node onto the list starting at ->f_cooked */static const char *aix_format_parse(sf_node *sfn){  char *buf;                   /* temp copy of arg to hack on */  char *walk;  int items;  /*** sanity check and count items ***/  items = 0;  walk = sfn->sf;  /* state machine */ {  int c;  initial:    c = *walk++;    if(c=='%')    goto get_desc;    if(!c)        goto looks_ok;  /* get_text: */    items++;  get_more_text:    c = *walk++;    if(c=='%')    goto get_desc;    if(c)         goto get_more_text;    goto looks_ok;  get_desc:    items++;    c = *walk++;    if(c)         goto initial;    return "Improper AIX field descriptor.";  looks_ok:    ;  }  /*** sanity check passed ***/  buf = malloc(strlen(sfn->sf)+1);  strcpy(buf, sfn->sf);  walk = sfn->sf;    while(items--){    format_node *fnode;  /* newly allocated */    format_node *endp;   /* for list manipulation */    if(*walk == '%'){      const aix_struct *aix;      walk++;      if(*walk == '%') goto double_percent;      aix = search_aix_array(*walk);      walk++;      if(!aix){        free(buf);        return "Unknown AIX field descriptor.";      }      fnode =  do_one_spec(aix->spec, aix->head);      if(!fnode){        free(buf);        return "AIX field descriptor processing bug.";      }    } else {      int len;      len = strcspn(walk, "%");      memcpy(buf,walk,len);      if(0){double_percent:        len = 1;        buf[0] = '%';      }      buf[len] = '\0';      walk += len;      fnode = malloc(sizeof(format_node));      fnode->width = len;      fnode->name = malloc(len+1);      strcpy(fnode->name, buf);      fnode->pr = NULL;     /* checked for */      fnode->need = 0;      fnode->vendor = AIX;      fnode->flags = CF_PRINT_EVERY_TIME;      fnode->next = NULL;    }        endp = fnode; while(endp->next) endp = endp->next;  /* find end */    endp->next = sfn->f_cooked;    sfn->f_cooked = fnode;  }  free(buf);  already_parsed_format = 1;  return NULL;}/*************************************************************** * Used to parse option O lists. Option O is shared between * sorting and formatting. Users may expect one or the other. * The "broken" flag enables a really bad Unix98 misfeature. * Put each completed format_node onto the list starting at ->f_cooked */static const char *format_parse(sf_node *sfn){  char *buf;                   /* temp copy of arg to hack on */  char *sep_loc;               /* separator location: " \t,\n" */  char *walk;  const char *err;       /* error code that could or did happen */  format_node *fnode;  int items;  int need_item;  static char errbuf[80]; /* for variable-text error message */  /*** prepare to operate ***/  buf = malloc(strlen(sfn->sf)+1);  strcpy(buf, sfn->sf);    /*** sanity check and count items ***/  need_item = 1; /* true */  items = 0;  walk = buf;  do{    switch(*walk){    case ' ': case ',': case '\t': case '\n': case '\0':    /* Linux extension: allow \t and \n as delimiters */      if(need_item){        free(buf);        goto improper;      }      need_item=1;      break;    case '=':      if(broken) goto out;      /* fall through */    default:      if(need_item) items++;      need_item=0;    }  } while (*++walk);out:  if(!items){    free(buf);    goto empty;  }#ifdef STRICT_LIST  if(need_item){    /* can't have trailing deliminator */    free(buf);    goto improper;  }#else  if(need_item){    /* allow 1 trailing deliminator */    *--walk='\0';  /* remove the trailing deliminator */  }#endif  /*** actually parse the list ***/  walk = buf;  while(items--){    format_node *endp;    char *equal_loc;    char *colon_loc;    sep_loc = strpbrk(walk," ,\t\n");    /* if items left, then sep_loc is not in header override */    if(items && sep_loc) *sep_loc = '\0';    equal_loc = strpbrk(walk,"=");    if(equal_loc){   /* if header override */      *equal_loc = '\0';      equal_loc++;    }    colon_loc = strpbrk(walk,":");    if(colon_loc){   /* if width override */      *colon_loc = '\0';      colon_loc++;      if(strspn(colon_loc,"0123456789") != strlen(colon_loc) || *colon_loc=='0' || !*colon_loc){        free(buf);        goto badwidth;      }    }    fnode =  do_one_spec(walk,equal_loc);    if(!fnode){      if(!*errbuf){  /* if didn't already create an error string */        snprintf(          errbuf,          sizeof(errbuf),          "Unknown user-defined format specifier \"%s\".",          walk        );      }      free(buf);      goto unknown;    }    if(colon_loc){      if(fnode->next){        free(buf);        goto notmacro;      }      // FIXME: enforce signal width to 8, 9, or 16 (grep: SIGNAL wide_signals)      fnode->width = atoi(colon_loc); // already verified to be a number    }    endp = fnode; while(endp->next) endp = endp->next;  /* find end */    endp->next = sfn->f_cooked;    sfn->f_cooked = fnode;    walk = sep_loc + 1; /* point to next item, if any */  }  free(buf);  already_parsed_format = 1;  return NULL;  /* errors may cause a retry looking for AIX format codes */  if(0) unknown:  err=errbuf;  if(0) empty:    err="Empty format list.";  if(0) improper: err="Improper format list.";  if(0) badwidth: err="Column widths must be unsigned decimal numbers.";  if(0) notmacro: err="Can't set width for a macro (multi-column) format specifier.";  if(strchr(sfn->sf,'%')) err = aix_format_parse(sfn);  return err;}/****************  Parse single sort specifier *******************/static sort_node *do_one_sort_spec(const char *spec){  const format_struct *fs;  int reverse = 0;  if(*spec == '-'){    reverse = 1;    spec++;  }  fs = search_format_array(spec);  if(fs){    sort_node *thisnode;    thisnode = malloc(sizeof(sort_node));    thisnode->sr = fs->sr;    thisnode->need = fs->need;    thisnode->reverse = reverse;    thisnode->next = NULL;    return thisnode;  }  return NULL;   /* bad, spec not found */}/************************************************************** * Used to parse long sorting options. * Put each completed sort_node onto the list starting at ->s_cooked */static const char *long_sort_parse(sf_node *sfn){  char *buf;                   /* temp copy of arg to hack on */  char *sep_loc;               /* separator location: " \t,\n" */  char *walk;  sort_node *snode;  int items;  int need_item;  /*** prepare to operate ***/  buf = malloc(strlen(sfn->sf)+1);  strcpy(buf, sfn->sf);    /*** sanity check and count items ***/  need_item = 1; /* true */  items = 0;  walk = buf;  do{    switch(*walk){    case ' ': case ',': case '\t': case '\n': case '\0':      if(need_item){        free(buf);        return "Improper sort list";      }      need_item=1;      break;    default:      if(need_item) items++;      need_item=0;    }  } while (*++walk);  if(!items){    free(buf);    return "Empty sort list.";  }#ifdef STRICT_LIST  if(need_item){    /* can't have trailing deliminator */    free(buf);    return "Improper sort list.";  }#else  if(need_item){    /* allow 1 trailing deliminator */    *--walk='\0';  /* remove the trailing deliminator */  }#endif  /*** actually parse the list ***/  walk = buf;  while(items--){    sort_node *endp;    sep_loc = strpbrk(walk," ,\t\n");    if(sep_loc) *sep_loc = '\0';    snode = do_one_sort_spec(walk);    if(!snode){      free(buf);      return "Unknown sort specifier.";    }    endp = snode; while(endp->next) endp = endp->next;  /* find end */    endp->next = sfn->s_cooked;    sfn->s_cooked = snode;    walk = sep_loc + 1; /* point to next item, if any */  }  free(buf);  already_parsed_sort = 1;  return NULL;}/************ pre-parse short sorting option *************//* Errors _must_ be detected so that the "O" option can try to * reparse as formatting codes. */static const char *verify_short_sort(const char *arg){  const char all[] = "CGJKMNPRSTUcfgjkmnoprstuvy+-";  char checkoff[256];  int i;  const char *walk;  int tmp;  if(strspn(arg,all) != strlen(arg)) return "Bad sorting code.";  for(i=256; i--;) checkoff[i] = 0;  walk = arg;  for(;;){    tmp = *walk;    switch(tmp){    case '\0':      return NULL;   /* looks good */    case '+':    case '-':      tmp = *(walk+1);      if(!tmp || tmp=='+' || tmp=='-') return "Bad sorting code.";      break;    case 'P':      if(forest_type) return "PPID sort and forest output conflict.";      /* fall through */    default:      if(checkoff[tmp]) return "Bad sorting code.";   /* repeated */      /* ought to check against already accepted sort options */      checkoff[tmp] = 1;      break;    }    walk++;  }}/************ parse short sorting option *************/static const char *short_sort_parse(sf_node *sfn){  int direction = 0;  const char *walk;  int tmp;  sort_node *snode;  sort_node *endp;  const struct shortsort_struct *ss;  walk = sfn->sf;  for(;;){    tmp = *walk;    switch(tmp){    case '\0':      already_parsed_sort = 1;      return NULL;    case '+':      direction = 0;      break;    case '-':      direction = 1;      break;    default:      ss = search_shortsort_array(tmp);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品一二三四区| 中文在线免费一区三区高中清不卡| 国产91富婆露脸刺激对白| 天天影视色香欲综合网老头| 亚洲人妖av一区二区| 中文字幕一区二区不卡 | 欧美一区二区三区免费视频| av动漫一区二区| 在线观看国产91| 欧美一区二区三区免费视频| 精品处破学生在线二十三| 精品国产凹凸成av人网站| 精品久久久久久最新网址| 精品处破学生在线二十三| 国产精品久久久久毛片软件| 亚洲综合在线五月| 免费av网站大全久久| 国产成a人亚洲| 欧美日韩大陆在线| 久久久噜噜噜久久人人看| 一色屋精品亚洲香蕉网站| 亚洲国产一区二区视频| 欧美三级电影在线看| 久草这里只有精品视频| 亚洲国产精品久久人人爱蜜臀| 99精品欧美一区| 91成人免费在线| 韩国中文字幕2020精品| 成人在线一区二区三区| 色婷婷综合中文久久一本| 欧美色综合网站| 国产欧美一区二区在线| 综合久久久久综合| 国产精品成人网| 一区二区三区精品久久久| 亚洲成人自拍一区| 亚洲国产cao| 成人激情开心网| 欧美电视剧免费全集观看| www亚洲一区| 五月天丁香久久| 国产suv精品一区二区6| 日韩视频在线永久播放| 怡红院av一区二区三区| 国产在线精品一区二区夜色| 一本大道久久a久久综合| 久久精子c满五个校花| 免费在线观看一区二区三区| 91视频观看视频| 亚洲男人的天堂在线aⅴ视频| 激情成人综合网| 久久综合99re88久久爱| 老司机午夜精品99久久| 91精品国产欧美一区二区18| 亚洲第一精品在线| 欧美猛男gaygay网站| 午夜伊人狠狠久久| 欧美日韩国产成人在线91| 日韩1区2区3区| 欧美一区二区三区公司| 麻豆精品一二三| 久久亚洲精品国产精品紫薇| 久久国产综合精品| 亚洲国产精品黑人久久久| 不卡影院免费观看| 亚洲v精品v日韩v欧美v专区 | 日一区二区三区| 欧美大肚乱孕交hd孕妇| 国产一区二区成人久久免费影院| 国产午夜精品久久久久久久 | 一区二区三区波多野结衣在线观看| 99国产精品国产精品久久| 一区二区在线观看免费视频播放| 色女孩综合影院| 日本麻豆一区二区三区视频| 久久久久88色偷偷免费| 欧美日韩在线播放三区| 韩国毛片一区二区三区| 亚洲精品久久久久久国产精华液| 6080日韩午夜伦伦午夜伦| 国产sm精品调教视频网站| 国产精品久久福利| 色视频成人在线观看免| 国产精品影视天天线| 亚洲欧美一区二区在线观看| 4438x成人网最大色成网站| 国产成人鲁色资源国产91色综 | 亚洲卡通欧美制服中文| 日韩欧美国产午夜精品| 欧美日韩国产一区| 欧美伊人久久大香线蕉综合69 | 日韩欧美在线网站| 色婷婷亚洲综合| 91久久免费观看| 成人91在线观看| 91免费视频观看| 高清国产午夜精品久久久久久| 另类欧美日韩国产在线| 日韩高清不卡在线| 亚洲国产成人av网| 伊人夜夜躁av伊人久久| 一区二区高清在线| ...xxx性欧美| 亚洲成av人片在线| 日本欧美在线观看| 极品少妇一区二区三区精品视频| 日韩高清不卡一区| 国产一区二区三区在线看麻豆| 男男视频亚洲欧美| 国产精品一区二区不卡| 99久久综合99久久综合网站| 波波电影院一区二区三区| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 国产精品色一区二区三区| 国产三级一区二区三区| 亚洲乱码中文字幕综合| 天天综合色天天| 国产suv精品一区二区883| 色噜噜久久综合| 精品人伦一区二区色婷婷| 国产无人区一区二区三区| 国产亚洲一区字幕| 国产精品网友自拍| 视频一区二区欧美| 色妞www精品视频| 久久久久久久网| 亚洲电影你懂得| av男人天堂一区| 国产日产欧美精品一区二区三区| 久久久久国产精品人| 久久美女高清视频| 亚洲超丰满肉感bbw| 99久久久无码国产精品| 国产日韩精品视频一区| 喷水一区二区三区| 97精品视频在线观看自产线路二| 精品国产一区二区三区久久久蜜月| 一区二区三区日本| 欧美午夜精品久久久久久超碰| 亚洲国产成人午夜在线一区| 五月激情综合色| 91精品在线观看入口| 久久成人av少妇免费| 日本一区二区三区国色天香| 成人激情免费网站| 亚洲一区二区三区不卡国产欧美| 欧美在线观看一区| 精品一区二区免费| 亚洲日本电影在线| 欧美大片在线观看| 91麻豆123| 国产精选一区二区三区| 亚洲人精品午夜| 精品欧美一区二区久久| 99久久婷婷国产精品综合| 免费人成精品欧美精品| 国产精品不卡视频| 国产成人av电影在线观看| 激情久久五月天| 91精品福利在线一区二区三区| 国产精品人成在线观看免费 | 欧美福利电影网| 国产黄色成人av| 亚洲v中文字幕| 精品国产污网站| 欧美日韩夫妻久久| 成人va在线观看| 国产精品一区免费视频| 亚洲成年人网站在线观看| 亚洲免费视频中文字幕| 日本一区二区三区视频视频| 日韩三级.com| 欧美xxxxx裸体时装秀| 欧美日韩精品一区二区三区| 99久久婷婷国产| 91视频观看视频| 91极品美女在线| 在线欧美日韩精品| 97久久超碰精品国产| 99国产精品久久久久久久久久| 成人午夜激情影院| 成人少妇影院yyyy| www.色综合.com| 一本色道久久综合亚洲aⅴ蜜桃 | 91精品欧美综合在线观看最新| 欧美视频在线不卡| 日韩视频123| 国产精品三级视频| 亚洲黄色小视频| 欧美aaa在线| 成人免费毛片aaaaa**| 一本色道亚洲精品aⅴ| 欧美日韩一级片在线观看| 精品久久五月天| 国产精品国产自产拍高清av| 亚洲精品国产精华液| 日韩电影在线看| 成人中文字幕合集| 91精品婷婷国产综合久久| 久久久91精品国产一区二区精品 |