상대경로를 절대 경로로 바꾸어 주는 함수

익명 사용자의 이미지

상대경로를 절대 경로로 바꾸어 주는 함수 입니다.
검증이 안되어 버그가 있을지도 모릅니다.

#include <stdio.h>
#include <malloc.h>
#include <string.h>

typedef struct path_element_t{
  char *element;
  struct path_element_t *prev;
  struct path_element_t *next;
} path_element;

int rel2abspath(char *,char *,char **);

int main(int argc,char **argv){

  char *buf=NULL;

  if(argc==3){

    rel2abspath(argv[1],argv[2],&buf);
    printf("RESULT: %s\n",buf);
    free(buf);

  }else{

    printf("Usage: %s [abs_path] [rel_path]\n",argv[0]);
    printf("\nExample: %s 'http://unstable.elemental.com/mozilla/build/latest/mozilla/caps/dox/nsBasePrincipal_8cpp.html#a0' '.././../////./../'\n",argv[0]);
    return 1;

  }

  return 0;

}

int rel2abspath(char *abs_path,char *rel_path,char **buf){

  char *path_n=NULL;
  char *abs_path_n=NULL;
  char *first_sep=NULL;
  char *abs_second_sep=NULL;
  char *rel_second_sep=NULL;
  char *last_offset=NULL;
  char *temp_path=NULL;
  char *abs_doc=NULL;
  char *rel_doc=NULL;
  char chr;
  int len=0;
  int count=0;
  path_element *head=NULL,*cur=NULL,*prev=NULL,*temp=NULL;

  //printf("%s\n",abs_path);
  //printf("%s\n",rel_path);

  if((first_sep=(char *)strchr((const char *)abs_path,(int)':'))){

    if(first_sep[1]=='/'&&first_sep[2]=='/'){

      first_sep+=3;

      if((first_sep=(char *)strchr((const char *)first_sep,(int)'/'))){

        ++first_sep;

      }else{

        //printf("Error.Not found/.\n");
        return 1;

      }

    }else{

      //printf("Error.Not found //.\n");
      return 2;

    }

  }else{

    //printf("Error.Not found :.\n");
    return 3;

  }

  if((abs_second_sep=(char *)strrchr((const char *)first_sep,(int)'/'))){

    ++abs_second_sep;
    abs_doc=abs_second_sep;

    //printf("%s\n",abs_second_sep);

    len=abs_second_sep-first_sep;

    if((rel_second_sep=(char *)strrchr((const char *)rel_path,(int)'/'))){
      len+=strlen(rel_path);
    }

    path_n=(char *)malloc(sizeof(char)*len+1);
    memcpy(path_n,first_sep,abs_second_sep-first_sep);

    if(rel_second_sep){
      rel_doc=rel_second_sep+1;
      memcpy(path_n+(abs_second_sep-first_sep),rel_path,rel_second_sep-rel_path);
    }else{
      rel_doc=rel_path;
    }

    path_n[len]='\0';

    //printf("%s\n",path_n);

  }else{

    //printf("Error.Not found /.\n");
    return 4;

  }

  last_offset=path_n;

  while('\0'!=(chr=*(path_n+count))){

    switch(chr){

      case '/':

        cur=(path_element *)malloc(sizeof(path_element));
        memset(cur,0x0,sizeof(path_element));
        cur->next=NULL;
        if(head==NULL){
          head=cur;
        }else{
          prev->next=cur;
        }
        cur->prev=prev;
        prev=cur;

        len=sizeof(char)*((path_n+count)-last_offset);
        cur->element=(char *)malloc(sizeof(char)*len+1);
        memcpy(cur->element,last_offset,len);
        cur->element[len]='\0';
        //printf("%s\n",cur->element);
        
        last_offset=path_n+count+1;

        break;

      default:

    }

    ++count;

  }

  if((path_n+count)-last_offset>0){

    cur=(path_element *)malloc(sizeof(path_element));
    memset(cur,0x0,sizeof(path_element));
    cur->next=NULL;
    if(head==NULL){
      head=cur;
    }else{
      prev->next=cur;
    }
    cur->prev=prev;
    prev=cur;

    len=sizeof(char)*((path_n+count)-last_offset);
    cur->element=(char *)malloc(sizeof(char)*len+1);
    memcpy(cur->element,last_offset,len);
    cur->element[len]='\0';
    //printf("%s\n",cur->element);

  }

  cur=head;
  while(cur!=NULL){

    temp=cur;

    if(memcmp(cur->element,".",1)==0&&strlen(cur->element)==1){

      if(cur->prev){
        (cur->prev)->next=cur->next;
      }

      if(cur->next){
        (cur->next)->prev=cur->prev;
      }
      cur=cur->prev;
      free(temp);

    }else if(memcmp(cur->element,"..",2)==0&&strlen(cur->element)==2){

      if(cur->prev){
        ((cur->prev)->prev)->next=cur->next;
      }
      
      if(cur->next){
        (cur->next)->prev=(cur->prev)->prev;
      }
      cur=(cur->prev)->prev;
      free(temp->prev);
      free(temp);

    }

    cur=cur->next;

  }

  cur=head;
  while(cur!=NULL){

    temp=cur;

    if(strlen(cur->element)==0){

      (cur->prev)->next=cur->next;

      if(cur->next){
        (cur->next)->prev=cur->prev;
      }
      cur=cur->prev;
      free(temp);

    }

    cur=cur->next;

  }
  

  cur=head;
  len=0;
  while(cur!=NULL){

    //printf("0x%08x 0x%08x 0x%08x %s\n",cur->prev,cur,cur->next,cur->element);
    len+=strlen(cur->element);
    ++len;
     
    cur=cur->next;

  }

  len+=first_sep-abs_path;

  if(rel_doc==NULL||strlen(rel_doc)==0){

    len+=strlen(abs_doc);

  }else{

    len+=strlen(rel_doc);

  }

  abs_path_n=(char *)malloc(len+1);
  temp_path=abs_path_n;
  memcpy(abs_path_n,abs_path,first_sep-abs_path);
  abs_path_n+=(first_sep-abs_path);

  cur=head;
  while(cur!=NULL){

    memcpy(abs_path_n,cur->element,strlen(cur->element));
    abs_path_n+=strlen(cur->element);
    abs_path_n[0]='/';
    ++abs_path_n;

    cur=cur->next;

  }

  if(rel_doc==NULL||strlen(rel_doc)==0){

    memcpy(abs_path_n,abs_doc,strlen(abs_doc));
    abs_path_n+=strlen(abs_doc);

  }else{

    memcpy(abs_path_n,rel_doc,strlen(rel_doc));
    abs_path_n+=strlen(rel_doc);

  }

  abs_path_n[0]='\0';
  (*buf)=temp_path;

  return 0;

}
Forums: 
익명 사용자의 이미지

삭제가 안되네요..삭제좀 부탁 드리겠습니다...버그가 수두룩 하네요.

ed.netdiver의 이미지

ㅎㅎ, 손님모드의 단점^^;
하지만, 버그없는 코드를 자랑하는것만이 아니라, fix해나가는 과정도
같이 해나가보자는 것도 이 코너의 목적이기도 하답니다^^;

--------------------------------------------------------------------------------
\(´∇`)ノ \(´∇`)ノ \(´∇`)ノ \(´∇`)ノ
def ed():neTdiVeR in range(thEeArTh)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.