{"id":272,"date":"2016-07-18T12:47:32","date_gmt":"2016-07-18T12:47:32","guid":{"rendered":"http:\/\/emacslisp.com\/?p=272"},"modified":"2016-07-18T12:51:37","modified_gmt":"2016-07-18T12:51:37","slug":"tcc-tcc-string-index-from-char-str1-to-strlen","status":"publish","type":"post","link":"http:\/\/emacslisp.com\/?p=272","title":{"rendered":"TCC &#8211; string index from char str[1] to str[len]"},"content":{"rendered":"<p>Check TokenSym declaration firstly, TokenSym is to store a single token info.<\/p>\n<pre lang=\"c\" line=\"1\"> \r\ntypedef struct TokenSym {\r\n    struct TokenSym *hash_next;\r\n    struct Sym *sym_define; \/* direct pointer to define *\/\r\n    struct Sym *sym_label; \/* direct pointer to label *\/\r\n    struct Sym *sym_struct; \/* direct pointer to structure *\/\r\n    struct Sym *sym_identifier; \/* direct pointer to identifier *\/\r\n    int tok; \/* token number *\/\r\n    int len;\r\n    char str[1];\r\n} TokenSym;\r\n\r\n\r\n<\/pre>\n<p>when malloc memory, it will alloc TokenSym+len.<\/p>\n<pre lang=\"c\" line=\"1\"> \r\nts = tcc_malloc(sizeof(TokenSym) + len);\r\n<\/pre>\n<p>the later on, memcpy copy str with len to str memory.<br \/>\nOf course, str[1] will be out of range, but extra len memory is appended.<br \/>\n<strong>therefore, str[1] is expanded  to str[len].<\/p>\n<p>This is very popular within TCC&#8217;s struct declaration.<\/strong><\/p>\n<pre lang=\"c\" line=\"1\"> \r\nmemcpy(ts->str, str, len);\r\nts->str[len] = '\\0';\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Check TokenSym declaration firstly, TokenSym is to store a single token info. typedef struct TokenSym { struct TokenSym *hash_next; struct Sym *sym_define; \/* direct pointer to define *\/ struct Sym *sym_label; \/* direct pointer to label *\/ struct Sym *sym_struct; \/* direct pointer to structure *\/ struct Sym *sym_identifier; \/* direct pointer to identifier *\/ [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,10],"tags":[],"class_list":["post-272","post","type-post","status-publish","format-standard","hentry","category-tcc-","category-tcc-source-code-analysis"],"_links":{"self":[{"href":"http:\/\/emacslisp.com\/index.php?rest_route=\/wp\/v2\/posts\/272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/emacslisp.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/emacslisp.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/emacslisp.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/emacslisp.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=272"}],"version-history":[{"count":5,"href":"http:\/\/emacslisp.com\/index.php?rest_route=\/wp\/v2\/posts\/272\/revisions"}],"predecessor-version":[{"id":277,"href":"http:\/\/emacslisp.com\/index.php?rest_route=\/wp\/v2\/posts\/272\/revisions\/277"}],"wp:attachment":[{"href":"http:\/\/emacslisp.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/emacslisp.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=272"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/emacslisp.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}