Giter Club home page Giter Club logo

c4go's People

Contributors

alebcay avatar alexandear avatar bradleyjkemp avatar corebreaker avatar crgimenes avatar crvv avatar elliotchance avatar jnjackins avatar jorbs avatar konstantin8105 avatar lestrrat avatar pravj avatar rjalfa avatar souvikmaji avatar tboztuna avatar timothygk avatar tjyang avatar utkarshgupta-cs avatar x-tyger avatar xoviat avatar xyproto avatar yulvil avatar zoeyfyi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

c4go's Issues

CPP: experimantal

Create ast for cpp code:

clang++ -E -C cpp2.cpp  > y.cpp
clang++ -Xclang -ast-dump -fsyntax-only y.cpp

Array to slice problem

Go code:

type behavior struct {
...
	innodefilename   [2048]byte
...
}

// problem here
noarch.Strncpy(b[0].innodefilename, argv[i], int(uint32(2048-1)))

AST:

|-CallExpr 0x2216900 <line:3492:7, col:51> 'char *'
| |-ImplicitCastExpr 0x22168e8 <col:7> 'char *(*)(char *, const char *, unsigned long)' <FunctionToPointerD
ecay>
| | `-DeclRefExpr 0x22166d8 <col:7> 'char *(char *, const char *, unsigned long)' Function 0x2162110 'strncpy' 'char *(char *, const char *, unsigned long)'
| |-ImplicitCastExpr 0x2216940 <col:15, col:18> 'char *' <ArrayToPointerDecay>
| | `-MemberExpr 0x2216740 <col:15, col:18> 'char [2048]' lvalue ->innodefilename 0x21c65d8
| |   `-ImplicitCastExpr 0x2216728 <col:15> 'struct behavior *' <LValueToRValue>
| |     `-DeclRefExpr 0x2216700 <col:15> 'struct behavior *' lvalue ParmVar 0x220aae0 'b' 'struct behavior *'
| |- ...

Type of b[0].innodefilename is array [2048]byte, but in function need a slice []byte

F: malloc

test

struct MyNums {
    char name[100];
    int size;
    int numbers[];
};
void test_array_struct()
{
    int n = 10, k;
    struct MyNums *pnt;
    pnt = malloc(sizeof(struct MyNums) + n * sizeof(int));
    strcpy(pnt->name, "Натуральные числа");
    pnt->size = n;
    for (k = 0; k < pnt->size; k++)
        pnt->numbers[k] = k + 1;
	is_eq(pnt->numbers[2],3);
	is_eq(pnt->numbers[5],6);
}

math.expf

Add test and implementation on Go for function math.h expf
Description: https://en.cppreference.com/w/c/numeric/math/exp
File for test code add : c4go/tests/math.c
Example see #155
Example of test, see

c4go/tests/math.c

Lines 218 to 230 in be1760b

diag("exp");
is_eq(exp(0), 1);
is_eq(exp(1), 2.7182818284590450908);
is_eq(exp(-1), 0.36787944117144233402);
is_eq(exp(0.5), 1.6487212707001281942);
// https://github.com/golang/go/issues/20539
disabled(is_inf(exp(1.23e300), 1));
is_eq(exp(-1.23e-300), 1);
is_eq(exp(M_PI), 23.140692632779266802);
is_eq(exp(M_E), 15.154262241479262485);
is_inf(exp(INFINITY), 1);
is_eq(exp(-INFINITY), 0);
is_nan(exp(NAN));

Version

Add version generate example in README.

Example

Fix: Cannot casting {int -> (noreturn)}

#include <stdio.h>

int main (int argc, char *argv[]){
  FILE *fp;
  int nchars, nwords, nlines;
  int lastnblank;    /* 0 iff the last character was a space */
  char c;

  if(argc!=2){
    printf("Usage: %s filename\n", argv[0]);
    exit(0);
  }
  if((fp=fopen(argv[1],"r"))==NULL){
    perror("fopen");
    exit(0); // <<--- PROBLEM HERE
  }
}
// Warning (*ast.CallExpr):  /home/konstantin/go/src/github.com/Konstantin8105/c4go-rating/testdata/SingleCcode/counts.c:18 :Cannot casting {int -> (noreturn)}. err = Cannot resolve type '(noreturn)' : Cannot separate function '(noreturn)' : Cannot parse function '(noreturn)' : Don't found '(' in type : (noreturn)
|   | | `-CallExpr 0x33a7680 <line:18:5, col:11> 'void'
|   | |   |-ImplicitCastExpr 0x33a7668 <col:5> 'void (*)(int) __attribute__((noreturn))' <FunctionToPointerDecay>
|   | |   | `-DeclRefExpr 0x33a75f0 <col:5> 'void (int) __attribute__((noreturn))' Function 0x33a74e0 'exit' 'void (int) __attribute__((noreturn))'
|   | |   `-IntegerLiteral 0x33a7618 <col:10> 'int' 0

F: AST

// AST Error : Cannot parse line: `VarDecl 0x3ec9368 parent 0x3dcaaf0 prev 0x3ec4088 <col:4, col:15> 
col:15 used CBLAS_CallFromC 'int' extern`. could not match regexp with string

// AST Error : ^(?P<address>[0-9a-fx]+) (?:prev (?P<prev>0x[0-9a-f]+) )?(?:parent (?P<parent>0x[0-9a-
f]+) )?<(?P<position>.*)>(?P<position2> .+:\d+)?(?P<used> used)?(?P<referenced> referenced)?(?P<name>
 \w+)? '(?P<type>.+?)'(?P<type2>:'.*?')?(?P<extern> extern)?(?P<static> static)?(?P<cinit> cinit)?(?P
<register> register)?[\s]*$

parse expression

		R1o = ( (2.0*w1+w2)*x1*x1 - (w1+2.0*w2)*x2*x2 + 
			 3.0*(w1+w2)*Ln*(x2-x1) - (w1-w2)*x1*x2 ) / (6.0*Ln);
		R2o = ( (w1+2.0*w2)*x2*x2 + (w1-w2)*x1*x2 -
			(2.0*w1+w2)*x1*x1 ) / (6.0*Ln);

		f01 = (  3.0*(w2+4.0*w1)*x1*x1*x1*x1 -  3.0*(w1+4.0*w2)*x2*x2*x2*x2
		      - 15.0*(w2+3.0*w1)*Ln*x1*x1*x1 + 15.0*(w1+3.0*w2)*Ln*x2*x2*x2
		      -  3.0*(w1-w2)*x1*x2*(x1*x1 + x2*x2)
		      + 20.0*(w2+2.0*w1)*Ln*Ln*x1*x1 - 20.0*(w1+2.0*w2)*Ln*Ln*x2*x2
		      + 15.0*(w1-w2)*Ln*x1*x2*(x1+x2)
		      -  3.0*(w1-w2)*x1*x1*x2*x2 - 20.0*(w1-w2)*Ln*Ln*x1*x2 ) / 360.0;

F: printf %u

Example of C code:

printf("Символьный литерал \'A\':\t%d\n", sizeof('A'));

F: AST panic

// AST Error : Cannot parse line: `VarDecl 0x28f8490 <col:3, col:43> col:19 used a 'char *' register cinit`. could not match regexp with string
// AST Error : ^(?P<address>[0-9a-fx]+) (?:parent (?P<parent>0x[0-9a-f]+) )?(?:prev (?P<prev>0x[0-9a-f]+) )?<(?P<position>.*)>(?P<position2> .+:\d+)?(?P<used> used)?(?P<referenced> referenced)?(?P<name> \w+)? '(?P<type>.+?)'(?P<type2>:'.*?')?(?P<extern> extern)?(?P<static> static)?(?P<cinit> cinit)?(?P<register> register)?[\s]*$
// AST Error : 0x28f8490 <col:3, col:43> col:19 used a 'char *' register cinit

F: struct declaration

struct s* p = NULL; // tag naming an unknown struct declares it
struct s { int a; }; // definition for the struct pointed to by p
void g(void)
{
    struct s; // forward declaration of a new, local struct s
              // this hides global struct s until the end of this block
    struct s *p;  // pointer to local struct s
                  // without the forward declaration above,
                  // this would point at the file-scope s
    struct s { char* p; }; // definitions of the local struct s
}

see http://en.cppreference.com/w/c/language/struct

Fix: panic

/* number.c -- Reading and writing integer as character sequences .
 *             Notice that the base for the digits is the constant
 *             BASE that I have chosen to be 10. Of course, you
 *             use a different value. You might even chose to
 *             have the base as a function parameter.
 */

#include <stdio.h>
#include <assert.h>

#define BASE 10

// a is a string. cursor is a position in a such that a[cursor] is a digit.
// Return the integer value represented by the longest sequence of digits
// in a starting at cursor. On exit cursor will be at the first position
// in a that does not contain a digit. Note that we assume that the base for 
// the number is 10. 
int getNumberToken(char a[], int *cursor)
{
  int value = 0;
  assert((*cursor) >= 0 && (*cursor) < strlen(a));
  do
    {
	value = value*BASE + (int)(a[*cursor]) - (int)('0');
	(*cursor)++;
    }
  while (isdigit(a[*cursor]));
  return value;
}

// value is a positive integer. a is a character array with n positions.
// Store in a as a '\0' terminated string the representation of value as
// a string in base BASE.
void putNumberToken(int value, char a[], int n)
{
  int k;
  int h, temp;
  assert(value >= 0 && n > 0);
  // We collect the desired string in reverse order
  for (k = 0; k < n-1; ++k)
    {
      a[k] = (char)(value%BASE + (int)'0');
      value = value/BASE;
      if (value == 0) break;
    }
  if (k == 0)     // If value was 0 we still return a '0'
    a[k] = '0';
  a[++k] = '\0';
  // Now we put the string in the right order
  for (h = 0; h < k/2; ++h)
    {
      temp = a[h];
      a[h] = a[k-1-h];
      a[k-1-h] = temp;
    }
}

void main (void)
{
  char s[] = "5432";
  int k = 0;
  int val = getNumberToken(s, &k);
  char outs[256];

  printf("val = %d, k = %d\n", val, k);
  putNumberToken(val, outs, 256);
  printf("val = %s\n", outs);
}
panic: Type *ast.CallExpr is not implemented in createIfWithNotConditionAndBreak

goroutine 1 [running]:
github.com/Konstantin8105/c4go/transpiler.createIfWithNotConditionAndBreak(0x7c9ee0, 0xc4203f4af0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/transpiler/branch.go:609 +0xa26
github.com/Konstantin8105/c4go/transpiler.transpileDoStmt(0xc4201974a0, 0xc4200de3c0, 0xc4204daad0, 0xc4204daae8, 0x7ca2a0, 0xc4201974a0, 0x3, 0xc4200001a0, 0xc4203f9b00, 0xc420021300, ...)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/transpiler/branch.go:556 +0x3fb
github.com/Konstantin8105/c4go/transpiler.transpileToStmt(0x7ca2a0, 0xc4201974a0, 0xc4200de3c0, 0x0, 0x0, 0x7fe0f0, 0x0, 0x0, 0x7fe0f0, 0x0, ...)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/transpiler/transpiler.go:317 +0x102c
github.com/Konstantin8105/c4go/transpiler.transpileToStmts(0x7ca2a0, 0xc4201974a0, 0xc4200de3c0, 0x7fe0f0, 0x0, 0x0, 0x0, 0x0)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/transpiler/transpiler.go:266 +0x13b
github.com/Konstantin8105/c4go/transpiler.transpileCompoundStmt(0xc4200da150, 0xc4200de3c0, 0xc42057ed80, 0xc42057ed98, 0x7ca020, 0xc4200da150, 0x3, 0xc4200001a0, 0xc4203f8dc0, 0xc420021300, ...)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/transpiler/scope.go:53 +0x61e
github.com/Konstantin8105/c4go/transpiler.transpileToStmt(0x7ca020, 0xc4200da150, 0xc4200de3c0, 0x0, 0x0, 0x7fe0f0, 0x0, 0x0, 0x7fe0f0, 0x0, ...)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/transpiler/transpiler.go:334 +0xed5
github.com/Konstantin8105/c4go/transpiler.transpileToStmts(0x7ca020, 0xc4200da150, 0xc4200de3c0, 0x7fe0f0, 0x0, 0x0, 0x0, 0x0)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/transpiler/transpiler.go:266 +0x13b
github.com/Konstantin8105/c4go/transpiler.transpileToBlockStmt(0x7ca020, 0xc4200da150, 0xc4200de3c0, 0xc4203fd100, 0x3, 0xc420161540, 0x2, 0x2, 0x0, 0x0, ...)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/transpiler/scope.go:71 +0x46
github.com/Konstantin8105/c4go/transpiler.transpileFunctionDecl(0xc4200e5ad0, 0xc4200de3c0, 0x0, 0x0, 0x0, 0x0, 0x0)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/transpiler/functions.go:119 +0x26fe
github.com/Konstantin8105/c4go/transpiler.transpileToNode(0x7ca5e0, 0xc4200e5ad0, 0xc4200de3c0, 0x0, 0x0, 0x0, 0x0, 0x0)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/transpiler/transpiler.go:434 +0x548
github.com/Konstantin8105/c4go/transpiler.transpileTranslationUnitDecl(0xc4200de3c0, 0xc420188aa0, 0xc42057f688, 0x7cb0e0, 0xc420188aa0, 0xc4200de3c0, 0x0)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/transpiler/translation_unit.go:40 +0x217
github.com/Konstantin8105/c4go/transpiler.transpileToNode(0x7cb0e0, 0xc420188aa0, 0xc4200de3c0, 0x0, 0x0, 0x0, 0x0, 0x0)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/transpiler/transpiler.go:431 +0xe1b
github.com/Konstantin8105/c4go/transpiler.TranspileAST(0x7ffdbd46bf86, 0x23, 0x6a2966, 0x4, 0xc4200de3c0, 0x7cb0e0, 0xc420188aa0, 0x12000, 0xc420198280)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/transpiler/transpiler.go:33 +0x212
main.generateGoCode(0x0, 0xc42008a040, 0x1, 0x1, 0x0, 0x0, 0x0, 0x7ffdbd46bf86, 0x23, 0x6a2966, ...)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/main.go:347 +0x725
main.Start(0x0, 0xc42008a040, 0x1, 0x1, 0x0, 0x0, 0x0, 0x7ffdbd46bf86, 0x23, 0x6a2966, ...)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/main.go:219 +0x285
main.runCommand(0xc4200001a0)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/main.go:488 +0x4df
main.main()
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/main.go:415 +0x22

Optimization for program.(*Program).GetComments

Showing top 40 nodes out of 120
      flat  flat%   sum%        cum   cum%
    11.63s 33.55% 33.55%     11.63s 33.55%  memeqbody
    10.43s 30.09% 63.65%     24.55s 70.83%  github.com/Konstantin8105/c4go/program.(*Program).GetComments
     2.65s  7.65% 71.29%      2.65s  7.65%  runtime.memequal
     0.67s  1.93% 73.23%      1.22s  3.52%  regexp.(*machine).tryBacktrack

See #207

Error in sputc Mac OSX.

Compiler message: syntax error: unexpected =, expecting )

in function sputc
/ __sputc - transpiled function from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/stdio.h:264

The syntax error is in this line:
}())[0] = uint8(_c)))

The whole function:
func __sputc(_c int, _p *noarch.File) (c4goDefaultReturn int) {
if func() int {
tempVar := &_p[0]._w
*tempVar --
defer func() {
}()
return *tempVar
}() >= 0 || _p[0]._w >= _p[0]._lbfsize && int(byte(_c)) != int('\n') {
return int(((func() []uint8 {
tempVar := &_p[0]._p
defer func() {
*tempVar ++
}()
return *tempVar
}())[0] = uint8(_c)))
// Warning (*ast.MemberExpr): /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/stdio.h:265 :cannot determine type for LHS 'FILE *', will use 'void *' for all fields. Is lvalue = true. n.Name = _w
// Warning (*ast.MemberExpr): /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/stdio.h:265 :cannot determine type for LHS 'FILE *', will use 'void *' for all fields. Is lvalue = true. n.Name = _lbfsize
// Warning (*ast.MemberExpr): /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/stdio.h:265 :cannot determine type for LHS 'FILE *', will use 'void *' for all fields. Is lvalue = true. n.Name = _w
// Warning (*ast.MemberExpr): /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/stdio.h:265 :cannot determine type for LHS 'FILE *', will use 'void *' for all fields. Is lvalue = true. n.Name = _lbfsize
// Warning (*ast.MemberExpr): /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/stdio.h:266 :cannot determine type for LHS 'FILE *', will use 'void *' for all fields. Is lvalue = true. n.Name = _p
} else {
return (__swbuf(_c, _p))
}
return
}

Paren

Remove paren
For example: 'var I int = ((((6))))'

Fix: panic CharacterLiteral

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    printf("Размер (в байтах) для типов данных:\n\n");
    printf("Тип данных int: \t%lu\n", sizeof(int));
    printf("Тип данных char: \t%lu\n", sizeof(char));
    printf("Символьный литерал \'A\':\t%lu\n", sizeof('A'));
    printf("Тип данных float:\t%lu\n", sizeof(float));
    printf("Тип данных double:\t%lu\n", sizeof(double));
    printf("Текст \"мой текст\":\t%lu\n", sizeof("мой текст"));

    return 0;
}
panic: cannot do unary on: &ast.CharacterLiteral{Addr:0x2c7c9e0, Pos:ast.Position{File:"/home/konstantin/go/src/github.com/Konstantin8105/c4go-rating/testdata/book-c-the-examples-and-tasks/Глава 1/1.2/main.c", Line:9, LineEnd:0, Column:72, ColumnEnd:0, StringValue:""}, Type:"int", Value:65, ChildNodes:[]ast.Node{}}

goroutine 1 [running]:
github.com/Konstantin8105/c4go/transpiler.transpileUnaryExprOrTypeTraitExpr(0xc4202dcfa0, 0xc420314140, 0xc420472590, 0xc4204725a8, 0x7fe0f0, 0x0, 0xc420472540, 0x43c5b0, 0xc42063fb40, 0x7fe0f0, ...)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/transpiler/unary.go:637 +0x320
github.com/Konstantin8105/c4go/transpiler.transpileToExpr(0x7cb220, 0xc4202dcfa0, 0xc420314140, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7fe0f0, 0x0, ...)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/transpiler/transpiler.go:201 +0x35d
github.com/Konstantin8105/c4go/transpiler.transpileCallExpr(0xc42001ad20, 0xc420314140, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/transpiler/call.go:243 +0x5b3
github.com/Konstantin8105/c4go/transpiler.transpileToExpr(0x7c9ee0, 0xc42001ad20, 0xc420314140, 0xc420472a01, 0x0, 0x0, 0x0, 0x0, 0x7fe0f0, 0x0, ...)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/transpiler/transpiler.go:195 +0x96d
github.com/Konstantin8105/c4go/transpiler.transpileToStmt(0x7c9ee0, 0xc42001ad20, 0xc420314140, 0x0, 0x0, 0x7fe0f0, 0x0, 0x0, 0x7fe0f0, 0x0, ...)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/transpiler/transpiler.go:374 +0x24f
github.com/Konstantin8105/c4go/transpiler.transpileToStmts(0x7c9ee0, 0xc42001ad20, 0xc420314140, 0x7fe0f0, 0x0, 0x0, 0x0, 0x0)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/transpiler/transpiler.go:266 +0x13b
github.com/Konstantin8105/c4go/transpiler.transpileCompoundStmt(0xc4203fc930, 0xc420314140, 0xc420472d80, 0xc420472d98, 0x7ca020, 0xc4203fc930, 0x3, 0xc4200001a0, 0xc4201f3a00, 0xc420020000, ...)
	/home/konstantin/go/src/github.com/Konstantin8105/c4go/transpiler/scope.go:53 +0x61e
github.com/Konstantin8105/c4go/transpiler.transpileToStmt(0x7ca020, 0xc4203fc930, 0xc420314140, 0x0, 0x0, 0x7fe0f0, 0x0, 0x0, 0x7fe0f0, 0x0, ...)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.